Help us understand the problem. What is going on with this article?

[JAWS-UG CLI] CodeBuild: #3 buildspecの作成 (Java)

More than 3 years have passed since last update.

前提条件

S3への権限

S3にオブジェクトを書き込む権限があること。

AWS CLIのバージョン

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

  • AWS CLI 1.11.28
コマンド
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}
        S3_BUCKET_NAME       (0.3) ${S3_BUCKET_NAME}
        FILE_ZIP             (0.4) ${FILE_ZIP}
        SNS_TOPIC_NAME       (0.5) ${SNS_TOPIC_NAME}
        DIR_WORK             (0.6) ${DIR_WORK}
        PWD                  (0.7) $(pwd)

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) <S3にオブジェクトを書き込む権限のあるプロファイル>
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  S3_BUCKET_NAME       (0.3) source-ap-northeast-1-XXXXXXXXXXXX
  FILE_ZIP             (0.4) MessageUtil.zip
  SNS_TOPIC_NAME       (0.5) handson-20170417
  DIR_WORK             (0.6) ${HOME}/src-codebuild-demo-java
  PWD                  (0.7) ${HOME}/src-codebuild-demo-java

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

0.1. プロファイルの指定

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

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

結果(例):

  iamFull-prjz-mbpr13
  <S3にオブジェクトを書き込む権限のあるプロファイル>
変数の設定
export AWS_DEFAULT_PROFILE='<S3にオブジェクトを書き込む権限のあるプロファイル>'

0.2. リージョンの指定

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

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

変数の設定
S3_BUCKET_NAME=$( \
        aws s3 ls \
          | grep 'source-ap-northeast-1-' \
          | cut -d ' ' -f3 \
) \
        && echo ${S3_BUCKET_NAME}

0.4. ZIPファイル名の指定

変数の設定
FILE_ZIP='MessageUtil.zip'

0.5. 通知用SNSトピックの指定

