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

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

前回の記事[Google Cloud BuildをGitHubリポジトリで動かしてHello, World!](https://qiita.com/suzuki-navi/items/0373f479f5c6e4d98c80)の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」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/c1c5efba-7b39-75e4-7982-0f1331a21363.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/261fba82-172e-aa7b-5fc5-fd2c7e4c6c3f.png)

Source providerでGitHubを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/31277e37-3339-3064-aea4-2809a45c2a72.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/b27478fc-bac9-4050-7267-82e1a3de8904.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/0cf13404-4f94-d759-0c30-8f0071775780.png)

「Repository in my GitHub account」を選択します。「Public repository」では、git pushをトリガーにしてビルドを動かすことができません。Repository URLはGitHubのURLを入力します。（[前回のGoogle Cloud Buildでのサンプル](https://qiita.com/suzuki-navi/items/0373f479f5c6e4d98c80)を使いまわしました）

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/9ebc72f5-91c9-22f0-6055-35adc563825b.png)

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

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


### GitHub側の設定ページ

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/d2b321f6-4d9b-3cc2-c43c-ff77142faad1.png)


### IAM Role

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

```json
{
    "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を作成します。

```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](https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html)


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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/a0f91808-ceca-6d32-6b59-cc55a9234511.png)


# 追伸

[前回のGoogle Cloud Build](https://qiita.com/suzuki-navi/items/0373f479f5c6e4d98c80)で試したレポジトリをそのまま使ったので、git pushするとGoogle Cloud BuildとAWS CodeBuildの両方が同時に動くことになりました。


# 追伸 その2

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

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

[Using webhooks with AWS CodeBuild - AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/webhooks.html)