Forgejo・Gitea で必須のチェックが通らない理由
対象のブランチの保護のルールで Enable status check がオンのとき、Forgejo と Gitea は、プルリクの先頭のコミットで必須のチェックが通ったときだけマージします。それまでマージの欄には Some required checks were not successful. か Some required checks are missing. と出て、API のマージは 405 Not all required status checks successful で断られます(マージが断られた理由)。両方のソース(services/pull/commit_status.go の MergeRequiredContextsCommitStatus と、Forgejo のマージの欄 templates/repo/issue/view_content/pull.tmpl。Gitea にも同じ文があります)から、サーバーの決め方をまとめます。
2つの文
Some required checks were not successful.:必須のチェックがfailureかerrorで終わった。Forgejo Actions と Gitea Actions のジョブは、失敗しても取り消されてもfailureを報告します。Some required checks are missing.:それ以外の、合格でないもの全部。先頭のコミットのどのステータスにもまだ合わないパターン(チェックの一覧に黄色の点と Required の札で出ます)、まだpendingのチェック(待ち・ブロック中・実行中のジョブ)、そして Forgejo ではwarningもここに入ります。
リポジトリの管理者には As an administrator, you may still merge this pull request. と出て、ルールが管理者にも効く設定でなければ、そのままマージできます。
サーバーの読み方
- 名前ごとに最新のステータスだけを数えます。それもプルリクの先頭のコミットのものだけです。前のコミットで合格したチェックは、push の後は数えません。
- パターンはそれぞれ、ステータスに1つは合わないといけません。どれにも合わないパターンが1つあれば、ほかが全部合格でもマージは待ちのままです。1つのパターンに合うステータスが複数あれば、いちばん悪いものを数えます。
- パターンは glob です(gobwas/glob というライブラリを区切り文字なしで使用)。
*と**はスラッシュも含めて何文字でも、?は1文字、[abc]・[a-z]・[!abc]・[!a-z]は1文字(1つのかっこに範囲か並びのどちらか一方)、{lint,test}はどれか1つ、\は次の1文字をそのまま、です。つまりci / *は ci という名前のワークフローの全ジョブに合います。設定の画面は読めないパターンを断ります(Invalid status check pattern)。パターンが glob になる前に保存したルールにはまだ残っていることがあり、マージのときはそのパターンを外して数えます。 - パターンが無いときは、コミットのステータス全部を数え、1つは無いといけません。設定の画面にも
If no contexts are matched, the last commit must be successful regardless of context.とあります。
skipped と warning
skippedは合格です。Forgejo Actions は飛ばしたジョブを Forgejo 16 からskipped、それより前はsuccessとして報告します。Gitea には 1.25 からこの状態があります。Forgejo には例外が1つあり、パターンが無く、コミットのステータスが全部 skipped だと通りません。Gitea は通します。warningは、Forgejo でも Gitea 1.26 以降でも通りません(Gitea は失敗として数えます)。Gitea 1.25 は warning を通していました。
Actions がチェックに付ける名前
Forgejo Actions と Gitea Actions は、ジョブごとに ワークフロー / ジョブ (イベント) の名前で報告します。ワークフローの名前、ジョブの名前、実行を始めたイベントで、たとえば ci / test (pull_request) です。ワークフローに name: が無いと、Gitea はファイル名(ci.yml など)を使います。ここから3つのことが起きます。
- 同じジョブでも、push で始まったものとプルリクで始まったものは別のチェックです(
ci / test (push)とci / test (pull_request))。イベントまで書いたパターンは片方にしか合いません。どちらでもよければ末尾を(*)にします。 - ワークフローかジョブの名前を変えると、チェックの名前も変わります。古いパターンはどれにも合わなくなり、マージは来ないチェックを待ち続けます。
- プルリクで動かないワークフロー(
on:にpull_requestが無い、pathsの絞り込みで外れる)は何も報告しないので、そのパターンは不足のままです。
Gitea 1.27 以降には、持ち主かインスタンスの管理者が多くのリポジトリにまとめて掛ける必須のワークフローがあります。そのチェックの名前は 元: ワークフロー / ジョブ (イベント)(元はワークフローのあるリポジトリ)で、保護のルールがあるブランチなら、そのルールのステータスチェックがオフでもマージを止めます。ブランチの API の status_check_contexts には出ません。
直し方
- 不足(missing):プルリクのチェックの一覧の名前と、ルールのパターン(リポジトリの設定の Branches)を見比べます。ルールの画面には、この1週間に報告したチェックが並び、パターンに合うものに Matched と付きます。パターンを直すか、ワークフローをプルリクでも動くようにします。
- 不合格(not successful):チェックの横の Details を開き、ジョブを直して push するか、もう一度実行します。
- pending のまま:チェックの横に
Waiting to runかBlocked by required conditionsと出ている Actions のジョブは、まだ始まっていません。Details から実行を開き、何を待っているかを見ます。 - Forgejo で warning:報告した仕組みが success を報告するまで、マージは待ちます。
サーバーが読んでいるものを自分で読むには:
curl -H "Authorization: token your-token" https://codeberg.org/api/v1/repos/OWNER/REPO/commits/HEAD-SHA/status curl -H "Authorization: token your-token" https://codeberg.org/api/v1/repos/OWNER/REPO/branches/main
1つ目は名前ごとの最新のステータス(statuses、それぞれに context と status)、2つ目はブランチに効いているルール(enable_status_check と status_check_contexts)です。codeberg.org はお使いのサーバーに置き換えてください。設定そのものは Forgejo の文書と Gitea の文書にあります(英語)。
IntelliJ IDEA で Forgejo・Gitea のプルリクを見るなら
Lesstep の Pull Request Inbox for Forgejo and Gitea は、JetBrains IDE(2024.1 以降)のプラグインです。対象のブランチのルール(enable_status_check と status_check_contexts)と先頭のコミットのステータスから、必須のチェックをマージの条件の1つとして見せ、ステータスを1つずつそのページへのリンクつきで並べます。必須のチェックはサーバーと同じに読みます。skipped は合格・warning は不合格、パターンは glob として({a,b}・[abc]・[!a-z])、パターンが無くステータスが全部 skipped のときは Forgejo か Gitea かに合わせます。最後に決めるのはサーバーです。1.0.22 より前は、skipped のチェックを合格に数えず、パターンは * と ? しか読みませんでした。Gitea 1.27 の必須のワークフローは API に出ないので、見えません。読むのは無料、承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
このページは Forgejo プロジェクト・Codeberg e.V.・Gitea プロジェクト・JetBrains のいずれとも提携しておらず、推奨・承認も受けていません。Forgejo・Gitea・Codeberg はそれぞれの持ち主の名前、IntelliJ IDEA は JetBrains s.r.o. の商標です。
ほかに:Forgejo・Gitea のマージの断り(405・409) · Forgejo・Gitea のチェックが合格したらマージの断り(405・409・500) · Forgejo・Gitea のレビューの断り(422) · Forgejo・Gitea のブランチの更新の断り(403・409・422) · Forgejo・Gitea の 404:無いのか・非公開か・名前が変わったか · 401「token is required」と知らないトークン · 「token does not have at least one of required scope(s)」 · Forgejo・Gitea のプルリクが作れない(409・422・403) · Forgejo・Gitea のコメントの断り(403・422・400) · Forgejo・Gitea の検索の断り(400・422) · Forgejo・Gitea のプルリクの変更ファイル(50件ずつ・changed_files) · JetBrains の IDE で Forgejo・Gitea のプルリクを扱う · English