Continuous deployment to App Engine from Circle CI by Gradle
Circle CIを利用して、JVMベースのアプリをGoogle App Engineにデプロイする作業を自動化してみました。
うれしいこと
- 誰でも簡単にデプロイできる
- CIやPull Requestレビューを通過したコードのみデプロイできるように制限できる
- ビルド環境の差異による影響を排除できる
基本的な考え方
ざっくりとした流れは以下になります。
- GitHubにmasterをpushする
- Circle CIでビルドが実行される
./gradlew build
でビルドする./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にデプロイする例を下記に置いているので参考にどうぞ。