tfcmtとGitHub公式のbranch-deployアクションを一緒に使うときはtfcmtにPR番号の解決を任せられない
- k_bigwheel
- 1067
- 0
- 0
- 0
うーん、使おうとしているOSSのわけわからん挙動に頭を捻らせている。実績的にこんな大きなバグが残っているとは考えづらいので、うちのブランチ構造?使い方?固有の問題の可能性が高い。ただ、ドキュメント上はこれで動くように書いてある。 デバッグログ出すなど追加の調査が必要。
2023-09-22 23:00:54原因わかった。結論、tfcmtのせいではなかった。branch-deployが原因でした。というか、バグではなく特定ケースで挙動にクセがあって直感的ではないだけかもしれない。
2023-09-24 10:23:25しかし、いざというときに自分でデバッグコード挟んでビルドし、元のバイナリと置き換えられるというのはいいね。謎をちゃんと解明できる。
2023-09-24 10:24:40原因は github.com/github/branch-… で.deployしたとき、期待しているPRの最新コミットではなく、なぜか最新のコミットであるマージコミットのマージ前のコミットがトリガーされることだとわかった。
2023-09-24 11:41:04なぜそうなるのか、この直感的ではない挙動の原因はたぶんこれかその周辺に関係すると思う。 github.com/github/branch-… 要約すると、つまり、この話はマージコミットとその直前のコミットを半ば同一視する、という話にある(目的は冗長なデプロイ処理を省くため)。おそらくこれが意図せず暴発している。
2023-09-24 11:41:05つまり、.deployや.noopしたときにtfcmtが意図しないPRへコメントしてしまう問題は - branch-deploy - tfcmt - PRブランチへの他のPRのマージ(今回は.noopをトリガーとしてbranch-deploy自身がマージコミットを自動作成した結果) により起こる。
2023-09-24 11:47:09パッと思いつく解決策は2つ。 1つは、マージコミットを許可せず、必ずrebaseすること。 個人的にはマージコミットが得意ではないため、こちらのほうが好きだが、マージと違い自動的な解決が格段に失敗しやすいという問題がある。
2023-09-24 11:50:53もう1つは、branch-deployのコミット選択ロジックに介入する方法。 これは、基本的にあり。というか正しい解決策。 なぜなら、 github.com/github/branch-… の方法はTerraform用のブランチロックを使ったIssueOpsと適合しておらず、不要な仕組みなため。
2023-09-24 11:50:53ただ問題は、そもそもそういった設定変更が可能かどうかわからないということ。少なくとも、 github.com/github/branch-… にはそういった記述はなかった。これ以上の調査には、ないかもしれない記述・設定を探してドキュメントへ目を通す、タフな調査が必要になる。
2023-09-24 11:52:41github.com/github/branch-… 厳しい。branch-deployとモノレポの組み合わせの悪さは既知で、かつまだ解決策は考えられていないか。
2023-09-24 12:14:0615分調べてみたが見当たらず。それどころかマージコミットと発火コミットの選択に関するIssue, PRなど一切見当たらなかった。もしかしてenvironment deployment周りのロジックと話が結合している?下手をするとコードレベルでも結合してしまっているかもしれない・・・。
2023-09-24 12:15:26tfcmt(go-ci-env)、僕がgoの知識薄くてよくわかっていないだけかもしれないけど、ポリモーフィックなことをやろうとして、goの特性上あんまりうまく行っていない?ような雰囲気がある。
2023-09-24 23:39:052日かかってやっと突き止めた。 go-ci-envのgithub actionsモードが、GITHUB_SHAからコミットハッシュを取っており github.com/suzuki-shunsuk… 、これから github.com/suzuki-shunsuk… でPRを特定している。 が、これがIssueOpsととても相性が悪いらしい。
2023-09-25 00:22:33PRにコメントしてissue_commentでgithub actionsを発火させたとき、かつ、PRの最新コミットがマージコミットであったとき?、GitHubにはどうやら直感的ではない挙動がある。 具体的にはGITHUB_SHA環境変数にPRの最新コミット(=マージコミット)ではなく、そのマージされる直前のコミットハッシュが入る。
2023-09-25 00:26:40訂正。 docs.github.com/en/actions/usi… マージコミットは関係なかった。 ドキュメントに issue_comment の場合はGITHUB_SHAは「Last commit on default branch」になるとちゃんと書いてある。
2023-09-25 00:30:36なぜGITHUB_SHAがこの挙動なのにbranch-deployはcheckoutアクションとうまくやって行けているんだ、terraformをCIできるんだ、と思ってexample参照したら謎が溶けた。 github.com/github/branch-… ``` with: ref: ${{ steps.branch-deploy.outputs.ref }} ``` これだ、これが抜けていた。
2023-09-25 00:34:55つまり、今までうまくcheckoutアクションとやって行けていたように見えたのは勘違いで、実は今までもずっとデフォルトブランチをcheckoutしていた。PRの中身でデフォルトブランチとほぼ変わらない内容だったため気づいていなかっただけ。 buildersbox.corp-sansan.com/entry/2021/02/… SANSANさんのこの記述が正しかった。
2023-09-25 00:36:35改めて結論。 tfcmtは間違っていなかった。github actionsは紛らわしいものの仕様にはちゃんと書いてある。tfcmtがどの値を参照してPRを決定しているのロジックがちゃんとわかっていなかったこと、github actionsのissue_commentの仕様が直感的ではなかったのがさまよった原因。
2023-09-25 00:40:19github actionsのon pushでの挙動が念頭にあったため、PRにコメントしたらGITHUB_SHAはそのPRの最新のものになるという想定があった(が、実際にはそうではなかった)。
2023-09-25 00:40:19buildersbox.corp-sansan.com/entry/2021/02/… 調査中お世話になったので、この記事を今参照している人に役に立つかもしれない情報を残しておきます。 記事中の取り組み、最終的には断念されたそうですが、ここでやりたかったことを機能として提供してくれているGitHub公式のアクションbranch deployが今ではあります。
2023-09-25 00:42:40