Capistrano在部署服务器上从.env读取

时间:2014-05-29 22:09:43

标签: ruby environment-variables capistrano capistrano3 env

我正在尝试将数据库备份作为Capistrano(v3)部署脚本(对于NON-Rails应用程序)的一部分执行。

该脚本工作正常 - 如果我将数据库配置硬编码到其中。

现在我想从.env文件加载数据库配置。在我的本地计算机上,我的.env文件(在Capfile旁边的repo根目录中)如下所示:

DB_NAME='local_name'
DB_USER='local_user'
DB_PASSWORD='local_pw'
DB_HOST='127.0.0.1'

在服务器上,.env文件(Capistrano已放置在shared文件夹中并从current文件夹中删除)如下所示:

DB_NAME='dev_name'
DB_USER='dev_user'
DB_PASSWORD='dev_pw'
DB_HOST='127.0.0.1'

但是,在运行cap deploy时,我会得到以下结果:

INFO [292e2535] Running /usr/bin/env mysqldump -u local_user --password='local_pw' --databases local_name -h 127.0.0.1 | bzip2 -9 > /var/www/vhosts/xxxxx/backups/database_local_name_2014-05-29_22:52:07.sql.bz2 on <server>

即。它正在使用我的本地.env文件,实际上我希望它加载服务器上存在的.env文件。如果可能的话,我不希望我的所有团队都必须管理单独的.env.production文件!

我的脚本的相关部分如下(使用Dotenv gem):

require 'dotenv'
Dotenv.load '.env'
username, password, database, host = ENV['DB_USER'], ENV['DB_PASSWORD'], ENV['DB_NAME'], ENV['DB_HOST']

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

您可以使用Dotenv::Parser.call(string)。我正在使用Capistrano 2.14(这是旧版本!)

desc <<-desc
  ENV test
desc
task :test do
  text = capture "cat #{shared_path}/.env"
  ENV2 = Dotenv::Parser.call(text)
  puts ENV2['DB_NAME']
end

答案 1 :(得分:0)

在Capistrano 3下,我需要修复KrisztiánFerenczi的答案

task :load_remote_environment do
  on roles(:app) do
    set :default_environment, Dotenv::Parser.call(capture("cat #{shared_path}/.env"))
  end
end
after 'deploy:set_current_revision', 'load_remote_environment'

在Capfile中

require 'dotenv'
相关问题