kakakakakku blog

Weekly Tech Blog: Keep on Learning!

CodeDeploy のデプロイ実行とデプロイ完了待機を AWS CLI で試した

CodeDeploy のデプロイ実行を AWS CLI で試した.今回は GitHub からコードを取得する前提にしている.

コミットハッシュを取得する

CodeDeploy で GitHub からコードを取得する場合,対象となるコミットハッシュが必要になる.そこで,GitHub API から指定したブランチの最新コミットハッシュを取得する.また,プライベートリポジトリの場合はアクセストークンが必要になるため,Authorization ヘッダーに乗せている.

公式ドキュメントに載っている通り,以下のようなレスポンスが返ってくるので,sha からコミットハッシュを取得することができる.

{
  "ref": "refs/heads/featureA",
  "node_id": "MDM6UmVmcmVmcy9oZWFkcy9mZWF0dXJlQQ==",
  "url": "https://api.github.com/repos/octocat/Hello-World/git/refs/heads/featureA",
  "object": {
    "type": "commit",
    "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd",
    "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd"
  }
}

デプロイを実行する

AWS CLI でデプロイを実行する場合 aws deploy create-deployment を使う.ポイントはコミットハッシュの指定で,github-location オプションを以下のフォーマットで指定する.

repository=string,commitId=string

デプロイの完了を待つ

aws deploy create-deployment は,デプロイを実行するだけなので,デプロイの完了を待つ aws deploy wait deployment-successful と組み合わせて使う.aws deploy create-deployment のレスポンスに以下のような deploymentId が含まれているので,これを指定する.

{
    "deploymentId": "d-N65YI7Gex"
}

サンプルコード

最後にサンプルコードを貼っておく.実際に実装したコードはもっと複雑だけど,今回は単純化している.

実行

export BRANCH_NAME='master'
sh deploy.sh

deploy.sh

#!/bin/sh

#######################################
# 指定したブランチの最新コミットハッシュを取得する
# Arguments:
#   $1 BRANCH NAME
# Returns:
#   COMMIT HASH
#######################################
get_commit_hash() {
  curl -s -H "Authorization: token xxx" \
    https://api.github.com/repos/xxx/xxx/git/refs/heads/$1 | jq  -r '.object.sha'
}

#######################################
# デプロイを実行する
# Arguments:
#   $1 BRANCH NAME
# Returns:
#   DEPLOYMENT ID
#######################################
create_deploy() {
  echo $(
    aws deploy create-deployment \
      --application-name xxx \
      --deployment-group-name xxx \
      --github-location repository=xxx/xxx,commitId=$(get_commit_hash $1) \
      --deployment-config-name CodeDeployDefault.OneAtATime \
      --region ap-northeast-1 | jq -r '.deploymentId'
  )
}

#######################################
# デプロイの完了を待つ
# Arguments:
#   $1 DEPLOYMENT ID
#######################################
deploy_waiter() {
  aws deploy wait deployment-successful --deployment-id $1
}

deployment_id=$(create_deploy ${BRANCH_NAME})
echo "deploymentId: ${deployment_id}"

deploy_waiter ${deployment_id}

CodeDeploy 関連記事

kakakakakku.hatenablog.com