Capistrano和环境变量

Rah*_*har 42 capistrano ruby-on-rails environment-variables capistrano3

我已经切换到使用环境变量进行配置,它运行得很好 - 除非我必须使用capistrano部署或运行​​任务.

Capistrano 3似乎执行每个命令前缀,/usr/bin/env它会删除我设置的任何环境变量.bashrc.

编辑 - 在进行更多的研究时,这可能不是问题,问题可能是因为capistrano作为非登录,非交互式shell执行而且不加载.bashrc.bash_profile.但仍然陷入困境.

当capistrano执行任务时,确保设置环境变量的最佳方法是什么?

Ric*_*eck 50

你可能最好看看之间区别ENVIRONMENT VARIABLESSHELL VARIABLES

当您启动SSH时,您的应用程序将加载您.bashrc文件中定义的SHELL变量.这些只存在于shell的生命周期中,因此,我们不会像ENVvars 一样使用它们

你可能会更好地将ENV变量放入:

/etc/environment
Run Code Online (Sandbox Code Playgroud)

像这样:

export ENVIRONMENT_VAR=value
Run Code Online (Sandbox Code Playgroud)

这将使变量在整个系统中可用,而不仅仅是在不同的shell会话中


更新

你有没有尝试过

Capistrano:我可以为整个上限会话设置一个环境变量吗?

set :default_env, { 
  'env_var1' => 'value1',
  'env_var2' => 'value2'
}
Run Code Online (Sandbox Code Playgroud)

  • 啊,似乎capistrano3使用`default_env`,而不是`default_environment`(https://github.com/capistrano/capistrano/pull/564).这似乎有效.不太理想,但它对我有用:) (4认同)

Del*_*eko 48

虽然已经回答了这个问题,但我将把它留在这里以防万一其他人处于同样的情况.

Capistrano 确实加载.bashrc.但是如果您注意到文件的顶部有这样的:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Run Code Online (Sandbox Code Playgroud)

解决方案只是将任何设置置于此之上,而Capistrano就是我想要的.

这个GitHub问题上也注意到了这个解决方案.

  • 这真的应该是公认的答案. (3认同)
  • 工作就像一个魅力,比上述解决方案复杂. (2认同)

Tom*_*art 16

为了config/deploy.rb使用简单的任务调试问题更新:

namespace :debug do
  desc 'Print ENV variables'
  task :env do
    on roles(:app), in: :sequence, wait: 5 do
      execute :printenv
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在运行cap staging debug:env.您应该能够看到ENV变量的有效配置.

文件的顺序和名称取决于您的发行版,例如在Ubuntu上的采购顺序如下:

  1. /etc/environment
  2. /etc/default/locale
  3. /etc/bash.bashrc
  4. ~/.bashrc

~/.bashrc包含这样的第一行时,之后的任何代码都不会被获取:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Run Code Online (Sandbox Code Playgroud)

要了解如何capistrano加载ENV变量,此图表()可能会有所帮助.

~/.bash*由于非交互式会话,很可能未加载该文件.

capistrano env变量加载