Capistranoで実行元の環境変数をデプロイ先へ送るにはどうすれば良いか?
direnv
でAccess token
をセットして使うなどはAWS CLI
の常套手段だったりします。
また環境変数にUser credentialを保持させるのはわりとある手段です。
Credentialには username
, password
, access token
, ... と沢山あります。
これをデプロイ先でも使いたい場合のお話です。
Jenkins User Handbookを読む
Jenkins User Handbook にドンピシャに書いてあったりします。
これでpipeline
-stage
-steps
の中で参照できます。
このセクションにはもうひとつのやり方が記述されています。
JenkinsにCredential情報を持たせることができますよね。(GUIで操作するヤツです)
アレを参照できるんです。
Usernames and passwords - Using a Jenkinsfile
ただちょっとトリッキーなので解説。
-
hoge_credential
として登録します -
Jenkinsfile
に使うように指示を追加します。 - 参照する時
- user:
USER_CREDENTIAL_USR
- password:
USER_CREDENTIAL_PSW
Jenkinsfile
のサンプル
Jenkinsfile
pipeline {
environment {
USER_CREDENTIAL = credentials('$hoge_credential')
}
}
こうなります。
Capistranoから環境変数をリモートへ送る
Jenkinsfile
の中で参照できましたのでCapistrano
からもENV
として参照できます。
先程のUSER_CREDENTIAL
で書くと、
deploy.rb
namespace :deploy do
tasks :sample-task do
on roles(:app) do
with hoge_user: ENV['USER_CREDENTIAL_USR'] do
with hoge_passwd: ENV['USER_CREDENTIAL_PSW'] do
capture(:echo, '--user=$HOGE_USER', '--password=$HOGE_PASSWD')
end
end
end
end
end
となります。