どうやるのが最善というか一般的なのかまだ分かってない。とりあえず動いた方法を自分用メモ。
やりたいこと。
この記事で行った下記コマンドを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
ってファイルに環境変数を書いておくと自動で読み込んでくれるそうな。
Gemfile
にgem '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環境で使うなっつー記述もあるなぁ。
どーするのがいいやら。