JenkinsのSecret Textを使ってAzure API Keyを隠蔽しつつazコマンドを実行する

以前、 [Azure CLIコマンドをdocker runと同時に実行して、実行が終わったらコンテナを破棄する](https://qiita.com/shingo_kawahara/items/685313f4dbc0b8de60e2) という記事を書いて、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の管理]→[システムの設定]→[グローバルプロパティ]から環境変数を設定できます。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/eff6ded7-4272-4470-cf1e-a22ecfbe3bde.png)

Jenkinsジョブからはいきなり${AZURE_SECRET}といった形で利用できるので非常に便利ですが、2つ問題点がありました。

* Jenkinsを複数人で利用している場合、誰でもキーが使える上に設定値が丸見え
* ジョブ実行後のコンソール出力に設定値が丸見え

ということでこのやり方は不採用

# Jenkins認証情報

Jenkins認証情報を活用することで先程の2つの問題点が解消できました。
それぞれどのように対策したか見ていきます。

## Jenkinsを複数人で利用している場合、誰でもキーが使える上に設定値が丸見え

* まずは適当にフォルダを作ります。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/7138afc8-e527-b38c-bc59-99f9bfbbef06.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/260d617d-869d-4e42-b687-4b0f42325c09.png)

* 作成したフォルダ配下で、[認証情報]を選択します。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/875b9005-128b-48a2-dbe7-ba7b9cb014c4.png)

* [Stores scoped to]の箇所で、[Add credentials]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0977ea36-e609-4d4a-8507-bbb08a2304d3.png)

* 種類に[Secret text]を選択し、まずはAZURE_APPLICATION_IDを設定して保存します。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2ca9b9b8-44a5-41c9-bee3-9bc001919b22.png)

* 同じ要領でAZURE_SECRETとAZURE_TENANT_IDのSecret Textも作成します。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c7cbedc7-c659-ef35-6d79-9027882530d1.png)

* これでこの3つのSecretはこのフォルダに紐付いた認証情報ということになりました。
* [Role-based Authorization Strategyプラグイン](https://qiita.com/shingo_kawahara/items/0a8d70d85ba85484d208) を使い、このフォルダにアクセス可能な人を絞ることで、誰でもキーが使えるという問題点が解決しました。

## ジョブ実行後のコンソール出力に設定値が丸見え

* それでは先程作ったフォルダ配下にジョブを作ります。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/43a2188b-d880-a27d-0245-853149ea1bec.png)

* [ビルド環境]→[秘密テキストや秘密ファイルを使用する]にチェックを入れます。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2b7f1ae2-004e-e291-0389-487eacfb1f36.png)

* バインディングという項目が追加されるので、[秘密テキスト]を選択します。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3315402d-01af-7913-af64-9fce78202e66.png)

* 先程作った認証情報が選べるので選択します。変数名は任意の値でよいですが分かりやすいものを付けましょう。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/dfe737ce-9837-cf13-805b-649c530a0bd4.png)

* 同じ要領でAZURE_SECRETとAZURE_TENANT_IDの秘密テキストも作成します。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2c5a7fdd-4459-a3bc-e662-e9100b08fb44.png)

* ビルドで[シェルの実行]を選択します。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8b1da5ba-f3a8-766c-ed1a-1028bc53de3e.png)

* 先程設定した秘密テキストはシェル変数の形式で使うことができます。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f06318d1-c5d0-caa6-1dc1-847375380a50.png)

* ジョブを保存して実行します。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1ab7f5bb-f3da-2e88-1b17-c318f365ae16.png)

* コンソール出力画面を見ると、設定したSecret情報が隠蔽されていることが分かります。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e889be07-6ab6-2a92-e564-9a52181d6823.png)