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

  • 52
    いいね
  • 0
    コメント

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できるようになりました