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}