2

在我的代码中,我有以下块

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 上的构建通过?

4

2 回答 2

3

我猜 tmp 文件夹在您的存储库中被忽略(.gitignore),因此在您执行干净的存储库克隆时不会创建它。

我可能错了,但Tempfile.open([model.id.to_s, '.txt'], Rails.root.join('tmp'))没有创建 tmp 文件夹,它希望它已经存在。

我在忽略文件夹时遇到了类似的问题 - 您可以使用干净的 git clone 对其进行测试,然后像在 CI/CD 服务器上运行一样执行此测试。

于 2014-06-16T09:33:31.333 回答
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并将其提交到您的回购......这也将解决问题(这是一个更清洁的解决方案)

于 2014-06-16T10:01:05.590 回答