以前、 Azure CLIコマンドをdocker runと同時に実行して、実行が終わったらコンテナを破棄する という記事を書いて、Azure CLIをDockerイメージ化しました。
このDockerイメージを使って、JenkinsからVMの起動/停止をしたかったんですが、AzureサービスプリンシパルのTokenやアプリケーションIDをどうやって隠蔽しようか悩みました。
Jenkins Secret Textが非常に使い勝手が良かったので紹介したいと思います。
Azureを例にしてますが、この仕組みはなんにでも使えます。
環境
- Jenkins : 2.150.1
Azure CLI Dockerイメージ実行方法
- 以下のようなコマンドレットで実行します。
$ docker run --rm -e AZURE_APPLICATION_ID=[Your Application ID] \
-e AZURE_SECRET=[Your Secret] \
-e AZURE_TENANT_ID=[Your Tenant ID] \
-e CMD="/usr/local/bin/az vm start -g [ResourceGroup] -n [VM Name]" azurecli:v1.0
ここのSecretとかをどうにか隠蔽したいですね。
Jenkins環境変数で可能では?
Jenkinsジョブからはいきなり${AZURE_SECRET}といった形で利用できるので非常に便利ですが、2つ問題点がありました。
- Jenkinsを複数人で利用している場合、誰でもキーが使える上に設定値が丸見え
- ジョブ実行後のコンソール出力に設定値が丸見え
ということでこのやり方は不採用
Jenkins認証情報
Jenkins認証情報を活用することで先程の2つの問題点が解消できました。
それぞれどのように対策したか見ていきます。
Jenkinsを複数人で利用している場合、誰でもキーが使える上に設定値が丸見え
-
これでこの3つのSecretはこのフォルダに紐付いた認証情報ということになりました。
-
Role-based Authorization Strategyプラグイン を使い、このフォルダにアクセス可能な人を絞ることで、誰でもキーが使えるという問題点が解決しました。