Circle CI + Python3 + GAEについて

Circle CI + Python3 + GAEについて

別にどうというわけでもないが、メモ。3時間くらい悩まされたため。

背景

Googleが提供するPythonで実装されたスクリプト群がPython2で動くことはあまりにも有名ですね。そもそもAppEngineのStandard Environmentにデプロイしようと思うとPythonのバージョンは2でないと動かないです。

ところで、Flexible Engine(以下FE)では3も動かすことが可能です。先日、Python3 + Djangoで書いたコードをFEに投げてhogehogeしていました。ここにCIを導入しようと思い、ある程度無料でプライベートリポジトリでも利用可能なCircle CIを導入しました。

問題

問題は、アプリがPython3で動いている一方で、Python2のgcloudコマンド群を動かさないといけないという点です。

Circle CIが用意しているイメージを使ってgcloudコマンドを叩くことは可能(Python2のイメージを使ってインストールすることも可能)ですが、そうすると、App側で動かしたい一連のタスクが実行できなくなりました。

根底にあるのは、普通に提供されている機能だけを使うと、Python2/3の両立が必要なタスクが難しいのではないか?という点です。

解決

結論は簡単で自分でdockerイメージを作りました。gcloud-python3にあります(二つ入れただけですが)。

jobs:
  deploy:
    working_directory: ~/repo
    docker:
      - image: moratorium08/gcloud-python3
    environment:
      - GOOGLE_APPLICATION_CREDENTIALS: "gcp-key.json"
    steps:
      - checkout

      - run:
          name: create yamls
          command: |
            echo "$GOOGLE_AUTH" | base64 -i --decode > "gcp-key.json"
            gcloud auth activate-service-account --key-file "gcp-key.json"
      - run:
          name: install dependencies
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
      - run:
          name: collect static
          command: |
            . venv/bin/activate
            python manage.py collectstatic
      - run:
          name: upload static files
          command:
            gsutil rsync -R static $BUCKET_NAME

      - run:
          name: deploy production
          command: |
            gcloud --quiet config set project "$GOOGLE_PROJECT_ID"
            gcloud --quiet app deploy app.yaml

workflows:
  version: 2
  build-deploy:
    jobs:
      - deploy:
          filters:
            branches:
              only: master

こんな感じ

感想

Dockerで殴るのは速いし余計なことを考えなくて良いなぁという気持ちですが、そもそも普段使いでgcloudとPython3を両立させるのが少々めんどう(virtualenv下においてPython3の環境だけでなく2も動くようにしておかないといけない?)なので一元的に扱う良い方法はないものなのかなぁという感じです。

知ってたら教えてください