AWS CodePipelineで実現するブランチ別デプロイ設定
はじめに
唐突ですが、以下のような構成があったとします。
AWSアカウントにまたがって、ビルドフェーズとデプロイフェーズを分離した構成になります。特殊な要件により、共通アカウントでビルドする必要がある場合などを想定しています。
この構成で、GitHub上のPUSH先のブランチ名によってデプロイ先を切り替える、というような仕組みを作ってみます。
前提
ブランチ名とデプロイ先のルールを以下の内容とします。
ブランチ名 | デプロイ先 |
---|---|
main | プロダクションアカウント |
deploy/stg | ステージングアカウント |
deploy/dev | 開発アカウント |
上記のブランチ名に変更がPUSHされることをトリガーにAWS CodePipelineが起動し、対応するアカウントにデプロイされるようにします。
CodePipelineのトリガーフィルター
各環境ごとにCodePipelineのトリガーフィルターを設定します。例えば、mainブランチの場合は以下のように設定します。
フィルターは複数設定できるので、残りの2つにも同様の設定を行います。最終的に、CodePipelineのトリガーは以下のようになります。
CodePipelineからCodeBuildにブランチ名を渡す
最初に、Sourceステージのアクションにて出力変数の名前空間を確認しておきます。デフォルトでは SourceVariables
になっていますので、今回はそのまま使います。
次に、Buildステージにて環境変数を設定します。
GitHubがソースプロバイダの場合は BranchName
という変数キーで出力変数にブランチ名が格納されています。その他に CommitId
や RepositoryName
なども取得できますので、詳しくは以下のドキュメントを参照してください。
名前空間の変数には ${名前空間.変数名}
でアクセスできますので、Buildステージにおけるアクションの環境変数には以下のように設定します。
名前 | 値 | タイプ |
---|---|---|
BRANCH | #{SourceVariables.BranchName} | プレーンテキスト |
これにより、CodeBuildでブランチ名を環境変数として受け取れるようになります。
CodeBuildのbuildspecファイル
では、実際に buildspec.yml
を書いていきます。
CodePipelineにより注入された環境変数からブランチ名を取得し、 commands
に分岐処理を実装してデプロイ先を切り替えます。
version: 0.2
phases:
pre_build:
commands:
- echo "ブランチ名からデプロイ先を切り替えます"
- |
case ${BRANCH} in
develop/dev)
export BUCKET_NAME="dev-artifacts-bucket"
;;
develop/stg)
export BUCKET_NAME="stg-artifacts-bucket"
;;
main)
export BUCKET_NAME="prd-artifacts-bucket"
;;
*)
echo "Unknown branch: ${BRANCH}"
exit 1
;;
esac
build:
commands:
- echo "ビルド処理を実行します"
post_build:
commands:
- echo "成果物をデプロイ先のS3にアップロードします"
- aws s3 cp artifact.zip "s3://${BUCKET_NAME}/artifacts/"
トリガーフィルターにてワイルドカードを使っている場合、ブランチ名によっては deploy/test
のような値が渡されることがあります。そのため、 case
文で分岐処理を行う際には注意が必要です。
おわりに
CodePipelineの利点の1つは、責務を分離しつつもアクション間でシームレスに連携が取れる点にあると思います。今回は、ブランチ名によってデプロイ先を切り替えるという要件に対して、1つのCodePipelineで対応する方法を紹介しました。