前提条件
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
- 準備
=======
まず変数の確認をします。
変数の確認
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. メッセージ表題の指定
変数の設定
SNS_MSG_SUBJECT='AWS CodeBuild - Build Completed'
1.2. メッセージ本文の指定
変数の設定
SNS_MSG_BODY="${CODEB_PROJECT_NAME} build has completed." \
&& echo ${SNS_MSG_BODY}
- 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.1. 転送完了の確認
コマンド
aws s3 ls s3://${S3_BUCKET_NAME}/${FILE_ZIP}
結果(例):
2017-04-1701:23:45 3243 MessageUtil.zip
3.2. ZIPファイルの削除
コマンド
rm ${PATH_ZIP}