builderscon2017/AWS CodeBuild を使ってものすごい並列数で CI を実行しよう
@ssig33さん
2017/08/05 13:30-
akix.icon感想
事前にタイトルだけ見た時の印象と比べて、実際に話を聞くと結構大変そうだと思った
CodeBuildを使ってみたい気持ちがわいてきた
-.icon
まえおき
ターゲット
CIが長くてつらい人
Dockerで無茶したい人
Amazon ECSで頑張ってる人
RailsでのDockerベース 分散テストに興味ある人
話さないこと
CIの基礎
テスト手法
デプロイ
問題意識
ソフトウェア開発は簡単に
「フロント疲れ」とかも聞かなくなってきた
巨大化・複雑化するUI
テストは簡単になった?
最初から難しくはなかった
E2Eテストがかかれまくるようになった
capybaraとか使うようなやつ
JavaScriptの内部状態をテストするより、E2Eテストの方が簡単
PhantomJSは滅んだのでHeadlessChrome一択
結果
テスト頑張って書いても実際のユーザーケースなので15秒ぐらいかかったりする
単純に直列に実行するとCIに数時間
2014年のクックパッドでも数時間かかってたと聞いたことがある
長大なテストが小さい組織にもやってくる時代
当然並列ビルド
インフラ自分で組む?
テスト実行環境は本番環境と同等の信頼性が必要
本番がヤバい時にCIスキップとかダメだし
不用意な運用はダメ
Amazon CodeBuild
なにではないか
TravisCI/Jenkinsを代替する者では無い
色んなシステムから使えるJenkinsのSlaveのようなもの
buildspec.ymlを書いてWebUIから「ビルドの開始」ボタンを押すとログが記録されて実行できる
AWS CodeBuildに無いもの
リポジトリを監視してmasterの最先端をビルド
Pull Requestを監視
とかではない
常識的な使い方の場合
AWS CodeStar
ダメ
Atlassianが統合されてる
AWS CodeBuild Plugin for Jenkins
Jenkins側で実行してくれるやつ
Pull Reqを受け手ビルドしたいだけならアリ
スマニューの人がめっちゃ直して綺麗なコードになってる
AWS CodeBuildはすぐに起動するDockerリソースプール
しかも時間課金、1分$0.005
コンテナは永続化しない(3時間で強制終了)
AWS Batch
エンプラっぽいタスクランナー
銀行が使うようなやつ
MS Azure Container Instanceというのが最近リリースした
秒課金(AWSより柔軟)
Azureのコンパネつらい
Azureはコンテナ永続化、ポート開放もできるのでデプロイも可
1秒課金なので1秒未満でコンテナを終了させると無料
即起動 -> Docker Run -> 即死がやりやすい時代
1テスト1実行環境でやったら、最強なのでは?
☞ 実際は結構大変
全体の流れ
1. Travisでレポジトリ監視
2. TravisでDocker build & push
push先はAmazon ECSが楽
3. Travisから適宜大量にCodeBuildたてる
4. Travis側でAPIポーリングするかなにかして実行状況監視
50並列まわすとGithubに50アクセスが来て死ぬ
25並列でGithubにキックされる
CodeBuildは時間課金なので
CodeBuildは成果物のキャッシュ機構がなかった
3回で50ドルとかになっちゃった
TravisCIには依存ライブラリとかのキャッシュ機構とかある
code:travis.yml
cache:
directries:
- vendor/bundle
みたいなやつ
Docker Imageを複数回に分けてビルドする
https://gyazo.com/9976284f2e5ec09c16a067462a9a918d
テストの実行
CodeBuildのAPI経由で環境変数を与えながらDockerImageを起動する
コンテナ実行環境のプロビジョニング自体が失敗することがあり、リトライ処理を書く必要がある
並列70を超えると失敗しやすくなる
70個あげて5分後に70個とかで合計1000個とかでも大丈夫
wata727/drunker
プロジェクトディレクトリを.tar.gzで固める
docker hubにあるありものイメージでdocker runすれば動くようなプロジェクトだとよさそう
使ってるツールを隠す必要ないならpublicのdocker hubに置いちゃうのもアリ
$0.005/1min. = $0.3/h
m4.xlargeは$0.28/hと変わらなかったりする
まとめ
Dockerリソースプール的なサービスが出てきている
自分でテスト実行用クラスタを構築する必要がなくなってきてる
並列数を従来より上げても大丈夫なので上げましょう
Q&A
Hello worldだけ出すならどれぐらいCodeBuildで時間かかる?
実行環境のプロビジョニング1分
終了待ち時間で30秒ぐらい
終了後から実行してる間なので1分半まるまる課金されるわけではない
テストファイルごとに建てるとよいのではという話だけど1000/2000あるとどうなるか
ファイルサイズが平均化されるような分散の仕方をまずはしている
一般的な分散テストと同じ知見が関わってそう
直列何時間がどれぐらい縮むか?
TravisCIで25分
昨日やったところ8分
60並列だと安定、70並列でエラー:失敗の要因は?
プロビジョニングの失敗について
「失敗」ってひとこと出るだけ
時間が25分->8分、コスト的には倍になったりしてる?
数日しか経ってないのでコストは未算出
結構高くなりそう
CodeBuildの料金は上がるけど、TravisCIは下げられるのでは?
実際はTravis特別プランを使っていて値段が分からない