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も動くようにしておかないといけない?)なので一元的に扱う良い方法はないものなのかなぁという感じです。
知ってたら教えてください