LoginSignup
61
49

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-25

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だとこのへんはコマンドで簡単にできて楽してたんですが
コマンドラインツールは公式ではサポートされていないので自分で雑に用意しました。

使い方は カレントディレクトリの直下にある.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できるようになりました

61
49
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
49