0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSで始める30日間CI/CDマスタープログラム - 4日目

Posted at

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プロジェクトを作成します。このプロジェクトが、ビルドプロセス全体を定義するコンテナとなります。

手順

  1. AWSマネジメントコンソールにログイン: CodeCommitにアクセスした時と同じIAMユーザーでログインします。
  2. CodeBuildサービスへ移動: 検索バーで「CodeBuild」と入力するか、[Developer Tools] セクションから選択します。
  3. ビルドプロジェクトの作成:
    • 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は、以下の主要なフェーズで構成されます。

  1. install: 依存関係のインストールなど、ビルド環境の準備を行います。
  2. pre_build: ビルド前のコマンド(例: リンティングチェック、静的解析など)を実行します。
  3. build: 実際のビルドコマンドを実行します(コンパイル、テストなど)。
  4. 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の追加とプッシュ

  1. requirements.txtファイルの作成:
    pytestを依存関係として追加します。

    # requirements.txt
    pytest==7.1.2
    
  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, !"
    
  3. buildspec.ymlファイルの作成:
    上記のbuildspec.ymlの内容をコピーして、プロジェクトのルートディレクトリに配置します。

  4. 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でビルドを実行してみましょう。

手順

  1. CodeBuildコンソールへ戻る: 先ほど作成した my-python-app-build プロジェクトの詳細画面を開きます。
  2. ビルドの開始:
    • 画面右上の「ビルドを開始」ボタンをクリックします。
    • ソースの選択画面で「ブランチ」がmainになっていることを確認し、「ビルドを開始」をクリックします。

ビルド結果の確認

ビルドが開始されると、画面下部に「フェーズの詳細」が表示され、SUBMITTED -> PROVISIONING -> DOWNLOAD_SOURCE -> INSTALL -> BUILD -> UPLOAD_ARTIFACTS -> FINALIZING -> SUCCEEDED (またはFAILED) という流れで進捗を確認できます。

特に注目すべきは、以下の情報です。

  • フェーズの詳細: 各フェーズがどのくらいの時間で実行されたかを確認できます。
  • ビルドログ: CloudWatch Logsへのリンクから、ビルド中のコンソール出力(pytestの実行結果など)を詳細に確認できます。テストが失敗した場合は、ここで原因を特定できます。
  • テストレポート: pytestなどのテスト結果をCodeBuildのテストレポート機能と連携させることで、テスト結果を一覧で視覚的に確認できます。

CodeBuildのテストレポート機能:
buildspec.ymlでテスト結果ファイル(例えばpytestjunitxml形式)を出力するように設定し、それを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の全自動化がいよいよ見えてきます。お楽しみに!


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?