当我尝试使用Capistrano进行部署时,它会获得资产:预编译,我收到此消息:
01:08 deploy:assets:precompile
01 ~/.rvm/bin/rvm default do bundle exec rake assets:precompile
01 rake aborted!
01 Devise.secret_key was not set. Please add the following to your Devise initializer:
01
01 config.secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
01
01 Please ensure you restarted your application after installing Devise or setting the key.
我不想将我的密钥添加到devise.rb中,因为我不想在版本控制中使用它。我正在为secret_key_base使用一个环境变量,Devise.secret_key应该依赖它。事实上,当我进入服务器时,手动导航到失败的版本并进入rails控制台,我发现Devise.secret_key
工作正常。似乎唯一一次它不起作用是在Capistrano部署期间。
编辑:我也可以通过ssh手动运行bundle exec rake assets:precompile
。问题似乎是Capistrano,但我的环境变量在/ etc / environment中,所以应该加载它们。
答案 0 :(得分:0)
<强>原因强>
Capistrano使用non-login
,non-interactive
shell模式,它不会加载环境变量。
当您ssh
服务器时,它会使用login
,interactive
shell模式,这会加载您的环境变量
<强>解决方案强>
使用其他方式设置环境变量。我经常使用Figaro,它适用于Capistrano。
为防止敏感信息包含在Git中,请将config/application.yml
添加到Capistrano的linked_files
,并将正确的敏感信息填写到服务器上的<shared directory>/config/application.yml
答案 1 :(得分:0)
您需要在capistrano生产文件中声明ENV变量。 在计算机(或计算机或调用部署的虚拟机)上设置env变量,然后将以下代码添加到capistrano生产文件中。
在config / deploy / production.rb 中set :default_env, {
"SECRET_KEY_BASE" => ENV['PRODUCTION_SECRET_KEY'],
....
}
使用capistrano时,你应该总是设置这样的env变量,因为有时候取决于你设置capistrano的方式,服务器上的env变量不起作用,你可能会使用不同的用户来部署,或者你可能是使用rbenv或rvm。无论是什么原因,这是使用capistrano时设置env变量的最佳方法。而且您不必在服务器上设置它们或将它们保留在版本控制中。