2017-04-25 55 views
0

所以,问题不在于少见的,到目前为止我已经收集的问题负载关于它的了,不过,没有能够解决这个我自己Capistrano的+ sidekiq /无法挑环境变量

我有以下任务:

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 

任务正在内namespace :deploy do ... end主deploy.rb文件

由于我的数据库creds'在〜/ .profile中,sidekiq不能存储在远程计算机上称为运行的东西(我试图把这些环境变量〜/ .bashrc等等......可能已经存在或在发现的问题中命名的任何点文件......没有任何工作)。我几乎可以做任何事情。

显然,如果我在远程计算机上运行_very_相同的命令,而不是通过capistrano,那么一切正常。我结束了这个可怜的一个:

task :start do 
    run_locally do 
    %x(ssh [email protected]#{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...'没有这种问题明显;感谢一个大型的很多提前任何帮助

最佳

+0

您正在运行什么样的服务器? – DevJem

+0

我猜没有什么奇怪的,ubuntu 16.04 – Ben

回答

2

如果您正在运行Ubuntu,请将光标置于的顶部处,以便将其输出到~/.bashrc

下面是从一台机器运行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 [email protected] 2.131s 

对于其他Capistrano兼容的方法来将环境变量传递给Ruby进程,请参阅此答案:https://stackoverflow.com/a/39628182/4625365

+0

应该突出显示Capistrano文档使用bashrc(:!我昨天做过的问我最后在你的链接文章上,但我想我可能忘了简单地源码.bashrc ...无论如何,现在运行良好。 – Ben

0

我碰到的这个问题之前,这是因为Capistrano的使用非登录,非交互的shell。因此,当您部署应用程序时,它根本不触及.bash_rc或.profile文件,并且sidekiq将无法访问您的env vars。你可以找到更多关于那个in the Capistrano docs的信息。使用独角兽,我不得不把我的环境变量放在/etc/default/unicorn,所以我知道他们会来源。根据您使用的内容,您应该在部署应用时发现您知道的配置文件会被触及。

+0

是的,我已经检查了底部架构了;但仍然......就像你为独角兽做的那样,我可以把它们放在乘客里,或者像那样;但作为sidekiq开始作为一个副命令通过捆绑,我很不幸运,我没有看到很多在哪里设置 – Ben