CircleCI 1.0からGCPにデプロイ（リポジトリにデプロイシェルがあるパターン）

GoogleCloudPlatformに対してCIを使いたいパターンも存在すると思います。
まとまったドキュメントがない気もするので書いてみました。

ちなみにCircleCIは本稿作成時点では２．０もあり、こちらはDocker必須なので敷居が高いので１．０で説明します。
RubyonRailsだけど他のものでも応用可能かと。

**【前提条件】**
・CircleCI1.0
・GCP上にサーバ環境構築済み
・デプロイシェルを `/var/www/xxx/bin/deploy` とする

**【基本的なフロー】**
1. CircleCIにGithubでログイン
2. リポジトリを選択して設定を行う
3. GCPのAPI Managerで認証情報を作成
4. CircleCIに認証情報を環境変数にして登録
5. ssh-keygenで認証キー作成
6. CircleCIに認証キー保存デプロイする
7. ブランチにcircle.ymlを作成
8. デプロイ開始

こんなところです。以下詳細に説明します。

###CircleCIにGithubでログイン
<img width="1198" alt="スクリーンショット 2017-07-27 16.44.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/1593/d57d3ebe-a203-2611-1241-1e27d32a176d.png">

###リポジトリを選択して設定を行う
対象となるソースのリポジトリを指定する。
![スクリーンショット 2017 07 27 18.23.23.png](https://qiita-image-store.s3.amazonaws.com/0/1593/f0464073-c45e-6a02-7356-a06cab52504f.png)

###GCPのAPI Managerで認証情報を作成
GCPアクセスのための認証情報を作成する。
![認証情報   vr platform stg.png](https://qiita-image-store.s3.amazonaws.com/0/1593/867f6125-1132-7ead-6bbb-1fd411334152.png)

![サービス アカウント キーの作成   VR Platform.png](https://qiita-image-store.s3.amazonaws.com/0/1593/24f3ea9f-8d24-5d0b-96d8-45a9df42fa35.png)
サービスアカウントキーの作成から、新しいサービスアカウントキーを作成。上記のような情報を
入力してjsonファイル（一度しか生成されない）を取得する。

その後、取得したjsonファイルをbase64エンコードする。
```
base64 service_xxx@yyy.json
```

エンコードした結果をCircleCI上に環境変数（GCLOUD_SERVICE_KEY）として次のようにして保存する。

###CircleCIに認証情報を環境変数にして登録
上記で作成した認証情報を環境変数に入れ込み、あとでCircleCIの実行時に動的に取り出して接続する。
![Org settings   flic360   CircleCI (2).png](https://qiita-image-store.s3.amazonaws.com/0/1593/1f8a2d0b-bbfa-4589-1645-8b1bb1fb2290.png)
![Project settings   flic360 Flic360_system   CircleCI (2).png](https://qiita-image-store.s3.amazonaws.com/0/1593/948976ab-25fc-b2b4-568e-1351869ff95c.png)

###ssh-keygenで認証キー作成
CircleCIの仮想マシンからGCPのサーバにアクセスする際にキーが必要。この辺参照して作成する。
http://qiita.com/suthio/items/2760e4cff0e185fe2db9

###CircleCIに認証キー保存デプロイする
作成された認証キーはCIの仮想マシンに設定する必要あり、こちらの画面から登録。
![Project settings   flic360 Flic360_system   CircleCI (3).png](https://qiita-image-store.s3.amazonaws.com/0/1593/ac513a79-9d0e-3c37-c6d1-fab486529b5f.png)


###ブランチにcircle.ymlを作成
デプロイするブランチの直下に以下の `circle.yml` を置くことでCiricleCIの設定を行う

```
general:
  branches:
    only:
      - master
      - develop

machine:
  timezone:
    Asia/Tokyo
  environment:
    ACCOUNT: circleci@yyyy-stg.iam.gserviceaccount.com
    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

deployment:
  staging:
    branch: develop
    commands:
      - echo $GCLOUD_SERVICE_KEY | base64 --decode --ignore-garbage > ${HOME}/gcloud-service-key.json
      - sudo /opt/google-cloud-sdk/bin/gcloud --quiet components update
      - gcloud auth activate-service-account $ACCOUNT --key-file ${HOME}/gcloud-service-key.json
      - ssh developaccount@xx.yy.ww.zz -C /var/www/xxx/bin/deploy #deploy shell
  production:
    branch: master
    commands:
      - echo $GCLOUD_SERVICE_KEY | base64 --decode --ignore-garbage > ${HOME}/gcloud-service-key.json
      - sudo /opt/google-cloud-sdk/bin/gcloud --quiet components update
      - gcloud auth activate-service-account $ACCOUNT --key-file ${HOME}/gcloud-service-key.json
      - ssh developaccount@xx.yy.ww.zz -C /var/www/xxx/bin/deploy #deploy shell
```

#### デプロイシェルの例（GCP上にCakePHPでプロジェクト作成した場合）
```
#!/bin/sh

cd /var/www/html
git pull origin master
yes | ./app/Console/cake schema update
```

### 各ブランチにソースをコミット→プッシュ
GithubのMaster、Developにコミット→プッシュすることで自動的にCiricleCIがデプロイを始めます。