AWS CodeBuildで関連付けられていない任意のリポジトリの任意のブランチをビルドする方法

2021.10.20

いわさです。

AWS CodeBuildはビルド対象のソースプロバイダーを指定します。
その際にブランチも指定しますが、このリポジトリやブランチを動的に、柔軟に設定することは出来ないでしょうか。

実はAWS CLIのCodeBuildコマンドを使用すると実現出来ます。

本日は検証のために、任意のCodeBuildプロジェクトを使って、,全く関係のないCodeCommitリポジトリの特定ブランチをビルドさせてみます。
これが出来るとやろうと思えばCodeBuildを使って色々なことが出来るようになります。

CodeBuildプロジェクトの作成

まずはCodeBuildプロジェクトを作成します。
このプロジェクトではソースプロバイダを指定しません。(指定しても良いですが)

ソースプロバイダの選択で「ソースがありません」を選択します。

環境は通常どおり作成します。
サービスロールは後ほど権限を追加するのでメモしておいてください。

ソースプロバイダを無しで指定したのでBuildspecはファイル指定が出来ず、ビルドコマンドをインラインで入力する必要があります。
以下のようにこのビルドで設定されたBuildspecだとわかるように文字列を出力しておきます。

version: 0.2

phases:
  build:
    commands:
      - "echo empty-build"
      - "exit 0"

CodeCommitリポジトリの作成

ビルド対象のリポジトリを作成します。
ただし、このリポジトリは先程のCodeBuildプロジェクトとは関連づいていません。
また、任意のブランチでビルドしたいので後ほどブランチも追加します。

まずはmainビルドにbuildspec.ymlを追加します。

buildspec.yml

version: 0.2

phases:
  build:
    commands:
      - "echo iwasa-codecommit"
      - "exit 0"

developブランチを作成し、判別出来るようにbuildspec.ymlの文字列を変更しておきましょう。

buildspec.yml

version: 0.2

phases:
  build:
    commands:
      - "echo iwasa-codecommit-develop"
      - "exit 0"

ビルド実行

まずはCodeBuildコンソールから通常どおりビルド実行を行ってみましょう。
実行時はCloudWatch Logs出力設定が有効化されているか確認してください。ビルドログを確認したいので。

empty-buildが出力されていますね。
通常どおりCodeBuildのビルド実行操作を行うと、ソースコード無しの組み込みbuildspecで実行されていることがわかります。

任意のリポジトリ、任意のブランチで実行

ここから本題ですが、実施にあたって下準備があります。
まず、CodeBuildはビルドフェーズ前にソースコードをダウンロードしてきます。
CodeCommitが対象の場合はgit pullをします。

よって、対象リポジトリに対するGit Pull操作を許可する必要があります。
IAMコンソールでサービスロールを探し、リポジトリの操作権限を追加しましょう。

では実行します。
ビルド操作はAWS CLIを使用します。
パラメータにCodeCommitのGitリポジトリのHTTPS URLが必要になるので事前に取得しておいてください。

start-buildコマンドのoverride系パラメータを使用します。
これらを使うと、現在設定されているCodeBuildの設定値を一時的に上書きしビルド操作を行うことが出来ます。

source-type-overrideにはCODECOMMITを、source-location-overrideにはHTTPSのURLを指定します。
source-versionでブランチを指定しています。

aws codebuild start-build --project-name empty-build --source-type-override CODECOMMIT --source-location-override https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/iwasa-codecommit --buildspec-override buildspec.yml --source-version develop

実行してみましょう。

マネジメントコンソールからも実行されていることをが確認出来ます。
ビルドログを確認してみましょう。

CodeCommitからソースコードが取得されていることと、ターゲットリポジトリのdevelopブランチのbuildspec.ymlが実行されていることがわかる文字列が確認出来ますね。

まとめ

冒頭でも触れましたが、他のサービスと組み合わせてうまくこの機能を使ってやると、「CodeBuildだとここは固定で設定しなきゃいけないんだよなぁ」なんてシーンが多かったと思いますが、回避出来る可能性があります。
この機能を使って次回、他のサービスと組み合わせてみたいと思います。