Azure Pipelines から GAE へアプリケーションをデプロイ
目次
折りたたみ
概要
Azure Pipelines の build で CI を実行しており、そのままデプロイできないか試してみました。
実際にできたので方法を記載します。
Version
name | version |
---|---|
google/cloud-sdk | 252.0.0-alpine |
内容
- Azure Pipelines の Build 上でデプロイまで実行
azure-pipelines.yml
に記載の script から実行- GCP の認証は
google/cloud-sdk
docker image を利用
詳細
基本的には azure-pipelines.yml
に deploy stage を作成して job を実行してます。
vm は ubuntu を利用してます。
YAML schema - Azure Pipelines | Microsoft Docs
Secret
secret 情報は Azure pipelines 上の Variables に設定しています。
Web UI から設定することで、見れないように設定できます。
Variables - Azure Pipelines | Microsoft Docs
secret variables を利用するには、マッピングして環境変数にセットする必要があります。
secret には 2 つの値を設定します。
GCP の Service Account の鍵ファイル(JSON)
GCP 上からデプロイを実行するための Service Account を発行してください。
Creating and managing service accounts | Cloud Identity and Access Management Documentation | Google Cloud
秘密鍵情報が入った JSON ファイルがダウンロードできるので、ダウンロードします。
この JSON ファイルの内容すべてを Secret Variables として Azure Pipelines へ登録してください。
私は、DEPLOY_KEY_FILE_PRODUCTION
という名前にしてます。GCP のプロジェクト ID
プロジェクト ID を登録してください。PROJECT_ID_PRODUCTION
として登録してます。
- stage: deploy # 前段のbuildが成功 and master branch の場合のみ実行する condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/master')) jobs: - job: app_engine_deploy pool: vmImage: "ubuntu-latest" steps: - script: | # ここに記載 env: DEPLOY_KEY_FILE_PRODUCTION: $(DEPLOY_KEY_FILE_PRODUCTION) PROJECT_ID_PRODUCTION: $(PROJECT_ID_PRODUCTION) GCLOUD_VERSION: 252.0.0-alpine
Auth GCP
認証周りは docker image を利用します。
公式が出している image の google/cloud-sdk
を利用します。
gcloud-config
という名前で認証を実行するコンテナを作成します。
# Secret Variables に設定した秘密鍵情報をファイルに書き出す echo $DEPLOY_KEY_FILE_PRODUCTION > /tmp/credential.json # image を取得 docker pull google/cloud-sdk:${GCLOUD_VERSION} # docker container 内で gcloud command を実行 docker run -v /tmp:/tmp --name gcloud-config google/cloud-sdk:${GCLOUD_VERSION} gcloud auth activate-service-account --key-file /tmp/credential.json
Deploy GAE
先程作成した、 gcloud-config
コンテナの Volume を再利用することで gcloud の認証済みとして各種コマンドを実行できます。
(Docker Hub の Usage に細かい部分は書いてあります。)
GAE の設定に secret.yml が必要で、うまく yml を variables に設定できなかったので、secret.yml を無理やり作ってます。
# XXX: secret.yml を無理やり作る echo " env_variables: DATASTORE_PROJECT_ID: ${PROJECT_ID_PRODUCTION} " > ./secret.yml # deploy docker run -v $(pwd):/tmp/app --volumes-from gcloud-config # --volumes-from で認証済みの volumeを再利用 google/cloud-sdk:${GCLOUD_VERSION} gcloud --quiet --project ${PROJECT_ID_PRODUCTION} app deploy /tmp/app/app.yaml # コマンド実行
Remove Credential
秘密情報が入った volume や ファイルがあるので消しておきます。
# volumeごと消す docker container rm -v gcloud-config rm /tmp/credential.json rm ./secret.yml
全体
azure-pipelines.yml
全体
- stage: deploy condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/master')) jobs: - job: app_engine_deploy pool: vmImage: "ubuntu-latest" steps: - script: | echo $DEPLOY_KEY_FILE_PRODUCTION > /tmp/credential.json docker pull google/cloud-sdk:${GCLOUD_VERSION} docker run -v /tmp:/tmp --name gcloud-config google/cloud-sdk:${GCLOUD_VERSION} gcloud auth activate-service-account --key-file /tmp/credential.json echo " env_variables: DATASTORE_PROJECT_ID: ${PROJECT_ID_PRODUCTION} " > ./secret.yml # deploy docker run -v $(pwd):/tmp/app --volumes-from gcloud-config google/cloud-sdk:${GCLOUD_VERSION} gcloud --quiet --project ${PROJECT_ID_PRODUCTION} app deploy /tmp/app/app.yaml docker container rm -v gcloud-config rm /tmp/credential.json rm ./secret.yml env: DEPLOY_KEY_FILE_PRODUCTION: $(DEPLOY_KEY_FILE_PRODUCTION) PROJECT_ID_PRODUCTION: $(PROJECT_ID_PRODUCTION) GCLOUD_VERSION: 252.0.0-alpine
所感
Azure Pipelines から無事に deploy できました。ただの Ubuntu なのでできると思ったので良かったです。
気になる点としては、このあたりです。
- Azure Pipelines の Build で deploy を実行している
- Release でやったほうが良い?
- 実行時間がそこそこかかる
- 実際は npm install / go build 等を実行している
- Cache を活用して速くしたい
参考
- YAML schema - Azure Pipelines | Microsoft Docs
- Variables - Azure Pipelines | Microsoft Docs
- Creating and managing service accounts | Cloud Identity and Access Management Documentation | Google Cloud
- google/cloud-sdk - Docker Hub
- GitLab CI で Google App Engine プロジェクトを自動デプロイ - Qiita
- recout/azure-pipelines.yml at master · gmidorii/recout