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のサンプル
pipeline {
environment {
USER_CREDENTIAL = credentials('$hoge_credential')
}
}
こうなります。
Capistranoから環境変数をリモートへ送る
Jenkinsfileの中で参照できましたのでCapistranoからもENVとして参照できます。
先程のUSER_CREDENTIALで書くと、
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
となります。