GitHubのwebフックイベントでCodeBuildを動かす際にぶち当たる壁
CodeBuildでデプロイの仕組みを作成するうえで、
「GitHubのPRマージをトリガーとしてCodeBuildを動かす」
という構成にしている方もいらっしゃると思います。
その際、WEBフックイベントで動き出したCodeBuildが見ているのはマージ先のブランチではなく、マージ元のブランチになります。
version: 0.2
env:
shell: bash
phases:
install:
commands:
# 関係ないので略
build:
commands:
- npx cdk deploy #ここでdeployが行われるのはマージ元のブランチのコード
この仕様のせいで、修正を行っていたブランチ(下図でいうとfeature2ブランチ)をマージするより前に、マージ先のブランチ(下図でいうとdevelopブランチ)に変更が入っていた場合、少し面倒なことになります。
……お察しの通り、feature1をマージすることによって適用されていた変更や、そのままdevelopブランチに積み重ねていたコミットが打ち消されてしまうんですね。
先に解決策
CodeBuildの中でブランチを切り替えちゃいましょう。
ビルドスペックを以下のように書き換えるとうまくいきました。
version: 0.2
env:
shell: bash
phases:
install:
commands:
# 関係ないので略
pre_build:
commands:
- git switch develop
build:
commands:
- npx cdk deploy #developブランチのコードがデプロイされます!
デプロイコマンドの前にswitchすればいいいんですね。
回り道
以下は解決策にたどりつくための試行錯誤の過程です。
swicthする前にfetchしないとダメかもなと思っていたので、
# 関係ないので略
pre_build:
commands:
- git fetch #ここでエラーが起きてビルドが落ちます
- git switch develop
build:
commands:
- npx cdk deploy
と書いてたんですが、
こうすると
PRE_BUILD: COMMAND_EXECUTION_ERROR: Error while executing command: git fetch. Reason: exit status 128というエラーが出てしまいました。
理由としてはCodeBuildにはGitHubのリポジトリに対してアクセス権限が無いということなんでしょうね。
fetchしなくても該当リポジトリのブランチの情報はデフォルトでCodeBuild内に持ってきていることが分かったので、
先ほどのビルドスペックに落ち着きました。