Travis CI:失败是因为找不到执行本地 bash 可执行文件,但它肯定在这里



My 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的本地副本,它是一个Javajar文件,执行方式如下:

`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为本地可执行文件设置权限?

我也试着像有人在评论中建议的那样,将tidy放入bin,但这似乎也没有改变什么。

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

两件事:

生成程序时,环境通常与当前环境不同,因此您必须检查环境是什么。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-典当

最新更新