Тест Веркера не может открыть временные файлы
В моем коде у меня есть следующий блок
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 прошла?
2 ответа
Я предполагаю, что папка tmp игнорируется (.gitignore) в вашем репозитории, и поэтому она не будет создана при чистом клоне репозитория.
Я могу ошибаться но Tempfile.open([model.id.to_s, '.txt'], Rails.root.join('tmp'))
не создает папку tmp, она ожидает, что она уже существует.
У меня были похожие проблемы с игнорируемыми папками - вы можете протестировать его с помощью чистого git-клона, а затем выполнить этот тест, как если бы он работал на сервере CI/CD.
Проблема заключалась в том, что 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
и передайте его в репозиторий... это также решит проблему (что является более чистым решением)