AWS Code Build をｻｸｯと使ってみた

[AWS Code Build](https://aws.amazon.com/jp/blogs/news/aws-codebuild-fully-managed-build-service/) がリリースされました。

travis-ci や circle-ci のようなクラウドのCIサービスですがその特徴はEC2などと同じように従量課金制である点でしょう。1分あたり最低 $0.05 からスタートができます。利用しないときはお金が発生しませんが、大量に利用をするときにはかんたんにスケールアウトが可能なので、ブログにも書かれているように

> 修羅場の時には利用率は100%に達し、未処理のビルドリクエストが増えてしまいます。

という問題が発生しないのでしょう。

そんなわけでまずは使ってみました。

## プロジェクトを作る

![1.png](https://qiita-image-store.s3.amazonaws.com/0/6756/075f4ae8-1c3b-fe76-b142-759ae6ad5ea4.png)

プロジェクト設定画面では、プロジェクトの名前、ソースコードの取得元、利用をする環境、ロールなどが設定できます。

### ソースコード取得元

ソースコードは S3, CodeCommit そして github が選択可能でした。

### 利用をする環境

Ubuntu ベースの環境に ruby, node, go, Android など大抵の言語や環境が整っているようです。また、用意されていない環境でも base を利用して自分で環境の構築を行ったり docker image を利用することでどうとでもできそうです。

### 成果物

成果物はS3のバケットに指定した名前のファイルを保存してくれるようです。

## ビルドの定義を行う

ビルドを行うにはコマンドを記述するか `buildspec.yaml` をソースコードのルートディレクトリに配置することで可能になります。今回は go のリポジトリを試しにビルドしてみました。 [numa08/git-gitlab](https://github.com/numa08/git-gitlab)

```yaml

version: 0.1

phases:
  install:
    commands:
      - sudo apt-get update -y && sudo apt-get install cmake -y      
      - go get github.com/codegangsta/cli
      - wget -O libgit2-0.24.1.tar.gz https://github.com/libgit2/libgit2/archive/v0.24.1.tar.gz
      - tar -xzvf libgit2-0.24.1.tar.gz
      - cd libgit2-0.24.1 && mkdir build && cd build &&  cmake -DTHREADSAFE=ON -DBUILD_CLAR=OFF -DCMAKE_C_FLAGS=-fPIC -DCMAKE_BUILD_TYPE="RelWithDebInfo" -DCMAKE_INSTALL_PREFIX=/usr/local .. && make && sudo make install && sudo ldconfig
      - go get gopkg.in/libgit2/git2go.v24
      - go get github.com/plouc/go-gitlab-client
  build:
    commands:
      - make
  post_build:
    commands:
      - env        
```

travis-ci や circle-ci でおなじみのビルド定義 yaml ですが、ひたすらコマンドをベタ書きしていくタイプのようです。また一つ一つのコマンドは `Dockerfile` の `RUN` のように実行する毎に新しい環境の中で実行されるようなので、 `cd` で作業ディレクトリを変更する場合は `&&` で繋げる必要があるようです。

## ビルドを実行する

[ドキュメントによると](http://docs.aws.amazon.com/codebuild/latest/userguide/how-to-run.html) 現在ビルドの実行は

- AWS のコンソール画面
- AWS CLI
- AWS SDK
- HTTP API

が用意されているようです。githubのwebhookをトリガーにする場合は自分で設定を行う必要があるようですね。今回はコンソール画面から実行をしました。

## ビルド結果

![2.png](https://qiita-image-store.s3.amazonaws.com/0/6756/6f464d44-54fc-10e7-aa13-15b408b50f9f.png)

結構シンプルなビルド画面です。 `buildspec.yaml` で定義をした phase ごとに実行結果や時間を見ることが可能です。ビルド中のログはリアルタイムではなく、定期的に表示されるようです。

また、ビルドログは cloudwatch に保存されます。

## 利用をした感想

個人的に待ちに待った従量課金制のCIサービスです。小さなチームでCIを行う場合クラウドサービスを利用するとどうしても月額料金がお高くなってしまったので、チームの開発ペースに応じて料金が変わる仕組みはありがたいです。

しかし、現時点ではgithubを利用した開発フローの中に組み込むのはちょっと大変なようにも思いました。

まず、ビルド対象のブランチを選択できないようです。どうやら github のデフォルトブランチをビルドするようですがデプロイを行う場合は deploy ブランチなどとチームごとのブランチ戦略に合わせて設定がで切る必要があるかと思います。もしかしたらcodebuild の環境内で git checkout を実行すればよいのかもしれませんが。

また、ビルドの自動化がまだできないようでした。もちろん自分でgithubのwebhookやlambda, apigateway などを設定することで可能にはなりますが、そのあたりの設定やメンテナンスの手間は自動的に行われると嬉しいなぁと思います。

~~そしてなにより、 github の private repository を clone することが現在はできないようです。リポジトリのURLが https で始まるものに自動的になってしまい、 deploy key の設定も行えないようです。~~ cli や http の API からは `https://<username>:<token>@github.com/<owner>/<repo name>` の形式で設定することで、 private repository も clone できるようになるようです。

以上の理由でgithubを利用した開発フローの中に組み込むのは難しいでしょう。しかし、いずれもサービスの中で致命的な問題とは言えません。短期間のうちに修正、改善が行われると思われます。

従量課金制のCIをサービスは小規模のチームでの開発を行う中で経済的に有利になる可能性があります。今後のアップデートに注目をしていきたいですね。