継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

CodePipeline と CodeBuild で Git のタグを使ったリリースを行う

タダです.

下記の画像のような CodePipeline と CodeBuild でパイプラインを作っていた時に GitHub で登録した最新のタグでリリースを行いたいといった要望があったので試してみた内容をこの記事にまとめていきます.

f:id:sadayoshi_tada:20210715051202p:plain

前提

冒頭の話について今回の設定と関連する部分を補足します.CodePipelineの設定は当初下記の画像のようなデフォルト設定でGitHub(バージョン2)の接続がされている状況でした.

f:id:sadayoshi_tada:20210715051410p:plain f:id:sadayoshi_tada:20210715051427p:plain

また,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

関連情報

docs.aws.amazon.com

CodePipeline の設定を変更

git describe --tags --abbrev=0を実行するために Git メタデータを取得する必要があり CodePipeline の設定で完全クローンを指定します.

f:id:sadayoshi_tada:20210716094545p:plain

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 タグによるリリースを行うために行った設定をまとめていきました.タグリリースを使えるようになると万が一過去のバージョンに戻したい時に戻しやすくなるし開発方針に合えば使うのを検討したいですね.