AWSCodebuildでビルドする

## 構成
- ほぼそのまま使える
- Githubと連携するときは、AWSアカウントをGithubで許可する必要あり
    - これはAWSからGit連携のボタンを押したときに画面遷移するので1アカウントに付き1回やれば良い模様
- https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/codebuild_project

```hcl

locals {
  TENANT_ID = "xxxxxxxx"
}

resource "aws_s3_bucket" "manual" {
  bucket = "manual"
  acl    = "private"
}

resource "aws_codebuild_project" "manual" {
  name           = "manual"
  description    = ""
  build_timeout  = "60"
  queued_timeout = "480"
  source_version = "master"
  badge_enabled = false

  service_role = aws_iam_role.codebuild.arn

  artifacts {
    encryption_disabled    = false
    location               = aws_s3_bucket.manual_front.bucket
    name                   = "manual"
    namespace_type         = "BUILD_ID"
    override_artifact_name = false
    packaging              = "NONE"
    type                   = "S3"
  }

  cache {
    modes = []
    type  = "NO_CACHE"
  }

  environment {
    compute_type                = "BUILD_GENERAL1_SMALL"
    image                       = "aws/codebuild/standard:4.0-20.09.14"
    image_pull_credentials_type = "CODEBUILD"
    privileged_mode             = false
    type                        = "LINUX_CONTAINER"

    environment_variable {
      name  = "NODE_HOST"
      type  = "PLAINTEXT"
      value = "vamdemic"
    }
    environment_variable {
      name  = "API_HTTPS"
      type  = "PLAINTEXT"
      value = "true"
    }
  }

  logs_config {
    cloudwatch_logs {
      status = "ENABLED"
    }

    s3_logs {
      encryption_disabled = false
      status              = "DISABLED"
    }
  }

  source {
    git_clone_depth     = 1
    insecure_ssl        = false
    location            = "https://github.com/vamdemic/manual.git"
    report_build_status = false
    type                = "GITHUB"

    git_submodules_config {
      fetch_submodules = false
    }
  }

  tags = {
    Environment = "AutoDeployment"
  }
}
```

## buildspecファイル
- CodeBuildで指定したブランチのルートディレクトリにファイルを配置しておく
- または、awscli実行時に上書き指定することで読み込ませることもできる
- CodeBuildから呼び出されるビルド用コンテナの中で実行したいコマンドを列挙していく
    - install
        - yarn installやnpm installなどのセットアップ系を処理を書くところ
    - build
        - buildコマンドなどを書くところ
    - pre_なんとか
        - buildの前の処理を書くところ
        - sedしたりファイルを配置したりなど
    - artifacts
        - ビルドされたものの管理
        - この例では、カレントディレクトリの`dist`というディレクトリをまとめてアーティファクトとして保存するという意味
        - アーティファクト用に指定したs3に保存されているので見てみる

``` buildspec.yaml
version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 10
    commands:
      - echo Installing source NPM dependencies...
      - yarn install
  build:
    commands:
      - NODE_HOST=template yarn build
      - pwd
      - ls
artifacts:
  files:
    - '**/*'
  base-directory: 'dist'
```

## 実行

- ビルドが`SUCCESS`になるまで待機するシェル
- `--environment-variables-override`は環境変数を上書きしている

```code-build-manual.sh 
#!/bin/bash

# Build実行
BUILD_RESULT=$(aws codebuild start-build \
  --project-name manual \
  --environment-variables-override '[
    {
      "name": "API_HOST",
      "value": "'${1}'.vamdemic.jp",
      "type": "PLAINTEXT"
    },
    {
      "name": "ADMIN_ROOT_PATH",
      "value": "https://'${1}'.vamdemic.jp/",
      "type": "PLAINTEXT"
    }
  ]'
)


# IDを取得
EXECUTE_ID=$(echo ${BUILD_RESULT} | jq -r ".build.id")

BUILD_STATUS=$(aws codebuild batch-get-builds \
        --ids ${EXECUTE_ID} \
        | jq -r ".builds[].buildStatus"
)
#echo ${BUILD_STATUS}

while [ "${BUILD_STATUS}" != "SUCCEEDED" ]
do
  sleep 10
        BUILD_STATUS=$(aws codebuild batch-get-builds \
                --ids ${EXECUTE_ID} \
                | jq -r ".builds[].buildStatus"
        )
done

echo "$(echo ${EXECUTE_ID} | awk -F ':' '{print $2}')"
```