タダです.
下記の画像のような CodePipeline と CodeBuild でパイプラインを作っていた時に GitHub で登録した最新のタグでリリースを行いたいといった要望があったので試してみた内容をこの記事にまとめていきます.
前提
冒頭の話について今回の設定と関連する部分を補足します.CodePipelineの設定は当初下記の画像のようなデフォルト設定でGitHub(バージョン2)
の接続がされている状況でした.
また,CodeBuild の IAM ロールは下記のデフォルト設定が入っている状態だったとします.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": [ "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxx:log-group:/aws/codebuild/xxxx", "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxx:log-group:/aws/codebuild/xxxx:*" ], "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ] }, { "Effect": "Allow", "Resource": [ "arn:aws:s3:::codepipeline-ap-northeast-1-*" ], "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:GetBucketAcl", "s3:GetBucketLocation" ] }, { "Effect": "Allow", "Action": [ "codebuild:CreateReportGroup", "codebuild:CreateReport", "codebuild:UpdateReport", "codebuild:BatchPutTestCases", "codebuild:BatchPutCodeCoverages" ], "Resource": [ "arn:aws:codebuild:ap-northeast-1:xxxxxxxxxxxx:report-group/xxxx*" ] } ] }
CodeBuild のタグリリースに関するコマンド追加
ビルドをする段階で最新のタグをチェックアウトしたいのでコマンドをbuildspec.yml
に追加します.build
フェーズにgit checkout $(git describe --tags --abbrev=0)
というコマンドを追加しています.
version: 0.2 env: git-credential-helper: yes ~中略~ build: commands: - git checkout $(git describe --tags --abbrev=0) ~中略~
タグとしては次のようなものが設定されていた場合,git describe --tags --abbrev=0
を実行すると最新のv1.6
が選ばれるのでこのコマンドの実行結果を使ってチェックアウトしています.
% git tag v1.0 v1.1 v1.2 v1.3 v1.4 v1.5 v1.6 % git describe --tags --abbrev=0 v1.6
関連情報
CodePipeline の設定を変更
git describe --tags --abbrev=0
を実行するために Git メタデータを取得する必要があり CodePipeline の設定で完全クローンを指定します.
CodePipeline で GitHub ソースアクションの完全なクローンオプションを選択できます。パイプラインビルドアクションで Git メタデータの CodeBuild コマンドを実行するには、このオプションを使用します。
CodeBuild の IAM ロール の設定変更
GitHub(バージョン2)
を使っていてかつ CodePipeline の完全クローンオプションを使う時そのままリリースしたいブランチでコードをあげたところ Command did not exit successfully git checkout $(git describe --tags --abbrev=0) exit status 128
というエラーがでました.
[Container] 2021/07/02 12:02:44 Command did not exit successfully git checkout $(git describe --tags --abbrev=0) exit status 128 [Container] 2021/07/02 12:02:44 Phase complete: BUILD State: FAILED [Container] 2021/07/02 12:02:44 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: git checkout $(git describe --tags --abbrev=0). Reason: exit status 128
ドキュメント を確認したところ codestar-connections
の権限がなかったので CodeBuild の IAM ロールを変更しています.
CodeBuild サービスのロールは、接続を使用するアクセス許可で更新する必要があるため、最初のパイプライン実行は失敗します。codestar-connections:UseConnectionサービスロールポリシーに対する IAM アクセス許可を追加。
IAM ロール変更後,再度パイプラインを動かしたところ意図したタグでチェックアウトができました.
[Container] 2021/07/14 00:13:19 Running command git checkout $(git describe --tags --abbrev=0) Previous HEAD position was xxxx Merge pull request #4 from tasogare0919/xxxx HEAD is now at xxxx v1.6
まとめ
CodePipeline と CodeBuild で最新の Git タグによるリリースを行うために行った設定をまとめていきました.タグリリースを使えるようになると万が一過去のバージョンに戻したい時に戻しやすくなるし開発方針に合えば使うのを検討したいですね.