Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

テストが通ったら自動的にマージできるようにしたい #53

Open
Hiroshiba opened this issue May 11, 2024 · 25 comments
Open

Comments

@Hiroshiba
Copy link
Member

Hiroshiba commented May 11, 2024

内容

テストが通ったら自動的にマージできるようにしたいです。

merge queueを使えば可能なはずなのですが、VOICEVOXのレビュー&approve事情に合ってないためそのままでは適用できなさそうでした。

VOICEVOXのプルリクエストマージは、以下の2つの条件のうちどちらかを満たすと可能としています。

  • @maintainerチームの1人のapprove
  • @reviewerチームの2人のapprove

branch protectionを使えば「何人以上のapproveが必要か」と「誰ならforce mergeが可能か」を設定できます。
なので、2人以上のapproveがあるか、@maintainerチームのforce mergeを有効にすることで、↑のどちらの条件でもマージできるようにしています。

問題はこれがmerge queueで使えないっぽいことです。
というのも、「N人以上のapprove」ではmerge queueを使えますが、force mergeの場合はmerge queueを無視して対象のブランチにマージするという挙動をするっぽいです。

さてどうしようかなという感じです・・・ 😇

実現方法

いくつか解決策はあると思います。とりあえず列挙してみます。

  • @maintainerのapproveがあれば自動でapproveしてくれるbotを追加する
    • botに承認してもらうことで「2人がapproveしている」という条件を満たす
    • これが一番手っ取り早い気がしています
    • https://github.com/hiho-check-organization/check-auto-merge で試していたのですが、権限周りでつまづいたので一旦諦めました
    • たぶんorgの情報を見れるPATを設定しないといけない・・・?
  • Branch protection ruleによる判定ではなく、専用のマージ可否判定Github Actionsを作る
    • これが一番柔軟そうではある
    • けどなんか結構大変そう
    • merge queueに登録するAPIが無さそう・・・?だから不可能かも・・・?
    • 専用のActionsでマージ可否判定→botがapprove→botのapproveがあればmerge queue可能になるBranch protection rule なら可能かも
  • マージ条件の方を変える
    • いい条件が思いつかない・・・。

その他

メモです。

  • merge-queueはorganizationを作ってその下じゃないとテストできない
    • organization作るのは無料でできるのでサクッと作っちゃえば良いはず
  • Branch protection ruleだけじゃなくRulesetsでもmerge queueを作れる
    • rulesetはexportもできるのでこっちの方が便利そう
@Hiroshiba Hiroshiba added 機能向上 要議論 実行する前に議論が必要そうなもの labels May 11, 2024
@Hiroshiba
Copy link
Member Author

もし挑戦してみたい方がいらっしゃったらコメントください 🙇
条件等も細かいところが分かりづらいと思うので何でもお聞きください!

@Hiroshiba
Copy link
Member Author

@VOICEVOX/maintainer すみません、ちょっと勝手にプロジェクト作ってしまいました 🙇

オートマージしたく色々試してみたのですが、github の仕様とVOICEVOXの要件が合いませんでした・・・。
このプロジェクトリポジトリに作るissueとしてはちょっと規模感が小さいかもなので、移動した方が良さそうだったら移動します 🙇

@Hiroshiba Hiroshiba changed the title auto-mergeを可能にしたい テストが通ったら自動的にマージできるようにしたい May 27, 2024
@Hiroshiba
Copy link
Member Author

この頃から色々状況が変わっている気がする&あと Discord で色々議論したのでメモを追加します!
Discordの議論はこの辺り

この時と違い、merge queueはBranch Protectionが必須じゃなくなりました。
おそらく今は「いつでもmerge queueは使え、マージカードも同じ条件になったらmerge queueが発動してマージできる」だと思います。

ということで、例えばrulesetRequire status checks to passを利用し、以下の方針とかが考えられそうです。

  1. 必要なApprove数をチェックするGithub Workflowを作る
  2. そのワークフローの結果をrulesetの必須チェックに設定
  3. 十分な手動Approveがあればワークフローを成功にし、他のテストと合わせて条件を満たしたらmerge queueが発動するようにする

