capistrano + sidekiq / 无法选择环境变量
capistrano + sidekiq / unable to pick environments variables
所以这个问题并不少见,到目前为止我已经收集了大量关于它的问题,但我仍然无法自己解决这个问题
我有以下任务:
namespace :sidekiq do
task :start do
on roles(:app), in: :sequence, wait: 5 do
within release_path do
as :deploy do
with rails_env: fetch(:rails_env) do
execute :bundle, "exec sidekiq -e production -C ./config/sidekiq.yml -L ./log/sidekiq.log -d"
end
end
end
end
end
end
正在 deploy.rb 主文件 namespace :deploy do ... end
中调用任务
由于我的数据库信用存储在远程机器的 ~/.profile 中,sidekiq 无法 运行 东西(我试图将这些环境变量放在 ~/.bashrc 等......无论什么点文件可能在发现的问题中存在或命名……没有任何效果)。我几乎做了所有可能的事情。
显然,如果我 运行 在远程机器上执行 _very_ 相同的命令,而不是通过 capistrano,则一切正常。我最终得到了这个可怜的人:
task :start do
run_locally do
%x(ssh deploy@#{fetch(:application)} 'cd /var/www/#{fetch(:application)}/current && /home/xx/.rvm/bin/rvm 2.4.0 do bundle exec sidekiq -e production -C /var/www/#{fetch(:application)}/current/config/sidekiq.yaml -L /var/www/#{fetch(:application)}/current/log/sidekiq.log -d')
end
end
就是说,如果对于一些使用常规 execute :bundle, '...sidekiq startup cmd...'
而没有此类问题的人来说,这个错误听起来很明显;非常感谢您的帮助
最佳
我以前 运行 遇到过这个问题,这是因为 capistrano 使用非登录、非交互 shell。因此,当您部署应用程序时,它根本不会触及 .bash_rc 或 .profile 文件,sidekiq 将无法访问您的环境变量。您可以找到有关该 in the Capistrano docs 的更多信息。使用 Unicorn,我必须将我的环境变量放在 /etc/default/unicorn
中,这样我就知道它们会被获取。根据您使用的内容,您应该找到您知道在部署应用程序时会触及的配置文件。
如果您运行正在Ubuntu,您应该能够通过将环境变量放在最顶部来导出环境变量~/.bashrc
.
这是机器 运行ning Ubuntu 14.04:
的示例
# ~deployer/.bashrc
export HELLO=world
为了演示,我有一个简单打印环境的 Capistrano 任务:
task :env do
on roles(:all) do
execute "env"
end
end
而当我 运行 它时,你可以看到 HELLO=world
确实在预期的环境中:
$ cap production env
00:00 env
01 env
01 XDG_SESSION_ID=328
01 SHELL=/bin/bash
01 HELLO=world
01 SSH_CLIENT=xx.xx.xx.xx 16582 22
01 USER=deployer
01 SSH_AUTH_SOCK=/tmp/ssh-Twu5TDVnXb/agent.32558
01 MAIL=/var/mail/deployer
01 PATH=/home/deployer/.rbenv/shims:/home/deployer/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/b…
01 PWD=/home/deployer
01 LANG=en_US.UTF-8
01 RBENV_SHELL=bash
01 SHLVL=1
01 HOME=/home/deployer
01 LOGNAME=deployer
01 SSH_CONNECTION=xx.xx.xx.xx 16582 xx.xx.xx.xx 22
01 XDG_RUNTIME_DIR=/run/user/1000
01 _=/usr/bin/env
✔ 01 deployer@xx.xx.xx.xx 2.131s
有关将环境变量传递给 Ruby 进程的其他与 Capistrano 兼容的方法,请参阅此答案:
所以这个问题并不少见,到目前为止我已经收集了大量关于它的问题,但我仍然无法自己解决这个问题
我有以下任务:
namespace :sidekiq do
task :start do
on roles(:app), in: :sequence, wait: 5 do
within release_path do
as :deploy do
with rails_env: fetch(:rails_env) do
execute :bundle, "exec sidekiq -e production -C ./config/sidekiq.yml -L ./log/sidekiq.log -d"
end
end
end
end
end
end
正在 deploy.rb 主文件 namespace :deploy do ... end
中调用任务
由于我的数据库信用存储在远程机器的 ~/.profile 中,sidekiq 无法 运行 东西(我试图将这些环境变量放在 ~/.bashrc 等......无论什么点文件可能在发现的问题中存在或命名……没有任何效果)。我几乎做了所有可能的事情。
显然,如果我 运行 在远程机器上执行 _very_ 相同的命令,而不是通过 capistrano,则一切正常。我最终得到了这个可怜的人:
task :start do
run_locally do
%x(ssh deploy@#{fetch(:application)} 'cd /var/www/#{fetch(:application)}/current && /home/xx/.rvm/bin/rvm 2.4.0 do bundle exec sidekiq -e production -C /var/www/#{fetch(:application)}/current/config/sidekiq.yaml -L /var/www/#{fetch(:application)}/current/log/sidekiq.log -d')
end
end
就是说,如果对于一些使用常规 execute :bundle, '...sidekiq startup cmd...'
而没有此类问题的人来说,这个错误听起来很明显;非常感谢您的帮助
最佳
我以前 运行 遇到过这个问题,这是因为 capistrano 使用非登录、非交互 shell。因此,当您部署应用程序时,它根本不会触及 .bash_rc 或 .profile 文件,sidekiq 将无法访问您的环境变量。您可以找到有关该 in the Capistrano docs 的更多信息。使用 Unicorn,我必须将我的环境变量放在 /etc/default/unicorn
中,这样我就知道它们会被获取。根据您使用的内容,您应该找到您知道在部署应用程序时会触及的配置文件。
如果您运行正在Ubuntu,您应该能够通过将环境变量放在最顶部来导出环境变量~/.bashrc
.
这是机器 运行ning Ubuntu 14.04:
的示例# ~deployer/.bashrc
export HELLO=world
为了演示,我有一个简单打印环境的 Capistrano 任务:
task :env do
on roles(:all) do
execute "env"
end
end
而当我 运行 它时,你可以看到 HELLO=world
确实在预期的环境中:
$ cap production env
00:00 env
01 env
01 XDG_SESSION_ID=328
01 SHELL=/bin/bash
01 HELLO=world
01 SSH_CLIENT=xx.xx.xx.xx 16582 22
01 USER=deployer
01 SSH_AUTH_SOCK=/tmp/ssh-Twu5TDVnXb/agent.32558
01 MAIL=/var/mail/deployer
01 PATH=/home/deployer/.rbenv/shims:/home/deployer/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/b…
01 PWD=/home/deployer
01 LANG=en_US.UTF-8
01 RBENV_SHELL=bash
01 SHLVL=1
01 HOME=/home/deployer
01 LOGNAME=deployer
01 SSH_CONNECTION=xx.xx.xx.xx 16582 xx.xx.xx.xx 22
01 XDG_RUNTIME_DIR=/run/user/1000
01 _=/usr/bin/env
✔ 01 deployer@xx.xx.xx.xx 2.131s
有关将环境变量传递给 Ruby 进程的其他与 Capistrano 兼容的方法,请参阅此答案: