[JAWS-UG CLI] CodeBuild: #2 プロジェクトの作成



前提条件
========


CodeBuildへの権限
-----------------

CodeBuildに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.57

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.70 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.33

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======

まず変数の確認をします。

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        FILE_ZIP             (0.3) ${FILE_ZIP}
        IAM_ROLE_ARN        (0.4) ${IAM_ROLE_ARN}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <CodeBuildにフル権限のあるプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
      FILE_ZIP             (0.3) MessageUtil.zip
      IAM_ROLE_ARN         (0.4) arn:aws:iam::XXXXXXXXXXXX:role/CodeBuildServiceRole

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を
行います。


0.1. プロファイルの指定
-----------------------

プロファイルの一覧を確認します。

```bash:コマンド:
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'
```

結果(例):

      iamFull-prjz-mbpr13
      <CodeBuildにフル権限のあるプロファイル>

```bash:変数の設定:
export AWS_DEFAULT_PROFILE='<CodeBuildにフル権限のあるプロファイル>'
```


0.2. リージョンの指定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.3. ソースコードZIPファイルの指定
----------------------------------

```bash:変数の設定:
FILE_ZIP='MessageUtil.zip'
```

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_SOURCE}/${FILE_ZIP}
```


0.4. IAMロールの指定
--------------------

```bash:変数の設定:
IAM_ROLE_NAME='CodeBuildServiceRole'
```

```bash:コマンド:
IAM_ROLE_ARN=$( \
        aws iam get-role \
          --role-name ${IAM_ROLE_NAME} \
          --query 'Role.Arn' \
          --output text \
) \
        && echo ${IAM_ROLE_ARN}
```

結果(例):

      arn:aws:iam::XXXXXXXXXXXX:role/CodeBuildServiceRole


最終確認
--------------

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        FILE_ZIP             (0.3) ${FILE_ZIP}
        IAM_ROLE_NAME        (0.4) ${IAM_ROLE_NAME}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <CodeBuildにフル権限のあるプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
      FILE_ZIP             (0.3) MessageUtil.zip
      IAM_ROLE_NAME        (0.4) CodeBuildServiceRole


1. 事前作業
===========


1.1. プロジェクト名の指定
-------------------------

```bash:変数の設定:
CODEB_PROJECT_NAME='codebuild-demo-java-20170417'
```

同名のプロジェクトの不存在確認します。

```bash:変数の設定:
ARRAY_CODEB_PROJECT_NAMES="${CODEB_PROJECT_NAME}" \
        && echo ${ARRAY_CODEB_PROJECT_NAMES}
```

同名のプロジェクトの不存在確認します。

```bash:コマンド:
aws codebuild batch-get-projects \
        --names "${ARRAY_CODEB_PROJECT_NAMES}"
```

結果(例):

      {
        "projectsNotFound": [
          "codebuild-demo-java-20170417"
        ],
        "projects": []
      }


1.2. プロジェクトの説明の指定
-----------------------------

```bash:変数の設定:
CODEB_PROJECT_DESC='codebuild demo (java)'
```


1.3. ソースコードタイプの指定
-----------------------------

```bash:変数の設定:
CODEB_SOURCE_TYPE='S3'
```


1.4. ソースコード用S3バケットの指定
-----------------------------------

```bash:変数の設定:
S3_BUCKET_SOURCE=$( \
        aws s3 ls \
          | grep "source-${AWS_DEFAULT_REGION}" \
          | cut -d ' ' -f3 \
) \
        && echo ${S3_BUCKET_SOURCE}
```

結果(例):

      source-ap-northeast-1-XXXXXXXXXXXX


1.5. source
-----------

```bash:変数の確認:
cat << ETX

        CODEB_SOURCE_TYPE: ${CODEB_SOURCE_TYPE}
        S3_BUCKET_SOURCE:  ${S3_BUCKET_SOURCE}
        FILE_ZIP:          ${FILE_ZIP}

ETX
```

```bash:変数の設定:
CODEB_PROJECT_SOURCE="type=${CODEB_SOURCE_TYPE},location=${S3_BUCKET_SOURCE}/${FILE_ZIP}" \
        && echo ${CODEB_PROJECT_SOURCE}
```

結果(例):

      type=S3,location=source-ap-northeast-1-XXXXXXXXXXXX/MessageUtil.zip


1.6. アーティファクトタイプの指定
---------------------------------

```bash:変数の設定:
CODEB_ARTIFACTS_TYPE='S3'
```


1.7. アーティファクト用S3バケットの指定
---------------------------------------

```bash:変数の設定:
S3_BUCKET_ARTIFACTS=$( \
        aws s3 ls \
          | grep "artifact-${AWS_DEFAULT_REGION}" \
          | cut -d ' ' -f3 \
) \
        && echo ${S3_BUCKET_ARTIFACTS}
```

結果(例):

      artifact-ap-northeast-1-XXXXXXXXXXXX


1.8. artifacts
--------------

```bash:変数の確認:
cat << ETX

        CODEB_ARTIFACTS_TYPE: ${CODEB_ARTIFACTS_TYPE}
        S3_BUCKET_ARTIFACTS:  ${S3_BUCKET_ARTIFACTS}

ETX
```

```bash:変数の設定:
CODEB_PROJECT_ARTIFACTS="type=${CODEB_ARTIFACTS_TYPE},location=${S3_BUCKET_ARTIFACTS}" \
        && echo ${CODEB_PROJECT_ARTIFACTS}
