我已经配置了一个生产环境,它可以正常部署和工作。虽然我遇到了一个我不能解决的辅助问题。
每当我运行gem来执行两个cron作业时,只要gem capistrano实现正确地部署了它们,并且脚本正在执行。尽管在whenever.log内部,我收到了以下输出:
/bin/bash: bin/rails: Permission denied
该脚本使用runner从RSS提要进行更新,虽然我使用Capistrano将其部署到新服务器,但在以前的生产部署中没有发生任何意外。
我到处寻找并找到了这个question,尽管每次我部署时,我都必须使bin/rails可执行(由于来自Capistrano的日期戳部署)。有没有办法让Capistrano在部署时让我的文件成为可执行文件?或者,让bin/rails成为可执行文件是否存在一些固有的安全风险?
发布于 2014-08-26 09:11:46
我能够通过以下方式解决我的问题(为简洁起见,包含了名称空间和重启):
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:app), in: :sequence, wait: 5 do
# Passenger restart mechanism
execute :mkdir, '-p', "#{ release_path }/tmp"
execute :touch, current_path.join('tmp/restart.txt')
end
end
after :publishing, :restart
after :restart, :x_bin_rails do
on roles(:web), in: :groups, limit: 3, wait: 10 do
within release_path do
execute :chmod, "u+x bin/rails"
end
end
end
end
发布于 2016-11-23 00:49:05
因此,我的解决方案是将bin/文件夹设置为共享文件夹
#config/deploy.rb
set :linked_dirs, fetch(:linked_dirs, []).push('bin')
然后,在您的下一次部署中,bin/文件夹将符号链接到shared/bin
您只需转到此目录一次,将可执行文件从以前的发行版中移出
cp /your_deploy_path/releases/PREV_RELEASE/bin/* /your_deploy_path/shared/bin
..。并确保你的chmod ug+x shared/bin/*
同样在我的例子中,我是在AmazonEC2-linux机器上运行的,由于某些原因,bin文件是使用ruby.exe
而不仅仅是ruby
生成的。如果你没有运行Windows,请确保你检查这些文件并删除.exe
扩展名。
编辑-我不再确定之前的答案,因为每当我使用rails + capistrano +进行设置时,都会遇到bug。然而,以下代码确实适用于3.6.1以上的Rails5+ Capistrano
bin
(这与我的原始解决方案相反),然后在deploy.rb
中添加额外的行设置:bundle_binstubs,nil
有关参考,请参阅this SO
https://stackoverflow.com/questions/25495102
复制相似问题