4日目: 初めてのビルド自動化:AWS CodeBuildでプロジェクトをビルドする
はじめに:コードから成果物へ
昨日は、CI/CDの最初のステップとしてAWS CodeCommitを使ったソースコード管理の方法を学びました。コードがリポジトリにプッシュされたら、次はそのコードをビルドし、テストするプロセスを自動化する必要があります。この中核を担うのが、今回ご紹介するAWS CodeBuildです。
私もPythonアプリケーションを開発していた際、以前はローカル環境で手動でビルドやテストを行っていました。しかし、CodeBuildを導入することで、この煩雑な作業から解放され、コードをプッシュするだけで自動的にアプリケーションがビルドされ、テスト結果が返ってくるようになりました。これは開発のスピードと信頼性を飛躍的に向上させるものでした。
本記事では、このCodeBuildを使って、Pythonプロジェクトをビルド・テストする基本的な流れを解説します。CodeBuildプロジェクトの作成から、重要なビルド定義ファイル buildspec.yml
の書き方まで、実践的な内容をステップ・バイ・ステップで見ていきましょう。
AWS CodeBuildとは?改めてその役割を確認
AWS CodeBuildは、フルマネージドなビルドサービスです。CI/CDパイプラインにおいて、ソースコードをコンパイル、テスト、そしてパッケージ化する役割を担います。
CodeBuildの主な利点は以下の通りです。
- サーバー管理不要: ビルドサーバーのプロビジョニング、パッチ適用、スケール調整といった運用作業が一切不要です。
- オンデマンドなスケーラビリティ: ビルドリクエストに応じて、必要な分だけキャパシティが自動的にスケールします。ビルドが実行されていない時は費用が発生しません。
- 多様なビルド環境: Python、Java、Node.js、Goなど、様々な言語やフレームワークに対応したビルド環境をすぐに利用できます。カスタム環境もDockerイメージとして提供可能です。
- 詳細なレポート機能: ビルドログやテスト結果をCloudWatch LogsやS3に出力でき、トラブルシューティングや品質管理に役立ちます。
CodeBuildは、CI/CDパイプラインのビルドステージおよびテストステージの実行エンジンとして機能します。
1. CodeBuildプロジェクトの作成
AWSマネジメントコンソールから、CodeBuildプロジェクトを作成します。このプロジェクトが、ビルドプロセス全体を定義するコンテナとなります。
手順
- AWSマネジメントコンソールにログイン: CodeCommitにアクセスした時と同じIAMユーザーでログインします。
- CodeBuildサービスへ移動: 検索バーで「CodeBuild」と入力するか、[Developer Tools] セクションから選択します。
-
ビルドプロジェクトの作成:
- CodeBuildのダッシュボードで「ビルドプロジェクトを作成」をクリックします。
-
プロジェクト名: 任意の名前を入力します(例:
my-python-app-build
)。
ソースプロバイダーの設定
次に、ビルド対象となるソースコードがどこにあるかをCodeBuildに教えます。
-
ソースプロバイダー:
AWS CodeCommit
を選択します。 -
リポジトリ: 昨日の記事で作成したリポジトリ名(
my-python-app
)を選択します。 -
ブランチ:
main
を選択します。
この設定により、CodeBuildはCodeCommitのmain
ブランチにあるコードをビルド対象として認識します。
環境の設定
ビルドを実行する環境を設定します。
-
環境イメージ:
マネージド型イメージ
を選択します。 -
オペレーティングシステム:
Ubuntu
を選択します。 -
ランタイム:
Standard
を選択します。 -
イメージ:
aws/codebuild/standard:5.0
(または最新バージョン) を選択します。このイメージには、Pythonなど多くのツールがプリインストールされています。 -
サービスロール:
新しいサービスロール
を選択します。自動的にcodebuild-my-python-app-build-service-role
のような名前のIAMロールが作成されます。このロールに、ビルドに必要なS3へのアクセス権限などが自動で付与されます。
ビルド仕様の設定
ビルドプロセスそのものを定義します。ここでは、CodeBuildのコア機能である**buildspec.yml
**ファイルを使用します。
-
ビルド仕様:
ビルド仕様ファイルを使用する
を選択します。 -
ビルド仕様のファイル名:
buildspec.yml
と入力します。この名前は慣例であり、buildspec.yml
というファイル名でソースコードリポジトリのルートに配置することになります。
ログの設定
ログ出力先を設定します。
-
CloudWatch Logs
にチェックを入れます。これにより、ビルドの実行ログをCloudWatchで確認できます。
すべての設定が完了したら、「ビルドプロジェクトを作成」をクリックします。
これで、CodeBuildプロジェクトが作成されました。しかし、まだビルドを実行することはできません。なぜなら、まだbuildspec.yml
ファイルが存在しないからです。
2. buildspec.ymlの作成と理解
CodeBuildで最も重要なのが、 buildspec.yml
ファイルです。これは、ビルドプロセスの各フェーズで実行すべきコマンドを定義するYAML形式のファイルです。
buildspec.yml
は、以下の主要なフェーズで構成されます。
-
install
: 依存関係のインストールなど、ビルド環境の準備を行います。 -
pre_build
: ビルド前のコマンド(例: リンティングチェック、静的解析など)を実行します。 -
build
: 実際のビルドコマンドを実行します(コンパイル、テストなど)。 -
post_build
: ビルド後のクリーンアップや、成果物のアップロードなどを行います。
Pythonプロジェクト向けのbuildspec.yml
例
昨日のmy-python-app
リポジトリに、以下のbuildspec.yml
ファイルを追加してみましょう。
buildspec.yml
version: 0.2
phases:
install:
runtime-versions:
python: 3.9
commands:
# プロジェクトの依存関係をインストール
- pip install -r requirements.txt
# テストライブラリのインストール
- pip install pytest
pre_build:
commands:
# (任意)コードの静的解析(リンティング)を実行
- echo "Running linting checks..."
- # flake8 .
build:
commands:
# 単体テストを実行
- echo "Running unit tests with pytest..."
- pytest
post_build:
commands:
- echo "Build and tests completed successfully!"
- # 必要であれば、デプロイ用の成果物を作成・アップロードする
# ビルド成果物(Artifacts)の指定
# デプロイ対象のファイルやディレクトリを指定する
# artifacts:
# files:
# - 'path/to/my/app.zip'
# discard-paths: yes
このbuildspec.yml
ファイルには、pytest
を使ったPythonプロジェクトのテスト自動化に必要なコマンドが含まれています。
-
install
フェーズでは、python: 3.9
を指定してPython 3.9環境を準備し、requirements.txt
から依存ライブラリをインストールします。また、pytest
もこの段階でインストールします。 -
pre_build
フェーズは、静的解析などの準備作業を記述する場所です。(この例ではコメントアウトしています) -
build
フェーズでは、pytest
コマンドを実行して単体テストを走らせます。 -
post_build
フェーズは、ビルドが成功した後の後処理を記述します。デプロイに必要な成果物(例えばLambda関数のZIPファイル)を作成する場合は、ここでそのコマンドを実行します。
buildspec.yml
の追加とプッシュ
-
requirements.txt
ファイルの作成:
pytest
を依存関係として追加します。# requirements.txt pytest==7.1.2
-
test_hello.py
ファイルの作成:
昨日のhello.py
に対するテストコードを作成します。# test_hello.py from hello import greet def test_greet_with_name(): assert greet("Alice") == "Hello, Alice!" def test_greet_with_empty_name(): assert greet("") == "Hello, !"
-
buildspec.yml
ファイルの作成:
上記のbuildspec.yml
の内容をコピーして、プロジェクトのルートディレクトリに配置します。 -
GitコマンドでCodeCommitにプッシュ:
git add . git commit -m "Add buildspec.yml, requirements.txt, and tests" git push origin main
これで、CodeCommitリポジトリにbuildspec.yml
ファイルが追加されました。
3. ビルドの実行と結果の確認
buildspec.yml
がリポジトリにプッシュされたので、いよいよCodeBuildでビルドを実行してみましょう。
手順
-
CodeBuildコンソールへ戻る: 先ほど作成した
my-python-app-build
プロジェクトの詳細画面を開きます。 -
ビルドの開始:
- 画面右上の「ビルドを開始」ボタンをクリックします。
- ソースの選択画面で「ブランチ」が
main
になっていることを確認し、「ビルドを開始」をクリックします。
ビルド結果の確認
ビルドが開始されると、画面下部に「フェーズの詳細」が表示され、SUBMITTED
-> PROVISIONING
-> DOWNLOAD_SOURCE
-> INSTALL
-> BUILD
-> UPLOAD_ARTIFACTS
-> FINALIZING
-> SUCCEEDED
(またはFAILED
) という流れで進捗を確認できます。
特に注目すべきは、以下の情報です。
- フェーズの詳細: 各フェーズがどのくらいの時間で実行されたかを確認できます。
-
ビルドログ: CloudWatch Logsへのリンクから、ビルド中のコンソール出力(
pytest
の実行結果など)を詳細に確認できます。テストが失敗した場合は、ここで原因を特定できます。 -
テストレポート:
pytest
などのテスト結果をCodeBuildのテストレポート機能と連携させることで、テスト結果を一覧で視覚的に確認できます。
CodeBuildのテストレポート機能:
buildspec.yml
でテスト結果ファイル(例えばpytest
のjunitxml
形式)を出力するように設定し、それをreports
セクションで指定することで、テストレポートをCodeBuildコンソール上で確認できるようになります。
# buildspec.ymlの例(テストレポート連携)
# ...
phases:
build:
commands:
- pytest --junitxml=reports/junit_report.xml
# ...
reports:
pytest_reports:
files:
- 'reports/junit_report.xml'
file-format: JUNITXML
このように設定することで、ビルドが失敗した場合でも、どのテストケースが失敗したのかをCodeBuildコンソール上で即座に確認できます。
まとめ:CodeBuildでビルド・テストの自動化を習得
本日は、AWS CodeBuildを使ってPythonプロジェクトのビルドとテストを自動化する方法を学びました。CodeBuildプロジェクトの作成から、ビルドの肝となるbuildspec.yml
ファイルの書き方、そしてビルド結果の確認まで、一連の流れを体験しました。
CodeBuildは、CI/CDパイプラインの中核として、コード変更のたびに自動的にビルドとテストを実行し、フィードバックを迅速に提供してくれます。これにより、バグを早期に発見し、コードの品質を高いレベルで維持することが可能となります。
特に、グローバルなAI企業では、開発のスピードと品質の両方が求められます。CodeBuildのようなツールでCI(継続的インテグレーション)を確立することは、この要求に応えるための不可欠なステップです。
明日は、CodeBuildで生成された成果物を、実際にサーバーやサービスにデプロイするAWS CodeDeployについて解説します。ビルドからデプロイまで、CI/CDの全自動化がいよいよ見えてきます。お楽しみに!