```

結果(例):

      type=S3,location=artifact-ap-northeast-1-XXXXXXXXXXXX


1.9. 環境タイプの指定
---------------------

```bash:変数の設定:
CODEB_ENV_TYPE='LINUX_CONTAINER'
```


1.10. 環境イメージの指定
------------------------

注釈: http://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref.html

```bash:変数の設定:
CODEB_ENV_IMAGE='aws/codebuild/java:openjdk-8'
```


1.11. 環境コンピュートタイプの指定
----------------------------------

```bash:変数の設定:
CODEB_ENV_COMPUTE_TYPE='BUILD_GENERAL1_SMALL'
```


1.12. environment
-----------------

```bash:変数の確認:
cat << ETX

        CODEB_ENV_TYPE:         ${CODEB_ENV_TYPE}
        CODEB_ENV_IMAGE:        ${CODEB_ENV_IMAGE}
        CODEB_ENV_COMPUTE_TYPE: ${CODEB_ENV_COMPUTE_TYPE}

ETX
```

```bash:変数の設定:
CODEB_PROJECT_ENVIRONMENT="type=${CODEB_ENV_TYPE},image=${CODEB_ENV_IMAGE},computeType=${CODEB_ENV_COMPUTE_TYPE}" \
        && echo ${CODEB_PROJECT_ENVIRONMENT}
```

結果(例):

      type=LINUX_CONTAINER,image=aws/codebuild/java:openjdk-8,computeType=BUILD_GENERAL1_SMALL


2. プロジェクトの作成
=====================

```bash:変数の確認:
cat << ETX

        CODEB_PROJECT_NAME:        ${CODEB_PROJECT_NAME}
        CODEB_PROJECT_DESC:        ${CODEB_PROJECT_DESC}
        CODEB_PROJECT_SOURCE:      ${CODEB_PROJECT_SOURCE}
        CODEB_PROJECT_ARTIFACTS:   ${CODEB_PROJECT_ARTIFACTS}
        CODEB_PROJECT_ENVIRONMENT: ${CODEB_PROJECT_ENVIRONMENT}
        IAM_ROLE_ARN:              ${IAM_ROLE_ARN}

ETX
```

```bash:コマンド:
aws codebuild create-project \
        --name ${CODEB_PROJECT_NAME} \
        --description "${CODEB_PROJECT_DESC}" \
        --source ${CODEB_PROJECT_SOURCE} \
        --artifacts ${CODEB_PROJECT_ARTIFACTS} \
        --environment ${CODEB_PROJECT_ENVIRONMENT} \
        --service-role ${IAM_ROLE_ARN}
```

結果(例):

      {
        "project": {
          "name": "codebuild-demo-java-20170417",
          "serviceRole": "arn:aws:iam::XXXXXXXXXXXX:role/CodeBuildServiceRole",
          "created": 14xxxxxxxx.000,
          "source": {
              "type": "S3",
              "location": "source-ap-northeast-1-XXXXXXXXXXXX/MessageUtil.zip"
          },
          "artifacts": {
              "namespaceType": "NONE",
              "packaging": "NONE",
              "type": "S3",
              "location": "artifact-ap-northeast-1-XXXXXXXXXXXX",
              "name": "codebuild-demo-java-20170417"
          },
          "lastModified": 14xxxxxxxx.000,
          "timeoutInMinutes": 60,
          "environment": {
              "computeType": "BUILD_GENERAL1_SMALL",
              "image": "aws/codebuild/java:openjdk-8",
              "type": "LINUX_CONTAINER",
              "environmentVariables": []
          },
          "encryptionKey": "arn:aws:kms:ap-northeast-1:XXXXXXXXXXXX:alias/aws/s3",
          "arn": "arn:aws:codebuild:ap-northeast-1:XXXXXXXXXXXX:project/codebuild-demo-java-20170417"
          "description": "codebuild demo (java)"
        }
      }


3. 事後作業
===========

```bash:コマンド:
aws codebuild batch-get-projects \
        --names "${ARRAY_CODEB_PROJECT_NAMES}"
```

結果(例):

      {
          "projectsNotFound": [],
          "projects": [
              {
                  "name": "codebuild-demo-java-20170417",
                  "serviceRole": "arn:aws:iam::XXXXXXXXXXXX:role/CodeBuildServiceRole",
                  "tags": [],
                  "artifacts": {
                      "namespaceType": "NONE",
                      "packaging": "NONE",
                      "type": "S3 ",
                      "location": "artifact-ap-northeast-1-XXXXXXXXXXXX",
                      "name": "codebuild-demo-java-20170417"
                  },
                  "lastModified": 14xxxxxxxx.000,
                  "timeoutInMinutes": 60,
                  "created": 14xxxxxxxx.000,
                  "environment": {
                      "computeType": "BUILD_GENERAL1_SMALL",
                      "image": "aws/codebuild/java:openjdk-8",
                      "type": "LINUX_CONTAINER",
                      "environmentVariables": []
                  },
                  "source": {
                      "type": "S3",
                      "location": "source-ap-northeast-1-XXXXXXXXXXXX/MessageUtil.zip"
                  },
                  "encryptionKey": "arn:aws:kms:ap-northeast-1:XXXXXXXXXXXX:alias/aws/s3",
                  "arn": "arn:aws:codebuild:ap-northeast-1:XXXXXXXXXXXX:project/codebuild-demo-java-20170417",
                  "description": "codebuild demo (java)"
              }
          ]
      }


完了
====