GAE/GoのWebアプリをCircleCIで自動テスト&自動デプロイする

# はじめに
以前投稿した「[IntelliJ IDEAを使ってGAE/GoのHelloWorldする](http://qiita.com/kyokomi/items/3dcf964f1d7885ce7a11)」のGAE/Goで作ったWebアプリを、CircleCIからGoogleAppEngineへdeployする手順の説明です。

## 前提条件・環境
- GoogleAppEngineでアカウントが登録済み
- CircleCIでアカウント登録済み
- GAE/GoのWebアプリのリポジトリがGithubにある

# CircleCIの設定

## プロジェクト直下にcircle.ymlを追加

今回は、appengineのバージョン1.9.12の例。

```YAML:circle.yml
machine:
  timezone:
    Asia/Tokyo
dependencies:
  pre:
    - curl -o $HOME/go_appengine_1.9.12.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.12.zip
    - unzip -q -d $HOME $HOME/go_appengine_1.9.12.zip
  override:
    - $HOME/go_appengine/goapp build
test:
  override:
    - $HOME/go_appengine/goapp test
deployment:
  appengine:
    branch: master
    commands:
      -  $HOME/go_appengine/appcfg.py --oauth2_refresh_token=$APPENGINE_TOKEN update .
```

## refresh_tokenを用意する

一回だけ手動でデプロイする必要があります。
これ以外でrefresh_tokenを作成する方法がわからなかったので。。。

以下は、ホーム直下にgo_appengineをインストールした例です。

```console:console
$ ~/go_appengine/appcfg.py --oauth2 --noauth_local_webserver update .
```

こんな感じでブラウザURLが出てきますので、oauth認証を行います。
発行されたコードを`Enter verification code:`に入力してそのまま1回deployします。

```console:console-log
01:41 PM Application: xxxxxxx; version: 1
01:41 PM Host: appengine.google.com
01:41 PM
Starting update of app: xxxxxxx, version: 1
01:41 PM Getting current resource limits.
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?scope=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Enter verification code:
```

deploy成功すれば、ホーム直下に`appcfg_oauth2_tokens`というファイルができているので、この中にある`refresh_token`をメモします。

```console:console
$ cat ~/.appcfg_oauth2_tokens
```

こんなjsonのやつです。

```json
{
    "_module": "oauth2client.client",
    "_class": "OAuth2Credentials",
    "access_token": "xxxxxxxxxxx-xxxxxxx- xxxxxxxx",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "invalid": false,
    "client_id": "1111111111111.apps.googleusercontent.com",
    "id_token": null,
    "client_secret": "xxxxxxxxxxxxxxx",
    "token_expiry": "2014-07-26T12:42:51Z",
    "refresh_token": "1/xxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "user_agent": "appcfg_go/1.9.6 Darwin/13.3.0 Python/2.7.8.final.0"
}
```

## CircleCIにプロジェクトを追加しAPPENGINE_TOKENを設定

CircleCIログイン後の左メニューにある`Add Projects`からGAE/GoプロジェクトのGithubを選択します。

最初のbuildが走ってしまいますが、そこは気にしないで`project settings`を開きます。

`Environment variables`を選択して、先ほどの`circle.yml`に記載した環境変数`APPENGINE_TOKEN`を追加します。

設定する値は、先ほど手動deploy時に発行された`refresh_token`を設定します。

![スクリーンショット_2014-10-11_17_35_19.png](https://qiita-image-store.s3.amazonaws.com/0/40887/6985e6dd-2e80-5eb0-fe7d-121c4d68a3b5.png)

## CircleCIのGOPATHを変更する

GAE/Goはプロジェクト直下をGOPATHとして動くため、それにあわせる（そうしないとsubpackage等がbuildエラーになる）

`Environment variables`を選択して、`GOPATH`に`$HOME/$CIRCLE_PROJECT_REPONAME `を設定する。

# おわり

これでRebuildもしくは、変更をgithubにpushした時にbuildが走ってtestが通ればGoogleAppEngineにdeployされます。

![スクリーンショット 2014-10-11 17.51.40.png](https://qiita-image-store.s3.amazonaws.com/0/40887/f13c0609-2cb7-85e2-a020-ac07dff1e037.png)

ちなみに最初は、[CircleCIのドキュメントに書かれているemailとpassを環境変数に持たせるやつ](https://circleci.com/docs/deploy-google-app-engine#go)を試していたんですが、[最近のバージョンから廃止されたみたい](https://cloud.google.com/appengine/docs/go/tools/uploadinganapp#Go_Uploading_the_app)で、かなりハマってました。。。OTL

## 使用したソースコードなど

試したソースコード等は、Githubで公開しているので参考にしていただければと思います。

- https://circleci.com/gh/kyokomi/gae-go-example
- https://github.com/kyokomi/gae-go-example

## 参考
- [GAE/Goのチュートリアル](https://cloud.google.com/appengine/docs/go/gettingstarted/introduction)
- [CircleCIでGoogleAppEngineへデプロイする手順のドキュメント](https://circleci.com/docs/deploy-google-app-engine)
- [GoogleAppEngineでgoをデプロイする手順のドキュメント](https://cloud.google.com/appengine/docs/go/tools/uploadinganapp)