【问题标题】:Travis CI: Failing because executing a local bash executable isn't found, but it's definitely hereTravis CI:失败,因为找不到执行本地 bash 可执行文件,但它肯定在这里
【发布时间】:2014-02-15 16:59:03
【问题描述】:

我的 gem 使用 Tidy HTML Validator 的本地副本。它在lib/tidy/tidy 中可用。我的测试在本地运行完美,但是在 Travis CI 上,我收到了 Tidy 找不到的错误。

Errno::ENOENT:
No such file or directory - tidy

代码如下所示:

stdin, stdout, stderr = Open3.popen3('tidy -quiet')

是否有限制或阻止执行本地可执行文件的东西?我还调用了 Jigsaw CSS Validator 的本地副本,它是一个 Java jar 文件,执行方式如下:

`java -jar css-validator.jar --output=soap12 file:#{uri}`

这在 Travis CI 上完美运行。 Open3会不会有问题?

这里是 GitHub 存储库的链接:https://github.com/jmuheim/headhunter 这是失败的 Travis CI 构建的链接:https://travis-ci.org/jmuheim/headhunter

更新

我已将执行外部java 可执行文件的代码重写为也使用Open3,它正在工作。所以问题与tidy有关。

为了进一步调试,我已将tidy 重命名为tidy2(以确保调用了真正需要的可执行文件),并在调用它之前添加了手册File.exist? 'tidy',因此如果它不能调用它会引发错误找不到。

  Dir.chdir(VALIDATOR_DIR) do
    raise "Could not find tidy in #{Dir.pwd}" unless File.exists? EXECUTABLE

    # Docs for Tidy: http://tidy.sourceforge.net/docs/quickref.html
    stdin, stdout, stderr = Open3.popen3("#{EXECUTABLE} -quiet")
    # ...
  end

文件肯定找到了,但是执行还是会出现这个错误。

 1) Headhunter::HtmlValidator#validate returns a local response when calling the validator succeeds
 Failure/Error: subject.validate('invalid.html', read_file('html_validator/invalid.html'))
 Errno::ENOENT:
   No such file or directory - tidy2
 # ./lib/headhunter/html_validator.rb:20:in `block in validate'
 # ./lib/headhunter/html_validator.rb:16:in `chdir'
 # ./lib/headhunter/html_validator.rb:16:in `validate'
 # ./spec/lib/headhunter/html_validator_spec.rb:9:in `block (4 levels) in <top (required)>'
 # ./spec/lib/headhunter/html_validator_spec.rb:8:in `block (3 levels) in <top (required)>'

所以我现在唯一能猜到的就是权限问题吗?有没有办法使用 Travis CI 设置本地可执行文件的权限?

我还尝试像 cmets 中有人建议的那样将 tidy 放入 bin,但这似乎也没有改变任何事情。

【问题讨论】:

  • 您可能需要指定可执行文件Open3.popen3('lib/tidy/tidy -quiet')的绝对路径
  • 将您的tidy bin 放入 gem 的 bin/ 文件夹中。
  • 我已经添加了有关该问题的更多信息。可能是权限问题?

标签: ruby executable executable-jar execution travis-ci


【解决方案1】:

看起来您的 tidy2 可执行文件是用于 OS X 的 Mach-O 二进制文件,但 Travis 工作程序运行 Linux。尝试从http://tidy.sourceforge.net/#binaries 中包含一个合适的 ELF 二进制文件。

【讨论】:

  • 谢谢,这听起来很合理。我会尽快看看。
【解决方案2】:

几件事:

在生成程序时,环境通常与您当前的环境不同,因此您必须检查环境是什么。 cronmonit 和一些 ruby​​ 方法调用就是这种情况。

在您的情况下,对于 Open,它使用 Process.spawn,因此您不能保证在自己的目录中。 Open.popen3 采用 :chdir 选项,因此将其设置为您的 Dir.pwd 看看会发生什么。

您也可以尝试只使用绝对路径。

来源

http://ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3

https://stackoverflow.com/a/5917927/463225

http://ruby-doc.org/core-1.9.3/Process.html#method-c-spawn

【讨论】:

  • 这很有趣。虽然我很确定 inz 的答案是正确的,但这个答案也有一些非常有用的提示。一旦我尝试了你们的建议,我会尽快回复你们。
猜你喜欢
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2016-02-11
  • 2019-11-02
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多