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だとこのへんはコマンドで簡単にできて楽してたんですが
コマンドラインツールは公式ではサポートされていないので自分で雑に用意しました。
使い方は カレントディレクトリの直下にある.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を作成します。
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を修正しておしまいです
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できるようになりました