Edited at

CircleCIでService Account使ってGAE/goへdeployする

More than 1 year has passed since last update.

c_to_gae.png

CircleCIのDocumentにはGoogle App EngineへのDeploy方法が書いていますが

Googleのパスワードを入力することになるのであまり気持ちよくなかったので

なんとかServiceAccountからDeployできないか模索しました


環境

Mac os x

gae go sdk: 1.9.24


ServiceAccountの作成

GCPのConsoleへ行きプロジェクトを開いてメニューから

[API Manager]->[認証情報]から[認証情報を作成]というボタンを押してService Accountを作成します。

作成した時鍵のエクスポートをするように促されます。

JSONでダウンロードしておきます。


鍵ファイルの暗号化と復号化用のスクリプトの用意

Gitで管理する際、鍵ファイルをリポジトリに含める場合は一応暗号化をしておきましょう

Travisだとこのへんはコマンドで簡単にできて楽してたんですが

コマンドラインツールは公式ではサポートされていないので自分で雑に用意しました。

https://gist.github.com/k2wanko/bc792b86f52dbe7f72e6

使い方は カレントディレクトリの直下にある.secretディレクトリ内のファイルを暗号化します。

# 暗号化したいファイルの作成

echo "チョココロネ" > .secret/important_confidential_documents
# 暗号化
$ SECURE_KEY=hogehoge script/encrypt
# .secret/important_confidential_documents.enc ができている
# 復号化
$ SECURE_KEY=hogehoge script/decrypt

gitignoreで.encだけをバージョン管理に含むように設定しておきましょう

CircleCIの方でSECURE_KEYという名前で適当な長さのランダムな文字列を入れておきます。


プロジェクトとcircle.ymlの作成

お試し程度なら適当なDemoアプリでプロジェクトを作っておいてください

そしてcircle.ymlを作成します。


circle.yml

machine:

timezone:
Asia/Tokyo
environment:
ACCOUNT: xxxxxxxxx@developer.gserviceaccount.com
GAE_GO_SDK_VERSION: 1.9.24

dependencies:
pre:
- curl -o $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-${GAE_GO_SDK_VERSION}.zip
- unzip -q -d $HOME $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip

test:
override:
- $HOME/go_appengine/goapp build
- $HOME/go_appengine/goapp test -v ./...

deployment:
appengine:
branch: master
commands:
- script/decrypt
- gcloud auth activate-service-account $ACCOUNT --key-file ./.secret/key.json
- gcloud preview app deploy --set-default --version=1


DemoアプリならこれでDeployまでできるのですが

gcloudコマンドのAppEngineのはまだpreview版で依存を解決してくれませんでした

つまり外部のフレームワークやパッケージを使っていた場合gcloud preview app deploy --set-default --version=1ではdeployできません

なのでappcfg.pyを使うのですが

今度はappcfg.pyはサービスアカウントをそのままでは読み込んで使えないのでサービスアカウントからAccessTokenを取得します。

gcloud でアカウントが設定されていれば、以下のコマンドでトークンが取得できます。

$ gcloud auth print-access-token

後はcircle.ymlを修正しておしまいです


circle.yml

machine:

timezone:
Asia/Tokyo
environment:
GAE_GO_SDK_VERSION: 1.9.24
PATH: $PATH:$HOME/go_appengine

dependencies:
pre:
- curl -o $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-${GAE_GO_SDK_VERSION}.zip
- unzip -q -d $HOME $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip

test:
override:
- goapp build
- goapp test -v ./...

deployment:
appengine:
branch: master
commands:
- script/decrypt
- gcloud auth activate-service-account $ACCOUNT --key-file ./.secret/key.json
- appcfg.py update --oauth2_access_token $(gcloud auth print-access-token 2> /dev/null) .


自動でDeployできるようになりました