💭

AWS CodeBuild で PR の差分を取得する

2024/06/26に公開

はじめに

本記事では、AWS CodeBuildを使用したCI/CDパイプラインにおいて、プルリクエスト(PR)の差分を効率的に取得する方法について説明します。この手法は、特にインフラ管理において有用ですが、他の用途にも応用可能です。

背景と課題

CI/CDパイプラインでは、しばしば全リソースに対して処理を実行することがあります。しかし、これには以下のような問題があります。

  1. 処理時間が長くなる
  2. 変更が不要なリソースにも処理が実行される
  3. 結果として、リソース管理が非効率になり、開発プロセスに遅延が生じる

目標

これらの課題を解決するため、以下の目標を設定しました。

  1. 変更されたファイルのみを対象とする
  2. 処理時間を短縮する
  3. 不要な変更を防ぐ

アプローチと実装

1. プルリクエスト作成時の差分抽出

最初のアプローチとして、AWS CodeBuildの実行時にgit diffコマンドを使用して変更されたファイルを特定する方法を実装しました。

buildspec-plan.yml
version: 0.2

phases:
  pre_build:
    commands:
      - echo "Getting list of changed files..."
      # ベースブランチとPRブランチの差分を取得
      - git diff --name-only $CODEBUILD_WEBHOOK_BASE_REF...$CODEBUILD_WEBHOOK_HEAD_REF > $CODEBUILD_SRC_DIR/changed_files.txt
      - cat $CODEBUILD_SRC_DIR/changed_files.txt
  build:
    commands:
      # ディレクトリの変更を検出して、Terraform Planを実行する

このアプローチにより、PRの作成時に変更されたファイルのリストを取得できます。しかし、この方法ではPRのマージ時には正確な変更差分を把握できないという問題があります。

2. マージ後の差分抽出

PRマージ後の正確な差分を抽出するため、マージコミットを指定する方法を採用しました。

buildspec-apply.yml
version: 0.2

phases:
  pre_build:
    commands:
      - echo "Getting list of changed files..."
      # 最新のマージコミットのハッシュを取得
      - LATEST_MERGE_COMMIT_HASH=$(git log --merges -n 1 --format=format:%H)
      - echo $LATEST_MERGE_COMMIT_HASH
      # マージコミットとその親コミットの差分を取得
      - git diff --name-only $LATEST_MERGE_COMMIT_HASH^...$LATEST_MERGE_COMMIT_HASH > $CODEBUILD_SRC_DIR/changed_files.txt
      - cat $CODEBUILD_SRC_DIR/changed_files.txt
  build:
    commands:
      # ディレクトリの変更を検出して、Terraform Applyを実行する

この方法により、マージされたPRの変更差分を正確に特定できるようになりました。

成果

これらの対応により、以下の成果が得られました。

  1. 処理時間の大幅な短縮
  2. 不要な処理の排除
  3. リソース管理の効率化

学んだこと

  1. Git flowの重要性:ブランチの挙動を正確に理解することの重要性を再認識しました。
  2. 継続的な改善の価値:日々の問題点を迅速に解決することで、大きな効率化につながることを実感しました。

まとめ

AWS CodeBuildを用いたCI/CDパイプラインにおいて、PRの差分を適切に取得することで、処理を大幅に最適化できました。この手法は、インフラ管理に限らず、様々な開発プロセスに応用可能です。

似たような課題に直面している方々にとって、本記事が問題解決の一助となれば幸いです。

Appendix

Discussion