koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

IaCしていないAzure Rsource GroupのARMテンプレートの履歴をBitbucket Pipelinesで取る

先日以下のようなことをした。

koudenpa.hatenablog.com

しかし、僕が履歴を取りたいリソースグループにデプロイしているアプリケーションはBitbucketでリポジトリ管理していることに気が付いてしまった。仕方ないので同様のことをBitbucket Pipelinesで行った。

以下のような定義を行って好きなタイミングで実行できるようにした。

image: atlassian/default-image:2

pipelines:
  custom:
    default:
    - step:
        script:
          # azure-cli イメージを使って指定したARMテンプレートをエクスポートする。
          - >-
            docker run 
            -v ${BITBUCKET_CLONE_DIR}:${BITBUCKET_CLONE_DIR} -w ${BITBUCKET_CLONE_DIR} 
            -e AZURE_APP_ID=${AZURE_APP_ID} -e AZURE_PASSWORD=${AZURE_PASSWORD} -e AZURE_TENANT_ID=${AZURE_TENANT_ID}
            microsoft/azure-cli:2.0.57 bash -c '
            echo "AZURE_TENANT_ID:${AZURE_TENANT_ID} AZURE_APP_ID:${AZURE_APP_ID}";
            az login --service-principal --username "${AZURE_APP_ID}" --password "${AZURE_PASSWORD}" --tenant "${AZURE_TENANT_ID}";
            az group export --name test > test.json.txt'
          # 差分があればコミットして自リポジトリにプッシュする。
          - |
            if [ -n "$(git status --porcelain)" ]; then
              git add .
              git commit -m "Update ARM template."
              git push
            else
              echo "No change"
            fi
        services:
          - docker
        caches:
          - docker 

BITBUCKET_CLONE_DIR 配下のディレクトリのみをDockerコンテナにマウントできるらしいのでそうしている。この変数は自動的に設定される。

Dockerコマンドの実行については以下辺りに書いてある。

Bitbucket Pipelines で Docker コマンドを実行する - アトラシアン製品ドキュメント

AZURE_APP_ID AZURE_PASSWORD AZURE_TENANT_ID は認証情報なので変数として設定しておく。PASSWORDはSecureだ。

認証情報を作るにはこの辺 Use Azure service principals with Azure CLI | Microsoft Docs を見ろ、と後述の Azure CLI run pipe の案内には書いてあった。

リポジトリへのPushbackは素直に行える。詳しくは以下に書いてあるようだ。

Push back to your repository - Atlassian Documentation

スケジュールしたかったらスケジュール機能がある。

Scheduled pipelines - Atlassian Documentation

ブラウザ上から任意のタイミングで実行もできる。

f:id:koudenpa:20191207031056p:plain

警告が出てるがまぁよし!

f:id:koudenpa:20191207032432p:plain


当初はAzure CLI run pipe を使おうとしたのだが CLI_COMMAND はそれ全体1つのコマンドとして実行されるように作られているようで、パイプしてのAzure CLIの出力取得ができなかった。仕方ないのでAzure CLI(のDockerイメージを)直接使った次第。

image: atlassian/default-image:2

pipelines:
  custom:
    default:
    - step:
        script:
          - pipe: microsoft/azure-cli-run:1.0.2
            variables:
              AZURE_APP_ID: $AZURE_APP_ID
              AZURE_PASSWORD: $AZURE_PASSWORD
              AZURE_TENANT_ID: $AZURE_TENANT_ID
              CLI_COMMAND: 'az group export --name test > test.json.txt'
              # DEBUG: DEBUG # Optional
          - |
            if [ -n "$(git status --porcelain)" ]; then
              git add .
              git commit -m "Update ARM template."
              git push
            else
              echo "No change"
            fi