CircleCI2.0からGAEスタンダード環境のruntime:python3.7へデプロイする手順

概要

GAEのスタンダード環境のpython3.7を使う際に、CircleCIから直接デプロイできるようにした。CircleCIがDockerコンテナベースでのビルドなので、そこからgcloud SDKでデプロイするための設定をすればOK。基本的にpython3でAppを作ってるけど、gcloud SDKがpython2で動くので共存させる必要がある。

今回はpython2、python3、Google Cloud SDKを入れてあるDockerイメージを用意し、CircleCIの.circleci/config.ymlの中で呼び出し、その中でgcloudコマンドを叩いてデプロイするようにしました。gcloudでデプロイするためにcircleciで立ち上げたコンテナの中でサービスアカウントを認証しなければならない点です。

Docker image

Python3.7-strechのイメージに、python2.7、Google Cloud SDKが入ったDockerイメージを自作しました。下記のDockerhubのリポジトリに入っていますので、必要に応じてCircleCIで使うなりpulsるなりlして使って下さい。 Dockerfileの入ったリポジトリは下記です。最初pip3がうまく起動しなかったので、gcloudSDK, python2を入れた後に再度pip3を入れてる必要があったのが辛かった。

github.com

CircleCIの設定

CircleCIからgcloud SDKを使ってデプロイする際にはサービスアカウントを認証する必要があります。サービスアカウントの認証方法は、下記3つありますが、CircleCI上からはブラウザを使った認証が出来ないので、3を使います。

  1. gcloud init を使う
  2. gcloud auth login を使う
  3. cloud auth activate-service-account --key-file を使う

この3つ目の認証には、

  • サービスアカウントのメールアドレス
  • サービスアカウントの認証キー
  • サービスID

3つを用意しなければいけません。 サービスアカウントはGCPのコンソールからIAMタブへいき、アドレスと認証キーを入手し、手元に控えて下さい。 このアドレスと認証キーをconfig.yamlに直接書いたりするのは管理面で怖いです。よってCircleCIのアプリの中でEnvironment Variablesというconfig.ymlに環境変数を渡す機能があるので、それを使って渡すことになります。CircleCIアプリの中で個別のプロジェクトのPROJECT SETTINGSで設定しましょう。認証キーはJSONの中身をそのままコピペするだけで大丈夫です。

設定が完了したら.circleci/config.yamlを書きます。関連する部分だけを書き出すと下記のようになります。

version: 2
jobs:
  build:
    working_directory: ~/repo
    docker:
      - image: tkazusa/appengine-python37:latest
    steps:
      - checkout

      - run:
          name: install dependencies
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
        
      - run:
          name: google auth
          command: |
            echo $DEV_SERVICE_ACCOUNT_KEY > /tmp/secret.json
            gcloud auth activate-service-account $DEV_SERVICE_ACCOUNT_CLIENT_EMAIL --key-file /tmp/secret.json
      - run:
          name: deploy production
          command: |
            gcloud --quiet config set project $GOOGLE_PROJECT_ID
            gcloud --quiet app deploy app/app.yaml --project $GOOGLE_PROJECT_ID

まとめ

Dockerコンテナの準備がややめんどくさかったですけど、これで個人でもCircleCIからGAEにCDできるようになりました。DockerhubのAutobuildも勉強できて良かった。

参考