これならBotによる自動Approveを行わなくても運用できそう。

@sevenc-nanashi
Copy link
Member

sevenc-nanashi commented Dec 30, 2024

試作しました:
https://github.com/nanatsuki-testing/merge-queue

こんな仕様になっています:

  • メンテナロール持ちが自動マージを有効化(≒マージキューに入れる)するとマージを許可
  • レビュワーロール持ちが自動マージを有効化した時、レビュワーロール持ちによるApproveレビューが2個あれば許可
  • それ以外は却下

参照用:

  • 自分がメンテナロール持ち
  • ヒホさんとraaさんがレビュワーロール持ち

要件をちゃんと満たしてそう?

@Hiroshiba
Copy link
Member Author

リポジトリ眺めさせていただきました、良さそう!!
(ChatGPTに解説を頼んでみた感じ、結構わかりやすかった。)
https://chatgpt.com/share/677282f3-dbd0-8008-9d52-986060e1e105

ぜひVOICEVOX内で運用してみたい気持ちでいます!
コードをどう管理するか相談したみ。ちょっとたたき台として案出してみます!

コード読むに汎用的なGithub Actionsにすることも可能そうではあるけど、VOICEVOX Org内で専用に管理したほうが楽そうな気がしました!
メンテナ・レビュワーチームがいたり、人数がマジックナンバーになってる設計になってたり。
なのでVOICEVOX Org下にGithub Actionsを置いて、それを使う専用のworkflowをmerge queue使いたい側のリポジトリに置くのが無難・・・でしょうか。

merge queueはいろんなとこで使いたくて、ファイル配置していくのちょっと大変かもではありますね。
merge queue管理リポジトリを作って、そこに登録したリポジトリは自動で見てくれる設計ができれば楽そうだけど、他のリポジトリのPRやmerge queue OKをトリガーに動かせないと難しそう。

あ、各リポジトリからGithub Acitionsを呼び出す形で行く場合、もし可能ならメンテナチーム名やレビュワーチーム名は指定にできそうでしょうか 🙇
確か今VOICEVOXのレビュワーチームは全リポジトリ共通なのですが、メンテナチームはリポジトリごとに異なるので・・・!
(まあ共通でも問題なさそうだけど)

@sevenc-nanashi
Copy link
Member

sevenc-nanashi commented Dec 30, 2024

なのでVOICEVOX Org下にGithub Actionsを置いて、それを使う専用のworkflowをmerge queue使いたい側のリポジトリに置くのが無難・・・でしょうか。

ですね。具体的には色々なリポにこんなWorkflowを置く形になると思います:

そんなWorkflow
on:
  pull_request_target:
    types: [auto_merge_enabled]
  merge_group:
    types: [checks_requested]

jobs:
  approve:
    runs-on: ubuntu-latest
    steps:
      - uses: voicevox/review-checker@main
        with:
          token: ${{ secrets.OWNER_TOKEN }}
          event: ${{ toJson(github.event) }}
          ref: ${{ github.ref }}

あ、各リポジトリからGithub Actionsを呼び出す形で行く場合、もし可能ならメンテナチーム名やレビュワーチーム名は指定にできそうでしょうか 🙇
確か今VOICEVOXのレビュワーチームは全リポジトリ共通なのですが、メンテナチームはリポジトリごとに異なるので・・・!

入力でメンテナチーム名を受け取る感じにすればいい感じになるかも?

コード読むに汎用的なGithub Actionsにすることも可能そうではあるけど、VOICEVOX Org内で専用に管理したほうが楽そうな気がしました!
メンテナ・レビュワーチームがいたり、人数がマジックナンバーになってる設計になってたり。

こう、こんな感じにすれば他のリポでも使えるかなぁとか思ったりしました:

      - uses: voicevox/review-checker@v1
        with:
          token: ${{ secrets.OWNER_TOKEN }}
          event: ${{ toJson(github.event) }}
          ref: ${{ github.ref }}

          # 合計ポイント数
          required_score: 2
          # チームとポイントの関連付け
          # Merge when Ready押した人もApprove扱いにすれば今の挙動みたいになるはず
          score_rules: |
            maintainer: 2
            reviewer: 1

