GAE/GoのアプリをCircleCIからデプロイできるようにしたいと思います。AWSにデプロイするのとは違う感じなので、ドキュメントを読みました。以下はAppEngine Flexible Environment へのデプロイになります。StandardEnvでも参考にはなると思いますが、違う部分もあるので注意してください。
また、flexible envはまだbetaなので、この辺りすぐに変わる可能性があります。
公式のドキュメント
このあたりを読めば書いてあります。
- Authentication with Google Cloud Platform - CircleCI
- Continuous Deployment to Google App Engine - CircleCI
以下では書いてあることを順にやっていきます。
GCPサービスアカウントの作成
まずは GCPのコンソールで 「IAMと管理」のメニューから「サービスアカウント」を作成します。サービスアカウント名を入力して、"新しい秘密鍵の提供"にチェックを入れ、キーのタイプはJSONを選びます。
次にダウンロードしたJSONファイルをbase64エンコードして、その結果をコピーします。
base64 <your-service-account.json>
CircleCIのプロジェクトの設定からEnvironmental Variableに新たに環境変数を追加します。keyをGCLOUD_SERVICE_KEY
にして、Valueにさっきコピーした文字列を貼り付けます。
また、同じくCircleCIの環境変数で KeyをGCLOUD_PROJECT
にして Valueにプロジェクト名を入れておきます。
また、上記ページに書いてないけど必要なこととして、
- GCP Consoleの「APIManager」から、AppEngine Admin APIを有効にする
- GCPConsoleの「IAMと管理」で、上で作成したサービスアカウントを追加して、「プロジェクトの編集者」の権限を付与する
をやる必要がありました。
circle.ymlを設定する
circle.ymlは以下のように書けます。
dependencies
の上の4行は、先ほど作成したGCPサービスアカウントを利用してGCPへデプロイするための設定を行っています。
dependencies
の次の2行は、デプロイする際に必要となるpermissionを設定します。
dependencies
の下の2行は、プロジェクトに依存するファイルと、デプロイに必要なaedeploy
をgo get
しています。
deployment
では、自分の場合 app.yaml
が app
ディレクトリに置いているので aedeploy
を実行する前にcd
しています。
machine:
timezone:
Asia/Tokyo
dependencies:
pre:
- echo $GCLOUD_SERVICE_KEY | base64 --decode > ${HOME}/gcloud-service-key.json
- sudo /opt/google-cloud-sdk/bin/gcloud --quiet components update
- sudo /opt/google-cloud-sdk/bin/gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json
- sudo /opt/google-cloud-sdk/bin/gcloud config set project $GCLOUD_PROJECT
- sudo chmod -R 757 /home/ubuntu/.config/gcloud/logs
- sudo chmod -R 757 /home/ubuntu/.config/gcloud/credentials
- go get -t -d -v ./...
- go get google.golang.org/appengine/cmd/aedeploy
deployment:
dev:
branch: master
- cd app && /home/ubuntu/.go_workspace/bin/aedeploy /opt/google-cloud-sdk/bin/gcloud -q app deploy ./app.yaml --promote
ハマリどころ
gcloud app deploy
の実行で permission エラーが結構出ました。サービスアカウントに「AppEngineへのデプロイ」の権限だけ付与してもダメで、結局プロジェクトの編集者の権限を付与しています。CircleCIのドキュメントの通りに
gcloud app deploy
を実行しても、Goの場合GOPATH周りがおかしくなり必要なpackageがないとエラーが出てしまうので、aedeploy
を使います。
StandardEnvの場合
Continuous Deployment to Google App Engine - CircleCIにあるように、AppEngineSDKを取ってくる必要があります。
- curl -o $HOME/go_appengine_1.9.38.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.38.zip
- unzip -q -d $HOME $HOME/go_appengine_1.9.38.zip
これでgoapp
コマンドを使ったテストができます。