main-cd: two runs of one core+Plugins pair overwrite each other's tags — set 3.0.0-ci.9985 armed a 9984 portal, satellites decline every Plugins bundle
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 25/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 領域
- ci-cd, devops, infrastructure
調査の方向性
Start with .github/workflows/main-cd.yml, focusing on the promote and arm phases, then read .github/scripts/resolve-platform.py and the linked issue #6177 for the proposed run-specific identity change. The issue also identifies node-repo-publish-bake.yml as a publication gate. Done means concurrent runs cannot mix portal and tester images, contradictory sets cannot be armed or published, and main/latest cannot move backwards; the issue notes an operator decision remains for the already-mispointed 9985 tag.
索引モデルが issue の本文から書いたものです。
説明
Summary
Two main-cd runs that build the same core + Plugins pair both promote it, and the shared identity tags they write (memex-portal-ai:<core7>-p<plugins7>, <core7>, main, latest) end up on whichever run promotes LAST. When the older run promotes last, a set's tester (resolved by its unique version tag) and its portal (resolved through the shared pair tag) come from two different builds. arm then copies the pair tag onto the set's version tag, so memex-portal-ai:<version> names an image that reports a different version. Every satellite consuming the set declines the Plugins bundles on the platform floor.
Reported from MeshWeaver.Manufacturing#84 (comment https://github.com/Systemorph/MeshWeaver.Manufacturing/issues/84#issuecomment-6004721186). The correction below is that the cause is a race between two runs, not a re-promote that reuses an old build under a new number.
Evidence (measured 2026-10-05/06 against ACR and the run logs)
run 9984 (schedule, reconcile lane) |
run 9985 (workflow_dispatch rebuild, ref lane) |
|
|---|---|---|
| target | core d205295, Plugins 29bfaef |
core d205295, Plugins 29bfaef (tip b0f38f7 had no completed check) |
| portal built | staging-d205295-37297619921 = sha256:0823d97… reports 3.0.0-ci.9984 |
staging-d205295-37302108498 = sha256:53aa780… reports 3.0.0-ci.9985 (its own identity check passed) |
| tester built | sha256:9ed0081e… (3.0.0-ci.9984) |
sha256:7ae811d7… (3.0.0-ci.9985) |
| promote (phase A+B) | 11:48:39 → 11:51:21: d205295, d205295-p29bfaef, main, latest → its own images |
11:45:43 → 11:48:10: same tags → its own images |
| Plugins bake | tester 9ed0081e + portal 0823d97, floor 9984 | tester 7ae811 + portal 53aa780, floor 9985 (consistent) |
- 9984 had been pending in the reconcile slot behind 9983. It started at 11:19:46, 49 s after 9985 started (11:18:57). The two ran fully in parallel; the concurrency comment in
main-cd.ymlalready admits this overlap ("arebuilddispatch can still overlap a scheduled reconcile"). - Run 9989's
armarmed 3.0.0-ci.9985 viaSRC_PORTAL_TAG=d205295-p29bfaef. Todaymemex-portal-ai:3.0.0-ci.9985=sha256:0823d97…, and that image's config readsMESHWEAVER_PLATFORM_VERSION=3.0.0-ci.9984. - MeshWeaver.Manufacturing run 37309606772 resolved set 9985 as tester
7ae811(by its version tag) + portal0823d97("images resolved by tagd205295-p29bfaef"). The bake-seed then declined 134 of 149 Plugins types:platform floor 3.0.0-ci.9985 … is NEWER than the running platform 3.0.0-ci.9984. Run 37309505481 failed the same way. The same Manufacturing commit had been green on set 9983. - This is not a one-off. Set 9989's pair tag
b0f38f7-p26e14canames 9988's portal (reports 9988), and set 9993'scd953cb-p59a1ceanames 9991's (reports 9991). Set 9995 is consistent. memex(control instanceOps/Status/memex, sampled 2026-10-05 22:58Z) runsmemex-portal-ai:3.0.0-ci.9985, i.e. the 9984 image, with two ReplicaSets andconverged: false. Both portals'/api/versionread commitd205295.
Root cause
main-cd.ymlpromotephase A:promote memex-portal-ai "$SHA" "$SHA-p$PLUGINS_SHORT"writes a tag that names a PAIR, not a run. Phase B movesmain/latestwith no never-backwards check, although phase D has one.main-cd.ymlarm:SRC_PORTAL_TAG=$SHA_SEL-p$PLUGINS_SEL. The comment above it ("tags that name THIS set and nothing else") is false once two runs share a pair. Phase C then writes the version tag with no check of what the image reports..github/scripts/resolve-platform.pyresolve_images: an unarmed set's portal is resolved throughpair_tag. The tester comes from its unique version tag. So the two halves of one set come from two runs.
Fix
- Identity by run, not by pair: #6177 (open, another session) moves
armand the resolver to the per-run staging tagstaging-<core7>-<run id>and retires the pair tag. That removes the race at its root. - Gates, so a contradicting set can never be armed or sealed again (PR to follow): (1)
armasserts on every architecture that the image it is about to arm reports the version it is armed as. (2)node-repo-publish-bake.ymlrefuses to publish when any bundle stamps a floor above the portal the publication names. (3) promote phase B never movesmain/latestbackwards. - Owed after both land (an operator decision, not done here): the armed tag
memex-portal-ai:3.0.0-ci.9985still names the 9984 image. Even with the staging-tag resolver, a consumer that reads the version tag first resolves set 9985 to the wrong portal. Re-pointing it atsha256:53aa780…, or letting a newer armed set supersede it, is what makes set 9985 consistent.
Not established
- Whether
memex'sconverged: falseand its pods restarting through the evening are caused by the self-updater seeing a reported 9984 under an armed 9985 tag. I did not read the self-updater's log. - Whether any satellite other than Manufacturing consumed 9985 inconsistently. Reinsurance, SocialMedia and Crm were green on the same 12:27 dispatch. Education's red has a different cause (install gate, not the floor).
- New sets have been stuck since ~14:00Z for an unrelated reason: every portal build fails on
jobs.plugins-modules.with.modules is absent or empty(#6155). No consistent set newer than 9995 can appear until that is fixed.
- 主要言語
- C#
- スター
- 12
- フォーク
- 5
- 平均マージ
- 5時間 10分
- マージ済み PR(30日)
- 981
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
Systemorph/MeshWeaver のほかの issue
-
bug sev:M
難易度 4/5 3〜5日 初心者へのやさしさ 18/100
Systemorph/MeshWeaver#7902 ·
メンテナーはふだん 1 日以内に返信
-
Error in Pollyオープンbug sev:L
難易度 5/5 1週間以上 初心者へのやさしさ 15/100
Systemorph/MeshWeaver#7901 ·
メンテナーはふだん 1 日以内に返信
-
Error in FleetWatchオープンbug sev:H
難易度 5/5 1週間以上 初心者へのやさしさ 15/100
Systemorph/MeshWeaver#7896 · コメント 9 件 ·
メンテナーはふだん 1 日以内に返信
-
bug sev:L
難易度 4/5 3〜5日 初心者へのやさしさ 20/100
Systemorph/MeshWeaver#7893 · コメント 9 件 ·
メンテナーはふだん 1 日以内に返信
-
PodHubNotHereException in PodHubGrain.Deliver対応中かも @rbuergi が 1 日前に担当しました。 オープンbug sev:L
難易度 4/5 3〜5日 初心者へのやさしさ 20/100
Systemorph/MeshWeaver#7888 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
Systemorph/MeshWeaver の issue をすべて見る
似ている issue
-
難易度 1/5 1時間未満 初心者へのやさしさ 80/100
Unity-Technologies/unity-agent-plugin#118 ·
メンテナーはふだん 1 日以内に返信
-
The Recommended preset turns on Import Uno DSP, which only works with the Material theme対応中かも @agneszitte が今日担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
unoplatform/uno.templates#2388 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
eyalgolan/statecraft-israel#2732 ·
メンテナーはふだん 1 日以内に返信
-
要トリアージ
難易度 2/5 1〜3時間 初心者へのやさしさ 64/100
メンテナーはふだん 1 日以内に返信
-
kind/chore status/draft
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
Altinn/altinn-events#1158 ·
メンテナーはふだん 1 日以内に返信