Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CI環境としてのAWS CodeBuild / AWS CodeBuild as a CI s...

Mynavi System
September 25, 2019

CI環境としてのAWS CodeBuild / AWS CodeBuild as a CI software

Mynavi System

September 25, 2019
Tweet

More Decks by Mynavi System

Other Decks in Technology

Transcript

  1. • 継続的インテグレーション(Continuous Integration)を提供する サービスの総称
 • 定期的(git push時やブランチのマージなど)にビルドやテストを 自動で実行してくれる
 • TravisCI,

    Jenkins, Drone CIなど様々なCIサービスがある
 お!テスト やっておき ますね
 CIサービスとは
 CI導入前
 手動で50パターンのテス トしてエビデンスを残す の辛い!
 あ!10パターン目のテスト の手順間違ってた!
 やり直しだ〜やだ〜 
 CI導入後
 git push
 (ソースコードを 保存)

  2. IaaS上にOSSのCI環境を構築
 • OSS(オープンソース)のためIaaSの月額料金のみで済む 
 • Drone CIならGitHub Enterprise(以下、GHE)にも対応 
 •

    CIを構築するための学習コストとの兼ね合いとなるべく早めに 解決するよう要望が来ていたため断念

  3. CodeBuild良さそう!!
 • 他チームを気にせずテストを実行できそう
 • 最大で見積もった月額の概算費用が約9,252円
 ◦ 予算内に収まるレベル
 • GHEにも対応
 •

    普段からAWSを利用しているため請求先がまとまる
 • テストを実行するビルド数(CircleCIのコンテナに相当)が最低 でも20
 ◦ 開発メンバーが数人増えてもテストの実行待ちがほぼ発 生しないと判断 

  4. CircleCIとの主な違い
 • AWS CodeBuildではbuildspec.ymlにテストで実行したいコマン ドを書いていく
 ◦ buildspec.ymlはCircleCIで言うconfig.yml
 ◦ 「buildspec」というファイル名は変更可能
 •

    Dockerイメージの選択はAWS CodeBuild側で設定
 • IAMの設定も必要
 • CIの実行ログはS3またはCloud Watch Logsで保存
 ◦ マイナビニュースではCloud Watch Logsを選定
 ◦ ログローテートは2週間で設定

  5. dindでコンテナ内にさらに複数コンテナを配置
 • dind(Docker in Docker)とは?
 ◦ Dockerコンテナの中でさらにDockerコンテナを配置する手 法
 • dind対応のDockerイメージはDocker

    HubのDocker Official Imagesで配布
 ◦ https://hub.docker.com/_/docker?tab=tags
 • ビルドプロジェクトのDockerイメージはdind対応のDockerイ メージを指定する
 • 特権付与にチェックを入れる必要がある
 
 

  6. これを踏まえて大まかな作業手順
 • CodeBuildで使うdocker-compose.ymlを用意
 ◦ ローカル開発環境で利用しているdocker-compose.ymlを ベースに作成
 ▪ 例
 • Dockerイメージの取得先をECRを指定


    • working_dirをRailsプロジェクト直下に指定
 • buildspec.ymlをRailsプロジェクト直下に作成
 • AWS Console上でビルドプロジェクトを作成

  7. 導入した結果
 • 他チームの開発業務の進捗の遅延が解消し、目的は達成した 
 • マイナビニュース側の開発効率が上がった
 ◦ 他チームのCIの利用状況を気にしなくて良くなった
 ◦ テストの待機が無くなった


    • GHEに対応
 • 月額料金が想定よりも安く済んだ
 ◦ 約1,534円/月(想定よりも約7,718円⬇)
 • テスト実行時間が5分増えた(25分に...) 
 アレ?

  8. 速度改善の結果
 約25分→約13分代と約半分になった
 • install(docker-composeやaws-cliのインストール)
 ◦ 2分
 • pre_build(各コンテナのpull、前回キャッシュしたライブラリを利 用)
 ◦

    1分
 • build(テストの実行)
 ◦ 10分
 • post_build(利用したライブラリをキャッシュのディレクトリに戻 す)
 ◦ 数秒

  9. CI環境として使ってみて
 当初の目的は達成したが、導入するかどうかは現状の開発環境によっ てよく検討した方が良い
 • 単一のDockerイメージで済む場合
 ◦ ビルドプロジェクトで対象のDockerイメージを選択し、 buildspec.ymlを作成すれば、すぐに構築できそうではある
 • 複数のDockerイメージが必要な場合(大抵はこっち)


    ◦ 今回はローカル開発環境としてdocker-composeを使っていたな ど材料が既にあったため、そこまで苦労なくビルドプロジェクトが 作れたという点がある
 ◦ 無い場合は「CodeBuild用にdocker-composeを1から作る必要 がある or 別のCIサービスを利用する」になりそう 

  10. 今後
 • 引き続き速度改善は少しずつ進めていく
 • これからプロジェクトが増える場合はDrone CIなどのOSSのCI環境 の構築や他のCIサービスの導入も検討する
 ◦ CodeBuildで各プロジェクト専用のCI環境を確かに作ることがで きる


    ◦ 逆に、各プロジェクト用にdocker-composeを作る必要があり、プ ロジェクト共通のCI環境(テストを並列実行できる)を構築する方 がコストが掛からずに済む場合がありそう
 ◦ CircleCIにPERFORMANCEプランがいつの間にかできていたた め再度検討してみても良い

  11. 参考 • 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/ 

  12. 参考 • 速度改善を実施した時に見たもの
 ◦ “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