Software Engineer Blog

エンジニアブログです。技術情報(Go/TypeScript/k8s)や趣味の話も書くかもです。

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 を実行してます。
vmubuntu を利用してます。

YAML schema - Azure Pipelines | Microsoft Docs

Secret

secret 情報は Azure pipelines 上の Variables に設定しています。
Web UI から設定することで、見れないように設定できます。

Variables - Azure Pipelines | Microsoft Docs

secret variables を利用するには、マッピングして環境変数にセットする必要があります。
secret には 2 つの値を設定します。

  1. 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 という名前にしてます。

  2. GCP のプロジェクト ID
    プロジェクト ID を登録してください。 PROJECT_ID_PRODUCTION として登録してます。

env にて同名の環境変数マッピングしています。

- 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 を利用します。

hub.docker.com

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 を活用して速くしたい

参考