💬

aws-codebuild-run-buildでGitHub ActionsからCodeBuildを実行するとすごく便利

2021/03/26に公開

概要

aws-codebuild-run-build は AWS 公式の GitHub Actions で、GitHub Actions のフローから CodeBuild を実行することができます。

aws-actions/aws-codebuild-run-build

CodeBuild を使う理由

GitHub Actions でテストやビルドを実行する際に、システム要件によっては GitHub Actions でできない場合があります。例えば、以下の場合が挙げられます。

1. スペック不足

GitHub Actions のジョブランナーは 2コア CPU、7GB のメモリが割り当てられます(Mac OSは 3コア CPU、メモリ 14GB)。ビルドするのにスペックが足りず、いつまでも終わらない可能性もあります。また、GPU を使ってアプリケーションの動作確認をする場合は GitHub Actions では対応できません。

2. 依存システムへのアクセスが必要

例えば、RDB へのアクセスやアクセス制限されている API へのアクセスが必要なテストを実行する場合には、GitHub Actions では対応できません。モックを使えと思うかもしれませんが、どうしても外部リソースへのアクセスが必要な場合が出てくると思います。

いずれもセルフホストランナーで EC2 インスタンスを起動する方法もありますが、プロビジョニングしなければなりませんし、GitHub Actions が実行される間だけ EC2 インスタンスを起動する制御が面倒です。
CodeBuild であれば、general1.2xlarge(72コア CPU、メモリ 144 GiB)、GPU を使う場合は gpu1.large (32コア CPU、メモリ 244 GiB)まで使うことができます。また、VPC 内に実行することができますのでアクセス制限されている RDB や API などのリソースにもアクセスすることができます。

CodeBuild の GitHub 連携でいいんじゃないの?

CodeBuild のソースプロバイダに GitHub を選択することで、CodeBuild を呼び出せばいいのでは?と思う方もいるかもしれません。それでも良いのですが、ビルド以外の処理は GitHub Actions で定義していて設定を一つにまとめたい場合や、後述のように CodeBuild の実行結果を GitHub から確認したい場合は今回の方法が良いと思います。

CodeBuild プロジェクトの作成

ビルド実行するための OodeBuild プロジェクトを作成します。設定方法は省略しますが、ソースプロバイダは NO_SOURCE(ソースなし)でOKです。GitHub Actions からソースコードが渡されるので指定する必要はありません。

buidlspec.yaml は以下に記載しますが、今回は ls コマンドを実行しているだけです。

version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.7
  build:
    commands:
      - echo "run codebuild by github actions"
      - ls -la

IAM ユーザの作成

まず、AWS アクセスキーを発行するための IAM ユーザを作成します。権限は以下のようにします。<REGION><ACCOUNT_ID><CODEBUILD_JOB_NAME> は実行する CodeBuild プロジェクトのリージョン、AWS アカウント ID、プロジェクト名(今回は run-github-actions)に置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codebuild:StartBuild",
                "codebuild:BatchGetBuilds"
            ],
            "Resource": [
                "arn:aws:codebuild:<REGION>:<ACCOUNT_ID>:project/<CODEBUILD_JOB_NAME>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:GetLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:<REGION>:<ACCOUNT_ID>:log-group:/aws/codebuild/<CODEBUILD_JOB_NAME>:*"
            ]
        }
    ]
}

Secrets の設定

ドキュメントを参考に AWS アクセスキーとシークレットキーを Secrets に保存します。

ワークフローの設定

設定は以下のようにとても簡単です。今回は main ブランチに Push された場合にビルドが実行されるようにしました。

name: Run Codebuild

on:
  push:
    branches:
      - main

env:
  REGION: ap-northeast-1           # CodeBuild のリージョン
  PROJECT_NAME: run-github-actions # CodeBuild プロジェクト名

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Configure AWS Credentials
      # v1
      uses: aws-actions/configure-aws-credentials@cefc5912bc61e2b5a3b049c839fc283c7712d4e0
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
        aws-region: ${{ env.REGION }}
    - name: Run CodeBuild
      # v1.0.3
      uses: aws-actions/aws-codebuild-run-build@0a2ddc3a24e0f6b41d4a61635d87dcb2482c7b49
      with:
        project-name: ${{ env.PROJECT_NAME }}

実行結果

実行されると GitHub Actions の結果から CodeBuild のログが表示されるのでマネジメントコンソールに行く必要はありません。便利ですね。

aws-codebuild-run-build

参考

Discussion