@sevenc-nanashi
Copy link
Member

sevenc-nanashi commented Dec 30, 2024

actionに切り出してみました:
https://github.com/sevenc-nanashi/approve-counter

チームやユーザーの指定が良い感じにできるようになっています。

@Hiroshiba Hiroshiba removed the 要議論 実行する前に議論が必要そうなもの label Dec 31, 2024
@Hiroshiba
Copy link
Member Author

良さそう!!! コードも一旦なんとなく眺めさせていただきました!
(readmeとファイルはMITライセンスだけどpackage.jsonに書かれてるのはISCになってるかも)

on:
  pull_request_target:
    types: [auto_merge_enabled]
  merge_group:
    types: [checks_requested]

と2つ書かないといけないのが疑問でした(pull_request_targetだけでも良さそう)が、下の方も仕様上必要な感じですよね。
であれば今の仕様が良さそう!


Discordで少し話した件ですが、preview-pages同様にVOICEVOX Org内で管理するのはどうでしょうか?
VOICEVOXが使いやすい形を保つのが嬉しそうなのと、あとOrg内のGithub Actionsをメンテする経験を積んでみたいためです(後者は完全に私的な理由ですが)。

ただ1点、もしVOICEVOXにとっては不要な提案や変更が来たときのスタンスが変わってきそうです。
@sevenc-nanashi さんリポジトリであればここの方針は自由だけど、VOICEVOX的には優先度が相当低いのでモチベーション的に微妙かも。
ここのどれくらい汎用的にしたいかがポイントかもです。(あとレビューが入る点)
これもどちらでも良い感じであれば、ぜひVOICEVOX Orgリポジトリで進行できると嬉しいです!!

リポジトリ作っていただいて、preveiew-pagesのときみたくinitialコミットとして全部PRいただければ!! 🙏
今の段階のコメントとしてはこんな感じです:

  • 採用技術に異論なしです
    • biomeがVOICEVOX的には新技術で、採用する場合は知見を @sevenc-nanashi さんに頼りたい気持ち!
  • distを書き出すまでの手法はREADMEに書かれてると嬉しいかも
    • 他の人がメンテしやすい&数年後の我々を助けてくれる
  • src/index.tsの処理の大まかな単位ごとに、何やってるかの一言コメントが書かれてるとたぶんメンテしやすそう
  • auto mergeボタンが押されてからマージされるまでのシーケンス図があると嬉しそう
    • だけどこれは結構作るの大変そうだし、なくても良さそう?
  • リポジトリ名悩む
    • ボイボ的には、「approveをカウントする」以外にマージをブロックしたい可能性があるか次第かも
    • なさそうな気もする
    • 機能名の方で名付けるならmerge-gatekeeperとかもありかも ChatGPTの案

@sevenc-nanashi
Copy link
Member

VOICEVOXにとっては不要な提案や変更が来たときのスタンスが変わってきそう

バグ修正や細かい改善(例えばログを見やすくしたりなど)は受け付けつつ、新機能はあまり受け付けない、みたいな感じが良さそう?(pysenみたいなイメージ)

biome

.vscode/settings.jsonなどでprettierを無効化しないといけない、くらいですかね?

リポジトリ名

まぁmerge-gatekeeperでよさそう。

リポ作ります。

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Dec 31, 2024

あーーーpysenのそこの文面めちゃくちゃいいですね!!!
言いたいことが簡潔に書かれてる。readmeに最初から書いちゃっても良いかもですね!

リポジトリ作る周りで権限足りなければ言っていただければ!!

@Hiroshiba
Copy link
Member Author

VOICEVOX org全体で、必要だと思われる権限を付与したPATをsecrets.GATEKEEPER_TOKENとして登録しました!

ついでmerge-gatekeeperリポジトリでstatus checkをONにしました。
Image

そしてmerge-gatekeeperリポジトリでAllow auto-mergeをONにしました!!
これでmerge-gatekeeperリポジトリは設定完了なはず・・・!

@sevenc-nanashi
Copy link
Member

