Amazon Web Services ブログ

AWS CodeBuild の新しい Docker サーバー機能で CI/CD パイプラインを高速化

5 月 15 日より、AWS CodeBuild の Docker サーバー機能を使用して、CodeBuild プロジェクト内で直接、永続的な専用 Docker サーバーをプロビジョニングできるようになりました。Docker サーバー機能を使用すると、イメージのビルドをリモートホストに集中化することで Docker イメージのビルドを高速化でき、待機時間を短縮して、全体的な効率を高めることができます。

私のベンチマークでは、この Docker サーバー機能を使用することで、ビルドの合計時間が 24 分 54 秒から 16 秒へと 98% 短縮されました。ここでは、私の AWS CodeBuild プロジェクトを用いて、この機能について簡単に見ていきます。

AWS CodeBuild は、ソースコードをコンパイルし、テストを実行して、デプロイ可能なソフトウェアパッケージを生成する、フルマネージド継続的インテグレーションサービスです。Docker イメージのビルドは、CodeBuild のお客様にとって最も一般的なユースケースの 1 つです。このサービスでは、時間が経過する中で、Docker ビルドのパフォーマンスを改善するために、Docker レイヤーのキャッシュリザーブドキャパシティ機能などの機能をリリースすることで、このエクスペリエンスを徐々に改善してきました。

新しい Docker サーバー機能で、一貫性のあるキャッシュを提供する永続的な Docker サーバーを提供することで、アプリケーションのビルド時間を短縮できます。CodeBuild プロジェクトで有効にすると、専用 Docker サーバーがプロビジョニングされ、Docker レイヤーのキャッシュを維持する永続的なストレージが提供されます。このサーバーは複数の同時 Docker ビルドオペレーションを処理でき、すべてのビルドで同じ集中キャッシュを利用できます。

AWS CodeBuild の Docker サーバーの使用
新しい Docker サーバー機能の利点を示すデモをご紹介します。

このデモでは、公式の AWS CodeBuild 厳選 Docker イメージリポジトリ、具体的には 標準 Ubuntu イメージをビルドするための Dockerfile に基づいて、複雑かつ多層的な Docker イメージを構築します。このイメージには、最新の継続的インテグレーションと継続的デリバリー (CI/CD) パイプラインに必要な多数の依存関係とツールが含まれており、開発チームが定期的に実行する大規模な Docker ビルドの好例となります。


# Copyright 2020-2024 Amazon.com, Inc. or its affiliates.All Rights Reserved.
#
# Amazon ソフトウェアライセンス (以下「ライセンス」という) に基づいてライセンスされています。ライセンスに従わない限り、このファイルを使用してはなりません。
# ライセンスのコピーは、
#
#    http://aws.amazon.com/asl/
#
# またはこのファイルに付属の「license」ファイルにあります。
# このファイルは「現状有姿」で配布されるものであり、明示または黙示を問わず、いかなる種類の保証または条件もありません。
# ライセンスに基づく権限および制限を規定する具体的な文言については、ライセンスを参照してください。
FROM public.ecr.aws/ubuntu/ubuntu:20.04 AS core

ARG DEBIAN_FRONTEND="noninteractive"

# git、SSH、Git、Firefox、GeckoDriver、Chrome、ChromeDriver、stunnel、AWS Tools をインストールし、SSM を設定して、AWS CLI v2、ランタイム用の環境ツール: Dotnet、NodeJS、Ruby、Python、PHP、Java、Go、.NET、Powershell Core、Docker、Composer、および他のユーティリティをインストールします
COMMAND REDACTED FOR BREVITY
# イメージバージョンに固有のランタイムバージョンをアクティブ化します。
RUN n $NODE_14_VERSION
RUN pyenv  global $PYTHON_39_VERSION
RUN phpenv global $PHP_80_VERSION
RUN rbenv  global $RUBY_27_VERSION
RUN goenv global  $GOLANG_15_VERSION

# SSH を設定します
COPY ssh_config /root/.ssh/config
COPY runtimes.yml /codebuild/image/config/runtimes.yml
COPY dockerd-entrypoint.sh /usr/local/bin/dockerd-entrypoint.sh
COPY legal/bill_of_material.txt /usr/share/doc/bill_of_material.txt
COPY amazon-ssm-agent.json /etc/amazon/ssm/amazon-ssm-agent.json

ENTRYPOINT ["/usr/local/bin/dockerd-entrypoint.sh"]

この Dockerfile は、複数のプログラミング言語、ビルドツール、依存関係を備えた包括的なビルド環境を作成します。これはまさに、永続的なキャッシュの利点を享受できるタイプのイメージです。

ビルド仕様 (buildspec) では、docker buildx build . コマンドを使用します:

version: 0.2
phases:
  build:
    commands:
      - cd ubuntu/standard/5.0
      - docker buildx build -t codebuild-ubuntu:latest .

Docker サーバー機能を有効にするには、AWS CodeBuild コンソールに移動し、[プロジェクトを作成] を選択します。既存の CodeBuild プロジェクトを編集する際にも、この機能を有効にできます。

すべての詳細と設定を入力します。[環境] セクションで、[追加設定] を選択します。

その後、下方向にスクロールして [Docker サーバー設定] を見つけ、[このプロジェクトのために Docker サーバーを有効にする] を選択します。このオプションを選択すると、Docker サーバーのコンピューティングタイプの設定を選択できます。設定が完了したら、このプロジェクトを作成します。

ここからは、Docker サーバー機能が実際にどのように機能するのかを見てみましょう。

最初のビルドは、すべての依存関係を最初からダウンロードしてコンパイルする必要があるため、完了までに約 24 分 54 秒かかります。このような複雑なイメージの最初のビルドでは、通常この程度の時間がかかります。

コード変更のない後続のビルドでは、ビルド時間はわずか 16 秒です。これは、98% のビルド時間の短縮となります。

ログを見ると、Docker サーバーではほとんどのレイヤーが永続キャッシュからプルされていることがわかります。

Docker サーバーが提供する永続キャッシュは、ビルド間ですべてのレイヤーを維持します。これは、多くのレイヤーを持つ大規模かつ複雑な Docker イメージで特に役立ちます。このことは、CI/CD パイプラインで多数の Docker ビルドを実行するチームのスループットを Docker サーバーが劇的に増大できることを意味しています。

その他の知っておくべきこと
いくつかの留意点を次に示します:

  • アーキテクチャサポート – この機能は、x86 (Linux) ビルドと ARM ビルドの両方でご利用いただけます。
  • 料金 – Docker サーバー機能の料金の詳細については、「AWS CodeBuild の料金」ページをご覧ください。
  • 利用できるリージョン – この機能は、AWS CodeBuild が提供されているすべての AWS リージョンでご利用いただけます。CodeBuild が利用可能な AWS リージョンの詳細については、AWS リージョンのページをご覧ください。

Docker サーバー機能の詳細については、AWS CodeBuild のドキュメントをご覧ください。

構築がうまくいきますように! –

Donnie Prakoso

原文はこちらです。


ニュースブログはいかがでしたか? こちらの 1 分間のアンケートにぜひご協力ください!

(このアンケートは外部企業に委託して行われます。AWS は、AWS プライバシー通知に記載された内容に従って、お客様の情報を取り扱います。AWS は、このアンケートを通じて収集したデータを所有し、収集した情報をアンケートの回答者と共有することはありません)