変数の設定
SNS_TOPIC_PREFIX='handson-'
変数の設定
SNS_TOPIC_ARN=$( \
        aws sns list-topics \
          --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_PREFIX}\`)].TopicArn" \
          --output text \
) \
        && echo ${SNS_TOPIC_ARN}

結果(例):

  arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-20170417

0.6. 作業用ディレクトリの指定

変数の設定
DIR_WORK='${HOME}/src-codebuild-demo-java'

0.7. 作業用ディレクトリへの移動

コマンド
cd ${DIR_WORK}/

最終確認

変数の確認
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        S3_BUCKET_NAME       (0.3) ${S3_BUCKET_NAME}
        FILE_ZIP             (0.4) ${FILE_ZIP}
        SNS_TOPIC_NAME       (0.5) ${SNS_TOPIC_NAME}
        DIR_WORK             (0.6) ${DIR_WORK}
        PWD                  (0.7) $(pwd)

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) <S3にオブジェクトを書き込む権限のあるプロファイル>
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  S3_BUCKET_NAME       (0.3) source-ap-northeast-1-XXXXXXXXXXXX
  FILE_ZIP             (0.4) MessageUtil.zip
  SNS_TOPIC_NAME       (0.5) handson-20170417
  DIR_WORK             (0.6) ${HOME}/src-codebuild-demo-java
  PWD                  (0.7) ${HOME}/src-codebuild-demo-java

1. 事前作業

1.1. メッセージ表題の指定

変数の設定
SNS_MSG_SUBJECT='AWS CodeBuild - Build Completed'

1.2. メッセージ本文の指定

変数の設定
SNS_MSG_BODY="${CODEB_PROJECT_NAME} build has completed." \
        && echo ${SNS_MSG_BODY}

2. Create the Build Spec

変数の設定
FILE_INPUT="${DIR_WORK}/buildspec.yml"
変数の確認
cat << ETX

        FILE_INPUT:         ${FILE_INPUT}
        AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}
        SNS_TOPIC_ARN:      ${SNS_TOPIC_ARN}
        SNS_MSG_SUBJECT:    ${SNS_MSG_SUBJECT}
        SNS_MSG_BODY:       ${SNS_MSG_BODY}

ETX
コマンド
cat << EOF > ${FILE_INPUT}
version: 0.1

environment_variables:
  plaintext:
    AWS_DEFAULT_REGION: "${AWS_DEFAULT_REGION}"
    SNS_TOPIC_ARN: "${SNS_TOPIC_ARN}"
    SNS_MSG_SUBJECT: "${SNS_MSG_SUBJECT}"
    SNS_MSG_BODY: "${SNS_MSG_BODY}"

phases:
  install:
    commands:
      - echo Nothing to do in the install phase...
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - echo Build started on \$(date +%Y-%m-%dZ%H:%M:%S)
      - mvn install
  post_build:
    commands:
      - echo Build completed on \$(date +%Y-%m-%dZ%H:%M:%S)
      - aws sns publish --topic-arn \${SNS_TOPIC_ARN} --subject "\${SNS_MSG_SUBJECT}" --message "\${SNS_MSG_BODY}"
artifacts:
  files:
    - target/messageUtil-1.0.jar
EOF

cat ${FILE_INPUT}

2.2. ZIPファイルの作成

コマンド
PATH_ZIP="${HOME}/${FILE_ZIP}" \
        && echo ${PATH_ZIP}
コマンド
zip -r ${PATH_ZIP} * -x '.*'

結果(例):

  adding: buildspec.yml (deflated 56%)
  adding: pom.xml (deflated 52%)
  adding: src/ (stored 0%)
  adding: src/test/ (stored 0%)
  adding: src/test/java/ (stored 0%)
  adding: src/test/java/TestMessageUtil.java (deflated 60%)
  adding: src/main/ (stored 0%)
  adding: src/main/java/ (stored 0%)
  adding: src/main/java/MessageUtil.java (deflated 58%)

作成したZIPファイルの中身を確認します。

コマンド
unzip -Z ${PATH_ZIP}

結果(例):

  Archive:  /home/taro/MessageUtil.zip
  Zip file size: 2305 bytes, number of entries: 9
  -rw-rw-r--  3.0 unx      418 tx defN 17-Apr-16 23:45 buildspec.yml
  -rw-rw-r--  3.0 unx      625 tx defN 17-Apr-16 12:37 pom.xml
  drwxrwxr-x  3.0 unx        0 bx stor 17-Apr-16 12:36 src/
  drwxrwxr-x  3.0 unx        0 bx stor 17-Apr-16 12:36 src/test/
  drwxrwxr-x  3.0 unx        0 bx stor 17-Apr-16 12:37 src/test/java/
  -rw-rw-r--  3.0 unx      568 tx defN 17-Apr-16 12:37 src/test/java/TestMessageUtil.java
  drwxrwxr-x  3.0 unx        0 bx stor 17-Apr-16 12:36 src/main/
  drwxrwxr-x  3.0 unx        0 bx stor 17-Apr-16 12:37 src/main/java/
  -rw-rw-r--  3.0 unx      345 tx defN 17-Apr-16 12:37 src/main/java/MessageUtil.java
  9 files, 1956 bytes uncompressed, 863 bytes compressed:  55.9%

2.3. S3バケットへの転送

作成したZIPファイルをソースファイル用のS3バケットに転送します。

コマンド
aws s3 cp ${PATH_ZIP} s3://${S3_BUCKET_NAME}/

結果(例):

  upload: ../MessageUtil.zip to s3://source-ap-northeast-1-XXXXXXXXXXXX/MessageUtil.zip

3. 事後作業

3.1. 転送完了の確認

コマンド
aws s3 ls s3://${S3_BUCKET_NAME}/${FILE_ZIP}

結果(例):

  2017-04-1701:23:45       3243 MessageUtil.zip

3.2. ZIPファイルの削除

コマンド
rm ${PATH_ZIP}

完了

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away