前提条件

CodeBuildへの権限

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

AWS CLIのバージョン

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

  • AWS CLI 1.11.57
コマンド
aws --version

結果(例):

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

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

コマンド
sudo -H pip install -U awscli

0. 準備

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

変数の確認
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. プロファイルの指定

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

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

結果(例):

  iamFull-prjz-mbpr13
  <CodeBuildにフル権限のあるプロファイル>
変数の設定
export AWS_DEFAULT_PROFILE='<CodeBuildにフル権限のあるプロファイル>'

0.2. リージョンの指定

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

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

変数の設定
FILE_ZIP='MessageUtil.zip'
コマンド
aws s3 ls s3://${S3_BUCKET_SOURCE}/${FILE_ZIP}

0.4. IAMロールの指定

変数の設定
IAM_ROLE_NAME='CodeBuildServiceRole'
コマンド
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

最終確認

変数の確認
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. プロジェクト名の指定

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

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

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

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

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

結果(例):

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

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

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

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

変数の設定
CODEB_SOURCE_TYPE='S3'

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

変数の設定
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

変数の確認
cat << ETX

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

ETX
変数の設定
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. アーティファクトタイプの指定

変数の設定
CODEB_ARTIFACTS_TYPE='S3'

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

変数の設定
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

変数の確認
cat << ETX

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

ETX
変数の設定
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. 環境タイプの指定

変数の設定
CODEB_ENV_TYPE='LINUX_CONTAINER'

1.10. 環境イメージの指定

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

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

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

変数の設定
CODEB_ENV_COMPUTE_TYPE='BUILD_GENERAL1_SMALL'

1.12. environment

変数の確認
cat << ETX

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

ETX
変数の設定
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. プロジェクトの作成

変数の確認
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
コマンド
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. 事後作業

コマンド
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)"
          }
      ]
  }

完了