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内に持ってきていることが分かったので、
先ほどのビルドスペックに落ち着きました。