2017-04-25 2 views
0

Le problème est donc pas rare que jusqu'à présent, je aurais pu rassemblé des tas de questions à ce sujet, mais encore, sans être en mesure de résoudre cela sur mon propreCapistrano + sidekiq/incapable de choisir les variables environnements

I avait la tâche suivante:

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 

la tâche est appelée dans namespace :deploy do ... end dans le fichier principal deploy.rb

Comme ma base de données creds' sont stockés sur la machine distante dans ~/.profile, ne parvient pas à sidekiq exécuter des choses (j'ai essayé de mettre ces env vars dans ~/.bashrc, etc ... quels que soient les fichiers point qui auraient pu être présents ou nommés dans les problèmes trouvés ... rien n'a fonctionné). J'ai presque tout fait possible.

De toute évidence, si je lance la même commande _very_ sur la machine distante et non via Capistrano, tout fonctionne parfaitement. J'ai fini avec ce pauvre:

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 

Cela dit, si l'erreur semble évident pour certains qui utilisent un execute :bundle, '...sidekiq startup cmd...' régulier sans ce genre de question; merci beaucoup méga à l'avance pour toute aide

Meilleur

+0

Quel type de serveur utilisez-vous? – DevJem

+0

Je suppose que rien d'étrange, Ubuntu 16.04 – Ben

Répondre

2

Si vous utilisez Ubuntu, vous devriez simplement pouvoir exporter les variables d'environnement en les plaçant au tout en haut de ~/.bashrc.

Voici un exemple d'une machine exécutant Ubuntu 14.04:

# ~deployer/.bashrc 
export HELLO=world 

Pour démontrer, j'ai une tâche Capistrano qui imprime simplement l'environnement:

task :env do 
    on roles(:all) do 
    execute "env" 
    end 
end 

Et quand je le lance, vous pouvez voir que HELLO=world est en effet dans l'environnement comme prévu:

$ 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 

Pour d'autres manières Capistrano de passer des variables d'environnement à un processus Ruby, voir la réponse suivante: https://stackoverflow.com/a/39628182/4625365

+0

Devrait être mis en évidence sur les docs capistrano pour utiliser bashrc (:! Ce que j'avais fait hier auparavant demandant comme je me suis retrouvé sur votre poste lié.Mais je suppose que je pourrais avoir oublié de simplement source.bashrc ... de toute façon cela fonctionne bien maintenant. – Ben

0

J'ai rencontré ce problème avant, et il est parce que Capistrano utilise un non-login, shell non-interactif. Par conséquent, lorsque vous déployez votre application, elle ne touche pas du tout les fichiers .bash_rc ou .profile, et sidekiq n'aura pas accès à vos variables d'environnement. Vous pouvez trouver plus d'informations à ce sujet in the Capistrano docs. En utilisant Unicorn, j'ai dû placer mes vars d'env dans /etc/default/unicorn ainsi je savais qu'ils seraient source. En fonction de ce que vous utilisez, vous devriez trouver le fichier de configuration que vous savez être touché lorsque vous déployez votre application.

+0

Oui, j'avais vérifié ce schéma inférieur; mais encore ... Comme vous l'avez fait pour la licorne, je pourrais les placer dans le passager, ou comme; mais comme sidekiq commence comme une commande de côté via bundle, je n'ai pas vraiment de chance, et je ne vois pas trop où les mettre – Ben