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を入れてる必要があったのが辛かった。
CircleCIの設定
CircleCIからgcloud SDKを使ってデプロイする際にはサービスアカウントを認証する必要があります。サービスアカウントの認証方法は、下記3つありますが、CircleCI上からはブラウザを使った認証が出来ないので、3を使います。
- gcloud init を使う
- gcloud auth login を使う
- 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も勉強できて良かった。