muraveです。
なうなやんぐはPipelineでJenkinsFileを使ってビルドについてもソースコード管理ですよねー、ということで試してみているんですが、ユーザー名やパスワードをJenkinsFile内に書くわけにはいかないわけで。
方法を探してみたところ withCredentials でどうにか出来そうでした。
Fetch a userid and password from a Credential object in a Pipeline job.
ここを見ながらザックリと Pipeline script なジョブを作成して動作を確認しようとしたところ、少々ハマリました。
テスト用にユーザー名test、パスワードpassword、credentialsIdがtestの認証情報を作成しています。
node {
stage 'withCredentials Test'
withCredentials([[$class: 'UsernamePasswordMultiBinding',
credentialsId: 'test',
usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
sh 'echo uname=$USERNAME pwd=$PASSWORD'
}
}
これを実行したログを確認すると
[credential_****] Running shell script
+ echo uname=**** pwd=****
みたいな表示。うーん。何か権限的に引っかかってるのか、表示が潰されているだけなのかがわかりません。
結論を先に言うとユーザー名、パスワードについて表示を****で潰すようになっているようです。
あとで気づいたのですが[credential_****]のところもジョブ名がcredential_testなのでユーザー名であるtestが潰されているのでした。
ではユーザー名、パスワードが本当に取れているのかをどのように確認したのか?ですが次のような Pipeline script を作成しました。
node {
stage 'withCredentials Test'
def uname //withCredentials外にUSERNAMEを持ち出す為に使用
withCredentials([[$class: 'UsernamePasswordMultiBinding',
credentialsId: 'test',
usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
sh 'echo uname=$USERNAME pwd=$PASSWORD > idpw.txt'
sh 'pwd' //ワークスペースの位置確認をしたかったのだが、しかし
println(env.USERNAME) //groovyでの扱い
uname = env.USERNAME //withCredentials外にUSERNAMEを持ち出す
}
stage 'withCredentialsの外で出力'
println(uname)
stage 'ワークスペースの位置確認'
sh 'pwd'
}
実際に行ったのはidpw.txtファイルにリダイレクトして内容を確認でしたが、その際の謎動作の説明のための処理や、その後にログ上で確認できないかな?と思ってやってみたことも混ぜてあります。
ログから抜粋してまとめると以下のようになります。
Entering stage withCredentials Test
Proceeding
[credential_****] Running shell script
+ echo uname=**** pwd=****
[credential_****] Running shell script
+ pwd
/var/jenkins_home/workspace/credential_****
****
Entering stage withCredentialsの外で出力
Proceeding
test
Entering stage ワークスペースの位置確認
Proceeding
[credential_test] Running shell script
+ pwd
/var/jenkins_home/workspace/credential_test
idpw.txtの位置が知りたくてpwdしているのですがwithCredentialsのブロック内で実行すると
[credential_****] Running shell script
+ pwd
/var/jenkins_home/workspace/credential_****
と、ユーザー名のtestと同じだったために一部マスキングされてしまっています。まぁ、大体の位置は予想がついたのでidpw.txtを探して内容確認はできたわけですが(ちゃんとユーザー名、パスワードが出力されていました)。
最後にブロック外でpwdしてみるとちゃんと
Entering stage ワークスペースの位置確認
Proceeding
[credential_test] Running shell script
+ pwd
/var/jenkins_home/workspace/credential_test
と出力されているのがわかります。
ログだけでの動作確認ですがブロック外ならマスキングされないのがわかったのでuname変数を定義して外に持ちだしてやればいいかな〜と
Entering stage withCredentialsの外で出力
Proceeding
test
やはりマスキングされずに出力されました。動作の確認はできましたが、これは通常はやってはいけないパターンですね。
以上です。
タグ: Jenkins