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

  • 0
    いいね
  • 0
    コメント

    前提条件

    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}
    

    完了