GeekFactory

int128.hatenablog.com

Continuous deployment to App Engine from Circle CI by Gradle

Circle CIを利用して、JVMベースのアプリをGoogle App Engineにデプロイする作業を自動化してみました。

うれしいこと

  • 誰でも簡単にデプロイできる
  • CIやPull Requestレビューを通過したコードのみデプロイできるように制限できる
  • ビルド環境の差異による影響を排除できる

基本的な考え方

ざっくりとした流れは以下になります。

  1. GitHubにmasterをpushする
  2. Circle CIでビルドが実行される
  3. ./gradlew build でビルドする
  4. ./gradlew appengineUpdate でデプロイする

App Engine SDKはgradle-appengine-pluginが自動的にダウンロードするように設定します。また、デプロイにはService Accountを利用するため、あらかじめ https://console.cloud.google.com/iam-admin/serviceaccounts でService Accountを作成して鍵ファイルを取得しておきます。

実装

まず、Circle CIのYAMLを設定します。ポイントは以下になります。

  • Java 7でビルドする
  • Dependencies CacheにApp Engine SDKを含めてCI時間を短縮する
  • 環境変数 APPENGINE_KEY を経由してService Accountの鍵ファイルを渡す(あらかじめbase64エンコードしておく)

circle.yml は以下のようになります。

machine:
  java:
    version: openjdk7

  environment:
    TERM: dumb
    GRADLE_OPTS: -Xmx1g -Xms1g

dependencies:
  override:
    - ./gradlew testClasses appengineDownloadSdk

test:
  override:
    - ./gradlew build

deployment:
  production:
    branch: master
    commands:
      - echo "$APPENGINE_KEY" | base64 --decode > build/appengine-key.json
      - ./gradlew appengineUpdate

次に、Gradleを設定します。App Engine SDKを自動的にダウンロードするようにします。また、appcfgにService Accountの鍵ファイルを指定します。

appengine {
    downloadSdk = true
    appcfg {
        oauth2 = true
        if (file('build/appengine-key.json').exists()) {
            extraOptions << '--service_account_json_key_file=build/appengine-key.json'
        }
    }
}

実装例

GaelykとReactのアプリをCircle CIからApp Engineにデプロイする例を下記に置いているので参考にどうぞ。

github.com