Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
CI環境としてのAWS CodeBuild / AWS CodeBuild as a CI software
Mynavi System
September 25, 2019
Technology
0
1k
CI環境としてのAWS CodeBuild / AWS CodeBuild as a CI software
Mynavi System
September 25, 2019
Tweet
Share
More Decks by Mynavi System
See All by Mynavi System
マイナビニュースがチーム開発をするためにやってきたこと / What Mynavi News did to do team development
mynavi_sys
0
1.6k
マイナビ学生の窓口 半内製化の取り組みを振り返る / A retrospective investigation of our effort of semi-insourcing
mynavi_sys
0
1.3k
ライフメディアにおけるプライベートDMPの取り組み / mynavi-dmp-lifemedia
mynavi_sys
0
350
マイナビのシステム部門のご紹介 / Introduction of Mynavi Engineering Teams
mynavi_sys
0
290
Webページ・スピード改善 / Webpage speed improvement
mynavi_sys
0
90
マイナビミドルシニアのプロダクトたち / Mynavi Middle Senior products
mynavi_sys
0
110
マイナビクラウドとその中の人たち / Mynavi Cloud and Insider
mynavi_sys
0
520
若手エンジニアと行くマイナビ賃貸のクラウド化への道 / Mynavi Chintai Cloudization with Young Engineer
mynavi_sys
0
230
「学生の窓口」の半内製化の取り組みについて / Gakumado semi-manufacturing
mynavi_sys
0
91
Other Decks in Technology
See All in Technology
Steps toward self-service operations in eureka
fukubaka0825
0
910
[SRE NEXT 2022]組織に対してSREを適用するとはどういうことか
srenext
0
460
Remixの凄みを紹介したい
aiji42
3
1.9k
GitHub Actionsを使用してGoogle Play Consoleに自動アップロード
takenaga7
0
230
Poolにおける足を止めないシステム基盤構築
winebarrel
3
1.1k
Spotify物理コントローラーがほしい
miso
0
170
Data-Driven Healthcare - Techplay
kotaroito
0
120
Who owns the Service Level?
chaspy
5
1.3k
Oracle Database Technology Night #55 Oracle Autonomous Database 再入門
oracle4engineer
PRO
1
140
アルプの 認証/認可分離戦略と手法
ma2k8
PRO
2
360
Building smarter apps with machine learning, from magic to reality
picardparis
4
3.1k
1,000万人以上が利用する「家族アルバム みてね」のSRE組織は4年間でどのように作られてきたのか/SRE NEXT 2022
isaoshimizu
6
3.4k
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
21
5.4k
In The Pink: A Labor of Love
frogandcode
130
21k
No one is an island. Learnings from fostering a developers community.
thoeni
9
1.1k
Atom: Resistance is Futile
akmur
255
20k
Side Projects
sachag
449
37k
Designing on Purpose - Digital PM Summit 2013
jponch
106
5.6k
Building a Scalable Design System with Sketch
lauravandoore
447
30k
Designing with Data
zakiwarfel
91
3.9k
Automating Front-end Workflow
addyosmani
1351
200k
How GitHub (no longer) Works
holman
296
140k
Building Your Own Lightsaber
phodgson
94
4.6k
The Language of Interfaces
destraynor
148
20k
Transcript
CI環境としての AWS CodeBuild 〜構築して得たこと・速度改善を色々やってみた話〜 岡部恭平 / Mynavi Corporation 2019.9.25 シス担ミートアップ#3
IT戦略事業部 IT開発統括部 ITマネジメント2部 開発1課(マイナビニュース) 岡部恭平 @okabeeeat Webアプリケーションエンジニア
None
マイナビニュース ・ビジネスパーソンのON/OFF、男女を問わ ず、幅広いジャンルの情報を提供する総合 ニュースメディア ・ニュースに限らず、役立つノウハウや体験 レポート、まじめなレビュー、柔らかい記事 から硬派な記事まで網羅 その先を伝える総合情報サイト
開発言語 コミュニケーション・情報共有 開発支援 インフラ マイナビニュースを支える技術
本日の内容 • CodeBuildでCI環境を構築してみた • 速度改善方法の紹介 • CI環境として使ってみて • まとめ
本日の内容 • CodeBuildでCI環境を構築してみた • 速度改善方法の紹介 • CI環境として使ってみて • まとめ
背景 • マイナビではCIサービスとしてCircleCIを利用している ◦ BitBucket Pipelinesを使っているチームもある • CircleCIはマイナビニュースだけではなく、他のチームも利用し ている
• 継続的インテグレーション(Continuous Integration)を提供する サービスの総称 • 定期的(git push時やブランチのマージなど)にビルドやテストを 自動で実行してくれる • TravisCI,
Jenkins, Drone CIなど様々なCIサービスがある お!テスト やっておき ますね CIサービスとは CI導入前 手動で50パターンのテス トしてエビデンスを残す の辛い! あ!10パターン目のテスト の手順間違ってた! やり直しだ〜やだ〜 CI導入後 git push (ソースコードを 保存)
CIでのテスト実行の様子 • マイナビニュースの場合、約1400パターンのテストが定期的に 実行される • 人間が手動で都度都度テストをしなくて済む • テストがOKにならないと本番リリースできない
うおお〜1400パターンのテ ストを漏れなく実行〜 記事タイトルは 必須であること メールアドレスは二 重登録できないこと
背景 • マイナビではCIサービスとしてCircleCIを利用している ◦ BitBucket Pipelinesを使っているチームもある • CircleCIはマイナビニュースだけではなく、他のチームも利用し ている
つまり... • 他チームもCircleCIを利用しているため、テストが実行待ち(渋 滞)になり、他チームの開発業務の進捗が遅延する問題が発 生した
目的 他チームの開発業務に支障が 無いようなCI環境を作る
対策案を考えてみた • CircleCIの契約コンテナ数を増やす • IaaS上にOSSのCI環境を構築 • マイナビニュース側が他のCIサービスへ移行
CircleCIの契約コンテナ数を増やす • 一番簡単で作業工数が少ない方法 • 1コンテナあたり、目安50$(約5,509円)/月かかる(当時) • どれくらいコンテナ数を増やすか・月額料金をどのように事業 部毎に分割して支払うかなどの調整コストが掛かると予見した ため断念
IaaS上にOSSのCI環境を構築 • OSS(オープンソース)のためIaaSの月額料金のみで済む • Drone CIならGitHub Enterprise(以下、GHE)にも対応 •
CIを構築するための学習コストとの兼ね合いとなるべく早めに 解決するよう要望が来ていたため断念
マイナビニュースが他のCIサービスへ移行 • 他のCIサービスを比較した結果AWS CodeBuildを選定 AWS CodeBuildとは • AWSの完全フルマネージドのビルドサービス • ビルド環境の構築が主な利用例だが、テスト実行も可能
• 並列でのテスト実行が可能 • 従量課金制
CodeBuild良さそう!! • 他チームを気にせずテストを実行できそう • 最大で見積もった月額の概算費用が約9,252円 ◦ 予算内に収まるレベル • GHEにも対応 •
普段からAWSを利用しているため請求先がまとまる • テストを実行するビルド数(CircleCIのコンテナに相当)が最低 でも20 ◦ 開発メンバーが数人増えてもテストの実行待ちがほぼ発 生しないと判断
CircleCIとの主な違い • AWS CodeBuildではbuildspec.ymlにテストで実行したいコマン ドを書いていく ◦ buildspec.ymlはCircleCIで言うconfig.yml ◦ 「buildspec」というファイル名は変更可能 •
Dockerイメージの選択はAWS CodeBuild側で設定 • IAMの設定も必要 • CIの実行ログはS3またはCloud Watch Logsで保存 ◦ マイナビニュースではCloud Watch Logsを選定 ◦ ログローテートは2週間で設定
というわけでやってみる
あれ...?
Dockerイメージが1個しか選べない!?
CodeBuildはDockerイメージを一つしか選択できない • CircleCI利用時はconfig.ymlでAmazon ECRにある複数の Dockerイメージを設定し、テストを実行していた ◦ 逆に、単一のDockerイメージで済むRailsプロジェクトなら直 ぐにビルドプロジェクトが作成できる • 複数のDockerイメージを選択できるビルドプロジェクトは作れ
ないだろうか?
None
コンテナの中に複数のコン テナを配置すれば良いので は? ・・・
dindでコンテナ内にさらに複数コンテナを配置 • dind(Docker in Docker)とは? ◦ Dockerコンテナの中でさらにDockerコンテナを配置する手 法 • dind対応のDockerイメージはDocker
HubのDocker Official Imagesで配布 ◦ https://hub.docker.com/_/docker?tab=tags • ビルドプロジェクトのDockerイメージはdind対応のDockerイ メージを指定する • 特権付与にチェックを入れる必要がある
dind対応のDockerイメージを指定(一例) 特権付与にチェックを入れる
これを踏まえて大まかな作業手順 • CodeBuildで使うdocker-compose.ymlを用意 ◦ ローカル開発環境で利用しているdocker-compose.ymlを ベースに作成 ▪ 例 • Dockerイメージの取得先をECRを指定
• working_dirをRailsプロジェクト直下に指定 • buildspec.ymlをRailsプロジェクト直下に作成 • AWS Console上でビルドプロジェクトを作成
buildspec.yml(一例)
CodeBuild移行前
CodeBuild移行後
導入した結果 • 他チームの開発業務の進捗の遅延が解消し、目的は達成した • マイナビニュース側の開発効率が上がった ◦ 他チームのCIの利用状況を気にしなくて良くなった ◦ テストの待機が無くなった
• GHEに対応 • 月額料金が想定よりも安く済んだ ◦ 約1,534円/月(想定よりも約7,718円⬇) • テスト実行時間が5分増えた(25分に...)
導入した結果 • 他チームの開発業務の進捗の遅延が解消し、目的は達成した • マイナビニュース側の開発効率が上がった ◦ 他チームのCIの利用状況を気にしなくて良くなった ◦ テストの待機が無くなった
• GHEに対応 • 月額料金が想定よりも安く済んだ ◦ 約1,534円/月(想定よりも約7,718円⬇) • テスト実行時間が5分増えた(25分に...) アレ?
本日の内容 • CodeBuildでCI環境を構築してみた • 速度改善方法の紹介 • CI環境として使ってみて • まとめ
現状の確認 buildspec.ymlで各フェーズの実行時間は以下の通り • install(docker-composeやaws-cliのインストール) ◦ 約2分 • pre_build(各コンテナのイメージをpull) ◦ 約1分
• build(テストの実行) ◦ 約22分
試してみた速度改善 • ローカルキャッシュ機能を使う ◦ DockerLayerCacheをオン ◦ SourceCacheをオン ◦ CustomCacheをオン •
コンピューティングタイプを上げる
DockerLayerCacheをオン • Dockerイメージのレイヤーをキャッシュする • buildの実行時間が約9分間短縮した⬇ • キャッシュが原因でテストが落ちるようになった場合は 「docker-compose down -v」などのコマンドをテストの実行コマ
ンドの前に追加しておく ◦ 例: minioなどのバケットを作成するコマンドがbuildspec.yml にあるなど
SourceCacheをオン • コミット間の変更のみのソースコードがpullされる • 設定はしてみたが、あまり速度改善は見込めなかった ※あくまでマイナビニュースの場合
CustomCacheをオン • buildspec.ymlで指定したディレクトリをキャッシュする • 今回は以下のライブラリをキャッシュした ◦ vender/bundle ◦ node_modules •
buildの実行時間が約2分間短縮した⬇
コンピューティングタイプを上げる • ビルドプロジェクトで使用可能なメモリ、vCPU、およびディスク スペースを上げる • buildの実行時間が2分間短縮した⬇
速度改善の結果 約25分→約13分代と約半分になった • install(docker-composeやaws-cliのインストール) ◦ 2分 • pre_build(各コンテナのpull、前回キャッシュしたライブラリを利 用) ◦
1分 • build(テストの実行) ◦ 10分 • post_build(利用したライブラリをキャッシュのディレクトリに戻 す) ◦ 数秒
その他速度改善ができそうなところ • コンピューティングタイプをさらに上げる • Rails(アプリケーション)周り ◦ アプリケーションプリローダー(Spring)でのテストの実行 ◦ slow testをひたすら改善...etc
しかし... • ローカルキャッシュはビルドホスト内に保持するキャッシュのた め、以下の場合は効かない場合がある ◦ ビルドの(テストを実行する)間隔が空いた場合 ◦ ビルド用のDockerコンテナが別のホストで実行される場合 (ビルドの並列度が高いなど)
• 恒久的にキャッシュしたい場合は従来通りのS3キャッシュモー ドを検討する必要がある
本日の内容 • CodeBuildでCI環境を構築してみた • 速度改善方法の紹介 • CI環境として使ってみて • まとめ
CI環境として使ってみて 当初の目的は達成したが、導入するかどうかは現状の開発環境によっ てよく検討した方が良い • 単一のDockerイメージで済む場合 ◦ ビルドプロジェクトで対象のDockerイメージを選択し、 buildspec.ymlを作成すれば、すぐに構築できそうではある • 複数のDockerイメージが必要な場合(大抵はこっち)
◦ 今回はローカル開発環境としてdocker-composeを使っていたな ど材料が既にあったため、そこまで苦労なくビルドプロジェクトが 作れたという点がある ◦ 無い場合は「CodeBuild用にdocker-composeを1から作る必要 がある or 別のCIサービスを利用する」になりそう
今後 • 引き続き速度改善は少しずつ進めていく • これからプロジェクトが増える場合はDrone CIなどのOSSのCI環境 の構築や他のCIサービスの導入も検討する ◦ CodeBuildで各プロジェクト専用のCI環境を確かに作ることがで きる
◦ 逆に、各プロジェクト用にdocker-composeを作る必要があり、プ ロジェクト共通のCI環境(テストを並列実行できる)を構築する方 がコストが掛からずに済む場合がありそう ◦ CircleCIにPERFORMANCEプランがいつの間にかできていたた め再度検討してみても良い
本日の内容 • CodeBuildでCI環境を構築してみた • 速度改善方法の紹介 • CI環境として使ってみて • まとめ
まとめ • CodeBuildでCI環境を構築した ◦ 他チームの開発業務の進捗の遅延が解消し、テストの待 機状態も解消した • ローカルキャッシュ機能を使い、約半分のテスト実行時間になった ◦ ローカルキャッシュ機能は効かない場合がある
◦ アプリケーション周りでの速度改善もまだまだできる • CodeBuildによるCI環境の構築は、現状の開発環境の状態と課題を 整理してから検討する
参考 • CodeBuildでCI環境を構築時に見たもの ◦ “AWS CodeBuild とは”. AWS CodeBuild. https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/welcome.html
◦ “CodeBuild の Docker サンプル”. AWS CodeBuild. https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker.html ◦ “Using Docker-in-Docker for your CI or testing environment? Think twice.”. ~jpetazzo. https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ ◦ “CircleCI 2.0の処理をAWS CodeBuildで実行する”. MMMブログ. https://blog.mmmcorp.co.jp/blog/2018/04/14/circleci2codebuild/ ◦ “CodeBuild における DockerInDocker(dind) の活用”. ビジネス on IT. https://www.business-on-it.com/2004-aws-codebuild-dind/
参考 • 速度改善を実施した時に見たもの ◦ “CodeBuild でキャッシングをビルドする”. AWS CodeBuild. https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-caching.html
◦ “docker buildを高速化!CodeBuildのローカルキャッシュ機能を試してみる”. DevelopersIO. https://dev.classmethod.jp/cloud/aws/codebuild-local-cache/ ◦ “AWS CodeBuildのローカルキャッシュのCustom cacheでnode_modulesやvendorをキャッシュする”. moyashidaisuke's diary. https://www.moyashidaisuke.com/entry/2019/03/19/205243
ご清聴ありがとうございました