AWS CodeBuildをGitHubリポジトリで動かしてHello, World!


AWSのCodeBuildをGitHubリポジトリと連携させて、ビルドジョブを動かしてみました。

前回の記事Google Cloud BuildをGitHubリポジトリで動かしてHello, World!のAWS版です。

この記事にあるスクショは、白い背景はAWSのマネジメントコンソールで、黒い背景はGitHubのページです。

前提

  • AWSのアカウントが存在する
  • GitHubアカウントが存在する
  • GitHub上にCodeBuildを試すためのリポジトリが存在する

手順

  1. CodeBuildをGitHubリポジトリに接続し、Build project作成
  2. ジョブの内容を記述するファイル buildspec.yml を作成
  3. pushしてジョブを実行してみる

CodeBuildをGitHubリポジトリに接続し、Build project作成

マネジメントコンソールのCodeBuildの画面で、「Create build project」ボタンをクリックします。

Project nameは適当な名前を付けます。

Source providerでGitHubを選択します。

すると、OAuthとpersonal access tokenの2つの接続方法が選択できます。

OAuthを選択して、「Connect to GitHub」ボタンをクリックすると、GitHubのページが開きます。

「Authorize」ボタンを押して、CodeBuildとGitHubの接続を承認します。すると、CodeBuildの画面に戻ってきます。

「Repository in my GitHub account」を選択します。「Public repository」では、git pushをトリガーにしてビルドを動かすことができません。Repository URLはGitHubのURLを入力します。(前回のGoogle Cloud Buildでのサンプルを使いまわしました)

Webhookにチェックを入れると、git pushがトリガーになります。

その下のEnvironmentのコーナーではOSのイメージなどを聞かれますので、適当に選択します。

さらにその下は、サービスロール、動作環境のVPC、証明書、インスタンスの大きさなどの指定が続きます。

入力が終わったら、一番下の「Create build project」ボタンをクリックして、作成完了です。

GitHub側の設定ページ

GitHubのレポジトリのページを見たら、Settings → Webhooks にCoodeBuildの設定が現れてました。

IAM Role

自動で作成されるIAM Roleは、デフォルトで codebuild-build-sample-role という名前で、以下の権限になってました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/codebuild/sample-project",
                "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/codebuild/sample-project:*"
            ],
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::codepipeline-ap-northeast-1-*"
            ],
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketAcl",
                "s3:GetBucketLocation"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "codebuild:CreateReportGroup",
                "codebuild:CreateReport",
                "codebuild:UpdateReport",
                "codebuild:BatchPutTestCases",
                "codebuild:BatchPutCodeCoverages"
            ],
            "Resource": [
                "arn:aws:codebuild:ap-northeast-1:123456789012:report-group/sample-project-*"
            ]
        }
    ]
}

ジョブの内容を記述するファイル buildspec.yml を作成

ジョブの内容を記述するファイルはYAMLでリポジトリの中に作成します。

buildspec.yml という名前で以下の内容のYAMLを作成します。

version: 0.2

phases:
  install:
    commands:
      - echo "Hello, World! (phase=install)"
  pre_build:
    commands:
      - echo "Hello, World! (phase=pre_build)"
  build:
    commands:
      - echo "Hello, World! (phase=build)"
      - ls -al
  post_build:
    commands:
      - echo "Hello, World! (phase=post_build)"

buildspec.yml の仕様は以下のページに書いてあります。

Build specification reference for CodeBuild - AWS CodeBuild

pushしてジョブを実行してみる

このYAMLファイルをgit commitし、GitHubにpushすると、CodeBuildのジョブが実行されます。

CodeBuildの画面で、プロジェクトを選択すると、Build historyのところに実行履歴が残されてます。

ログは以下のようになってました。

追伸

前回のGoogle Cloud Buildで試したレポジトリをそのまま使ったので、git pushするとGoogle Cloud BuildとAWS CodeBuildの両方が同時に動くことになりました。

追伸 その2

Pull requestを作成しただけでも、ジョブが動くようです。第三者が任意のコマンドを実行できそうなので、Webhookを止めておきました。Google Cloud BuildはPull requestでは動かないようです。

Webhookを使う上での注意点は、以下のページに記載されています。

Using webhooks with AWS CodeBuild - AWS CodeBuild