tfcmtとGitHub公式のbranch-deployアクションを一緒に使うときはtfcmtにPR番号の解決を任せられない

tfcmtとGitHub公式のbranch-deployアクション(IssueOps)を一緒に使おうとしたときに遭遇した問題と、解決策に至るまでの調査ログです。
4
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

うーん、使おうとしているOSSのわけわからん挙動に頭を捻らせている。実績的にこんな大きなバグが残っているとは考えづらいので、うちのブランチ構造?使い方?固有の問題の可能性が高い。ただ、ドキュメント上はこれで動くように書いてある。 デバッグログ出すなど追加の調査が必要。

2023-09-22 23:00:54
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

goは僕の魂の場所ではないが、まあ、比較的読みやすいのはいいことではある。

2023-09-22 23:02:45
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

わけわからんが、多分コーナーケースふんだんだろうなあ。

2023-09-22 23:21:15
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

15分コード追ってわからんかったらprintfデバッグしよう。

2023-09-22 23:28:10
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

だめだ。しゃーない、明日ビルド環境作るかあ。

2023-09-22 23:49:59
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

原因わかった。結論、tfcmtのせいではなかった。branch-deployが原因でした。というか、バグではなく特定ケースで挙動にクセがあって直感的ではないだけかもしれない。

2023-09-24 10:23:25
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

しかし、いざというときに自分でデバッグコード挟んでビルドし、元のバイナリと置き換えられるというのはいいね。謎をちゃんと解明できる。

2023-09-24 10:24:40
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

原因は github.com/github/branch-… で.deployしたとき、期待しているPRの最新コミットではなく、なぜか最新のコミットであるマージコミットのマージ前のコミットがトリガーされることだとわかった。

2023-09-24 11:41:04
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

なぜそうなるのか、この直感的ではない挙動の原因はたぶんこれかその周辺に関係すると思う。 github.com/github/branch-… 要約すると、つまり、この話はマージコミットとその直前のコミットを半ば同一視する、という話にある(目的は冗長なデプロイ処理を省くため)。おそらくこれが意図せず暴発している。

2023-09-24 11:41:05
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

つまり、.deployや.noopしたときにtfcmtが意図しないPRへコメントしてしまう問題は - branch-deploy - tfcmt - PRブランチへの他のPRのマージ(今回は.noopをトリガーとしてbranch-deploy自身がマージコミットを自動作成した結果) により起こる。

2023-09-24 11:47:09
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

パッと思いつく解決策は2つ。 1つは、マージコミットを許可せず、必ずrebaseすること。 個人的にはマージコミットが得意ではないため、こちらのほうが好きだが、マージと違い自動的な解決が格段に失敗しやすいという問題がある。

2023-09-24 11:50:53
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

もう1つは、branch-deployのコミット選択ロジックに介入する方法。 これは、基本的にあり。というか正しい解決策。 なぜなら、 github.com/github/branch-… の方法はTerraform用のブランチロックを使ったIssueOpsと適合しておらず、不要な仕組みなため。

2023-09-24 11:50:53
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

ただ問題は、そもそもそういった設定変更が可能かどうかわからないということ。少なくとも、 github.com/github/branch-… にはそういった記述はなかった。これ以上の調査には、ないかもしれない記述・設定を探してドキュメントへ目を通す、タフな調査が必要になる。

2023-09-24 11:52:41
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

github.com/github/branch-… 厳しい。branch-deployとモノレポの組み合わせの悪さは既知で、かつまだ解決策は考えられていないか。

2023-09-24 12:14:06
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

15分調べてみたが見当たらず。それどころかマージコミットと発火コミットの選択に関するIssue, PRなど一切見当たらなかった。もしかしてenvironment deployment周りのロジックと話が結合している?下手をするとコードレベルでも結合してしまっているかもしれない・・・。

2023-09-24 12:15:26
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

tfcmt(go-ci-env)、僕がgoの知識薄くてよくわかっていないだけかもしれないけど、ポリモーフィックなことをやろうとして、goの特性上あんまりうまく行っていない?ような雰囲気がある。

2023-09-24 23:39:05
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

2日かかってやっと突き止めた。 go-ci-envのgithub actionsモードが、GITHUB_SHAからコミットハッシュを取っており github.com/suzuki-shunsuk… 、これから github.com/suzuki-shunsuk… でPRを特定している。 が、これがIssueOpsととても相性が悪いらしい。

2023-09-25 00:22:33
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

PRにコメントしてissue_commentでgithub actionsを発火させたとき、かつ、PRの最新コミットがマージコミットであったとき?、GitHubにはどうやら直感的ではない挙動がある。 具体的にはGITHUB_SHA環境変数にPRの最新コミット(=マージコミット)ではなく、そのマージされる直前のコミットハッシュが入る。

2023-09-25 00:26:40
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

訂正。 docs.github.com/en/actions/usi… マージコミットは関係なかった。 ドキュメントに issue_comment の場合はGITHUB_SHAは「Last commit on default branch」になるとちゃんと書いてある。

2023-09-25 00:30:36
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

なぜ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
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

つまり、今までうまくcheckoutアクションとやって行けていたように見えたのは勘違いで、実は今までもずっとデフォルトブランチをcheckoutしていた。PRの中身でデフォルトブランチとほぼ変わらない内容だったため気づいていなかっただけ。 buildersbox.corp-sansan.com/entry/2021/02/… SANSANさんのこの記述が正しかった。

2023-09-25 00:36:35
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

改めて結論。 tfcmtは間違っていなかった。github actionsは紛らわしいものの仕様にはちゃんと書いてある。tfcmtがどの値を参照してPRを決定しているのロジックがちゃんとわかっていなかったこと、github actionsのissue_commentの仕様が直感的ではなかったのがさまよった原因。

2023-09-25 00:40:19
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

github actionsのon pushでの挙動が念頭にあったため、PRにコメントしたらGITHUB_SHAはそのPRの最新のものになるという想定があった(が、実際にはそうではなかった)。

2023-09-25 00:40:19
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

buildersbox.corp-sansan.com/entry/2021/02/… 調査中お世話になったので、この記事を今参照している人に役に立つかもしれない情報を残しておきます。 記事中の取り組み、最終的には断念されたそうですが、ここでやりたかったことを機能として提供してくれているGitHub公式のアクションbranch deployが今ではあります。

2023-09-25 00:42:40