SpinnakerでPlay 2.5アプリをGCEにデプロイする

この記事は[Opt Technologies Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opt-technologies)の7日目です。（納品が1日遅れ大変申し訳ございません）

[Spinnaker](http://www.spinnaker.io/)は、Netflixが作っている、オープンソースのマルチクラウド対応継続的デリバリーPlatformです。

LBの下にサーバーを並べるようなクラスタの構成や、ビルド成果物からのマシンイメージの作成 ~> デプロイといったパイプラインの構築が簡単にできるようです。

今回、PlayアプリケーションをGCEにデプロイするパイプラインを構築して、Spinnakerに入門してみました。

## 必要なもの
- GCPのアカウント
  - Spinnakerの起動も、アプリのデプロイもGCP上に行います。
  - 手元でgcloudのインストール & authも済ませておきましょう。
- java8の実行環境がインストール済みの`Ubuntu 14.04`GCEマシンイメージ
  - このイメージに対して、PlayアプリをBakeします。
  - イメージ名は `ubuntu-1404-trusty-jdk8` とします。
- プライベートaptリポジトリ
  - この記事ではS3を使用します。(GCSでもいけるはずなんですが...)

## Playアプリをプライベートaptリポジトリにpublish
Spinnakerは、debianパッケージからマシンイメージを作成(Bakeと呼ばれます)するため、アプリをaptリポジトリに置いておく必要があります。

実際はJenkinsやCIサービスなどを使ってテスト ~> リポジトリへのpublishを行うことになると思いますが、この記事では[Aptly](https://www.aptly.info/)を使って手元でpublishしておきます。

Aptlyの詳しいセットアップ方法については省略します。

```bash
$ git clone https://github.com/ocadaruma/play-example.git
$ cd play-example
$ bin/activator debian:packageBin # .debを作成
$ aptly repo create play-example
$ aptly repo add play-example target/play-example_1.0-SNAPSHOT_all.deb
$ aptly --skip-signing --architectures="amd64,i386" --distribution=trusty publish repo play-example s3:main: # ~/.aptly.confにmainという名前でS3の設定がされている前提
```

## Spinnakerのセットアップ
### 起動
GCPでは、`Cloud Launcher`を使ってワンタッチでSpinnakerインスタンスが作れますので、それを使いましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/d9d992d1-86e1-e5e8-4b3c-e198d6e90a35.png)

起動したら、このような画面が見えるはずです。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/e68c0bdd-c0ee-030d-3fdf-f58fa8dcb206.png)

`Accessing Spinnaker through SSH Tunnel`に書いてあるコマンドを打って、SSHトンネルを開きます。
すると、`localhost:9000`でSpinnaker Consoleが開けるはずです。

### プライベートaptリポジトリ用の設定
Bake時に、プライベートaptリポジトリを読めるようにします。

作ったSpinnakerインスタンスにSSHでログインし、`/opt/rosco/config/rosco.yml`を開いて以下を追記します。（S3以外をaptリポジトリに使う場合は適宜変更）

```yaml:/opt/rosco/config/rosco.yml
debianRepository: s3://your-repo.s3.amazonaws.com/ trusty main
```

また、S3を使う場合は、aptで`s3://`スキームを使えるようにする設定も必要です。
うまいやり方が思いつかなかったため、強引ですが`/opt/rosco/config/packer/install_packages.sh`を以下のように編集します。。

```bash:/opt/rosco/config/packer/install_packages.sh
#!/bin/bash

〜〜

function provision_deb() {
  # install s3 method
  sudo wget https://raw.githubusercontent.com/BashtonLtd/apt-transport-s3/master/s3 -O /usr/lib/apt/methods/s3
  sudo chmod +x /usr/lib/apt/methods/s3

  # setup aws credentials
  cat << EOS | sudo tee /etc/apt/s3auth.conf
AccessKeyId = AKIA*********
SecretAccessKey = *********
Token = ''
EOS

〜〜
```

## Spinnakerアプリケーションの設定

では[Spinnaker Console](http://localhost:9000)を開き、いろいろ作成していきましょう。

### Application
ApplicationsタブのActions ~> Create Applicationを開き、このような内容で作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/1ab32007-9f87-8a9d-a8bf-5870b0321091.png)

### Load Balancers

LOAD BALANCERSタブ ~> Create Load Balancerから、9000番に対するLBを作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/693925ac-a53c-6a55-aa09-36c29560f469.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/135236b0-69a0-9596-31c2-1bdfbff01a13.png)

### Security Groups

SECURITY GROUPSタブ ~> Create Security Groupから、9000番を許可するファイアウォール設定を作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/ef20c94b-d22f-d60e-9479-e7e70d3ee773.png)

### Pipelines

PIPELINESタブ ~> `+`から、PlayアプリのBakeとデプロイを行うパイプラインを作成していきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/db6a1933-2398-9ea6-d633-a623ee33853b.png)

### Bake Stage

Add stageで、java8インストール済みのtrustyイメージに対してアプリをBakeするStageを作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/c80ed9d5-ea7b-c542-58ac-538ccb777d62.png)

### Deploy Stage

続けてAdd stageで、デプロイを行うStageを作成します。

TypeをDeployにし、`Add server group`から、クラスタを構成していきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/32bf249d-56c3-8b89-86fb-f40da2c031e4.png)

Load Balancers, Security Groupsに、先ほど作成したものを設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/18260a82-03d6-3109-194e-72164a2b2721.png)

Instance TypeはとりあえずMicroにします。

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/202e0aba-d2aa-38ab-555f-8c3e93cfa296.png)

## 動作確認

作成した`Bake & Deploy`パイプラインを、`Start Manual Execution`で動かしてみます！

無事にパイプラインが終了し、

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/f08b51f2-f26a-b8d2-bb4a-270eac0897c2.png)

Load Balancerのエンドポイント:9000にアクセスしてPlayアプリの画面が出ればOKです！

![image](https://qiita-image-store.s3.amazonaws.com/0/38151/45cb6985-cb15-cccd-b98f-caace93c0023.png)

## まとめ
- マシンイメージを利用したデプロイパイプラインの構築が簡単にできてよさそう。
- また今回は単純なBake & Deployする例だけでしたが、パイプライン同士に依存関係をつけたり、Blue-Greenデプロイしたりも簡単にできそうです。