在我的代码中,我有以下块
Tempfile.open([model.id.to_s, '.txt'], Rails.root.join('tmp')) do |file|
begin
file << somedata_i_have_before
model.file = file # using paperclip gem attached file
ensure
# close and delete file
file.close
file.unlink
end
end
此代码在本地和生产中运行良好...问题是我已经设置了Wercker应用程序来自动化测试和部署,但上面提到的块在wercker上失败并返回以下错误
Errno::ENOENT:
No such file or directory @ rb_sysopen - /pipeline/build/tmp/539e01d4776572049647010020140615-1174-ajp5tf.txt
# ./lib/some_lib.rb:63:in `some_method'
任何想法如何解决这个问题,以便wercker的构建通过?
答案 0 :(得分:3)
我想tmp文件夹在您的存储库中被忽略(.gitignore),因此在您执行干净的存储库克隆时不会创建它。
我可能错了,但Tempfile.open([model.id.to_s, '.txt'], Rails.root.join('tmp'))
没有创建tmp文件夹,它预计它已经存在。
我对被忽略的文件夹有类似的问题 - 您可以使用干净的git clone进行测试,然后执行此测试,因为它将在CI / CD服务器上运行。
答案 1 :(得分:1)
问题是wercker没有创建tmp
,为了解决这个问题,只需将以下步骤添加到wercker.yml
(运行规范之前)
- script:
name: create and grant writing permission to /tmp directory
code: |
mkdir $WERCKER_ROOT/tmp
chmod -R 755 $WERCKER_ROOT/tmp
echo "$(ls -l $WERCKER_ROOT)"
# A step that executes `rspec` command
- script:
name: rspec
code: bundle exec rspec
并确保ls -l $WERCKER_ROOT
包含以下内容
drwxr-xr-x 2 ubuntu ubuntu 4096 Jun 15 22:39 tmp
解决此问题的另一种方法是创建tmp/.gitkeep
并将其提交到您的回购...这也将解决问题(这是一个更清洁的解决方案)