マージキューを使うような設定になってないかもです。

@Hiroshiba
Copy link
Member Author

あ、なるほどです!
merge queue、設定がいっぱいあって良くわからないですね。。

ちょっと調べて設定してみます!

@sevenc-nanashi
Copy link
Member

マージキューを使うには「Require merge queue」にチェックを入れる必要があります。

リポ作ったのが自分だからか設定が変えられたので変えてきました。

@Hiroshiba
Copy link
Member Author

たしかデフォルトの設定だと複数のPRが1つにまとめられてしまうんですよね。
たぶんこれで1PR1コミットになる気がする・・・!

Image

ということで設定しました!

@Hiroshiba
Copy link
Member Author

試した条件:

  • @sevenc-nanashi さん(スコア1)がセルフmerge試みる → 正しく失敗(スコア2が必要)
  • ヒホがapprove、 @sevenc-nanashi さんがセルフmerge試みる → 正しく成功(スコアが2+1で3になった)

コミット履歴も問題なさそう!!
Image

@Hiroshiba
Copy link
Member Author

あ、merge queueのまとめてCI回す設定、もしかしたら別にcommitはまとめないのかも。
まとめてCIしても1つずつちゃんとコミットされる気がしてきました。

ま〜でもとりあえず1つずつテスト&マージしてみる運用で動かしてみて、ちょっと詰まるな〜と思ったらここのグループ数いじる感じでも良いかも!

@Hiroshiba
Copy link
Member Author

試した条件:

  • ヒホがPR、 @sevenc-nanashi さんがapprove、ヒホがセルフmerge → 正しく成功(スコアが1+2で3になった)

@Hiroshiba
Copy link
Member Author

行けてる気がしますね!!!!!!!!

ちょっとエディタ辺りに実装してみますか!!
merge-gatekeyper使うようにするPRいただけると・・・!

ただ今日はもう寝ようと思うので、また明日の夕方とか夜とかに設定しようと思います!

@Hiroshiba
Copy link
Member Author

VOICEVOXエディタの設定を進めたいと思っています!
がその前にforce mergeが可能なようにできるか、merge-gatekeyperで試してみたいと思います。

@Hiroshiba
Copy link
Member Author

Required status checkについてDiscordで議論したことのまとめコメントです!
https://discord.com/channels/879570910208733277/893889888208977960/1323933392227536936

  • GitHubのRequired status checkが「テストをすべて通したら自動マージ」に対応してない
  • まともにやろうとすると、新規追加テストなどにRulesetの書き換えが必要
  • 解決策として「ジョブ名を統一してRequiredチェックを設定する」「mixiやupsidrなどのGatekeeper系アクションを導入する」などがある
  • “upsidr/merge-gatekeeper”アクションを導入するのが良さそう
    • スケールしやすい
    • 今のuses: voicevox/merge-gatekeeper@mainの下にuses: upsidr/merge-gatekeeper@v1を足せば良いだけ
    • ポーリングするだけのworkflowが立ち続けるけど、ubuntuなのでVOICEVOX的にはあまり問題にならない・・・はず・・・!

@Hiroshiba
Copy link
Member Author

upsidr/merge-gatekeeper@v1、テスト通るパターンはちゃんと通ってそう!! 🎉

ログ↓

Start processing validator: merge_gatekeeper....
1 out of 1
Total job count:       1
Completed job count:   1
Incompleted job count: 0
Failed job count:      0
Ignored job count:     0
Failed jobs
  []
Completed jobs
  - test
Incomplete jobs
  []
Ignored jobs
  []
All jobs
  - test
Finish validator: merge_gatekeeper processing.
All validations were successful!

@Hiroshiba
Copy link
Member Author

テスト落ちるパターンもちゃんと落ちてそう!! 🎉

@Hiroshiba
Copy link
Member Author

エディタ側に検証管理用のissueを作ってみました。

@Hiroshiba
Copy link
Member Author

エディタへの導入は完了しました!! @sevenc-nanashi さんに感謝!!

まだなにか変わりうりそうなので、もうちょっとだけ運用してみて固まったら他のリポジトリにも適用していきたいです!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants