naichi's lab

3日後の自分(他人)への書き置き

capistranoを使ってunicorn起動前に環境変数をセットする

どうやるのが最善というか一般的なのかまだ分かってない。とりあえず動いた方法を自分用メモ。

やりたいこと。

blog.naichilab.com

この記事で行った下記コマンドをcapistranoでのデプロイ時に自動で行いたい。

$export SECRET_KEY_BASE=`bundle exec rake secret`

やったこと

capistrano3ではcaptureって関数を使えば実行結果を変数に入れられるみたい。

bundle exec rake secretの結果を変数に入れて exportしてみた。

capistranoのdeploy.rbのrestartタスクにこんな感じで書いてみた。(これはうまくいかなかった)

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    on roles(:app) do
      within current_path do
        if test("[ -e #{fetch(:unicorn_pid)} ]")
          execute :kill, "-s QUIT ", pid
        end
        secret = capture :bundle, "exec rake secret"
        execute "export SECRET_KEY_BASE=" + secret
        execute :bundle, "exec unicorn", "-c", fetch(:unicorn_config_path), "-E", fetch(:rails_env), "-D"
      end
    end
  end
end

別の方法で環境変数のセットできないかな。

やったこと2

いろいろ調べたらdotenvってgemが便利そう。

.envってファイルに環境変数を書いておくと自動で読み込んでくれるそうな。

  • Gemfilegem 'dotenv-rails' を追加。
  • .gitignore.env 追加。

あとは.envに環境変数を書き込む操作をcapistranoタスクにやらせてみる。

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    on roles(:app) do
      within current_path do
        if test("[ -e #{fetch(:unicorn_pid)} ]")
          execute :kill, "-s QUIT ", pid
        end
        secret = capture :bundle, "exec rake secret"
        execute "echo SECRET_KEY_BASE='#{secret}' > #{current_path}/.env"
        execute :bundle, "exec unicorn", "-c", fetch(:unicorn_config_path), "-E", fetch(:rails_env), "-D"
      end
    end
  end
end

これで動いた。けどこれでいいのか・・・?

きになる

dotenvをproduction環境で使うなっつー記述もあるなぁ。

t-cyrill.hatenablog.jp

どーするのがいいやら。