CodeBuildのbuildspec.ymlを別の名前にしたいときの手順

# TL;DR

CodeBuildを使っていると、ビルドの成果物が違うからビルドスペックのファイル(`buildspec.yml`というもの)の単位で成果物を分けたいということがあります。調べてみると、ドキュメントに[^1]にやり方が載っていたのでやってみました。方向性としては、AWS CLIで変更操作をする手順です。[^2]

（2017-10-13 22:00 追記。　今さっき見てみたら、Consoleでファイル名を指定できるようになっていました。ちょろっと直すならConsoleでいいですね。）

[^1]: http://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-name-storage 今のところ日本語にはなってないようです。

[^2]: ぶっちゃけた話、Consoleがすぐにでも対応しそうな気もしますが、今時点での手順を残します。

# 概要

`nantoka-build`というプロジェクトのビルドスペックのファイルを`nantoka-kantoka-buildspec.yml`に変えたいとします。windowsの例ですが、mac でも linuxでも概ね同じでしょう。

# プロジェクトの名前を確認する

Consoleから確認することもできますが、CLIと同じものが見えているか確認する意味も込めてやってみましょう。

```
>aws codebuild list-projects
{
    "projects": [
        "nantoka-build",
        "kantoka-build-project",
        "test-test-project"
    ]
}

>
```

各環境とかリージョンとかで色々あると思いますが、Console　
https://ap-northeast-1.console.aws.amazon.com/codebuild/home?region=ap-northeast-1#/projects
で、見えるプロジェクトとおなじビルドプロジェクトが見えていればOKです。`nantoka-build`以外のプロジェクトも、存在するなら見えていることでしょう。

# プロジェクト名を指定して、プロジェクト構造のJSONファイルを取得する

更新の操作はプロジェクト構造のJSONファイルをアップロードする形になります。アップロードするファイルを作るため、現状のファイルをダウンロードします。（たぶんこのJSONは、CloudFormationのテンプレートなのではないかなと思います。）

```
>aws codebuild batch-get-projects --names nantoka-build
{
    "projectsNotFound": [],
    "projects": [
        {
            "name": "nantoka-build",
            "serviceRole": "arn:aws:iam::1234123412341234:role/service-role/nantokarole",
            "tags": [],
            "artifacts": {
                "packaging": "NONE",
                "type": "CODEPIPELINE",
                "name": "nantoka-artifact"
            },
            "lastModified": 1512341234.783,
            "timeoutInMinutes": 60,
            "created": 1512341234.68,
            "environment": {
                "computeType": "BUILD_GENERAL1_SMALL",
                "privilegedMode": false,
                "image": "aws/codebuild/java:openjdk-8",
                "type": "LINUX_CONTAINER",
                "environmentVariables": []
            },
            "source": {
                "type": "CODEPIPELINE"
            },
            "encryptionKey": "arn:aws:kms:ap-northeast-1:1234123412341234:alias/aws/s3",
            "arn": "arn:aws:codebuild:ap-northeast-1:1234123412341234:project/nantokanantoka"
        }
    ]
}

>
```
（arnなどは内容を適当にいじっています。表示される項目はあなたのプロジェクトの内容と同じはずです。）

# プロジェクト構造のJSONファイルを修正する

コマンドプロンプトに出力されたJSONをファイルに落として修正を入れます。

- JSONのルートの`"projects"`の配下を取り出す。
- `"buildspec": "nantoka-kantoka-buildspec.yml"`という1行を入れる。JSONなのでカンマ忘れずに。
- `"lastModified" "created" "arn"` は消す。JSONの構造が違うというエラーになるので。無くても多分実害ないと想像する次第。本当は正しい書き方あると思いますが未確認です。


``` update.buildproject.json
{
    "name": "nantoka-build",
    "serviceRole": "arn:aws:iam::1234123412341234:role/service-role/nantokarole",
    "tags": [],
    "artifacts": {
        "packaging": "NONE",
        "type": "CODEPIPELINE",
        "name": "nantoka-artifact"
    },
    "timeoutInMinutes": 60,
    "environment": {
        "computeType": "BUILD_GENERAL1_SMALL",
        "privilegedMode": false,
        "image": "aws/codebuild/java:openjdk-8",
        "type": "LINUX_CONTAINER",
        "environmentVariables": []
    },
    "source": {
        "type": "CODEPIPELINE",
        "buildspec": "nantoka-kantoka-buildspec.yml"
    },
    "encryptionKey": "arn:aws:kms:ap-northeast-1:1234123412341234:alias/aws/s3"
}
```

# 修正をアップロードする。

`update.buildproject.json`をカレントディレクトリに置いて、下記コマンドを実行する。

```
>aws codebuild update-project --cli-input-json file://update.buildproject.json
{
    "project": {
        "name": "nantoka-build",
        "serviceRole": "arn:aws:iam::1234123412341234:role/service-role/nantokarole",
        "tags": [],
        "artifacts": {
            "packaging": "NONE",
            "type": "CODEPIPELINE",
            "name": "nantoka-artifact"
        },
        "timeoutInMinutes": 60,
        "environment": {
            "computeType": "BUILD_GENERAL1_SMALL",
            "privilegedMode": false,
            "image": "aws/codebuild/java:openjdk-8",
            "type": "LINUX_CONTAINER",
            "environmentVariables": []
        },
        "source": {
            "type": "CODEPIPELINE",
            "buildspec": "nantoka-kantoka-buildspec.yml"
        },
        "encryptionKey": "arn:aws:kms:ap-northeast-1:1234123412341234:alias/aws/s3"
    }
}

>
```


# Consoleで確認する

Consoleからプロジェクトを選択し、プロジェクト詳細 -> ビルド仕様の表示 とクリックして進むと、`nantoka-kantoka-buildspec.yml` と表示されます。