You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2026/09/15 06:06:53 UTC

(opendal) branch main updated: fix(release): enable automatic resolution and deduplicate failure notices (#8303)

This is an automated email from the ASF dual-hosted git repository.

Xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 585f2223d2 fix(release): enable automatic resolution and deduplicate failure notices (#8303)
585f2223d2 is described below

commit 585f2223d20c0d5cdcf54bc55187ffccf8cf185c
Author: Xuanwo <gi...@xuanwo.io>
AuthorDate: Tue Sep 15 14:06:47 2026 +0800

    fix(release): enable automatic resolution and deduplicate failure notices (#8303)
---
 .agents/skills/opendal-release/SKILL.md           |  7 ++-
 .agents/skills/opendal-release/references/vote.md | 31 +++++++++---
 .github/workflows/release_publish.yml             |  2 +-
 scripts/release_lifecycle.py                      | 36 +++++++++++---
 website/community/release/release.md              |  5 +-
 website/community/release/weekly.md               | 60 +++++++++++++++++++----
 6 files changed, 112 insertions(+), 29 deletions(-)

diff --git a/.agents/skills/opendal-release/SKILL.md b/.agents/skills/opendal-release/SKILL.md
index 8ac9a13dcb..d665a3c014 100644
--- a/.agents/skills/opendal-release/SKILL.md
+++ b/.agents/skills/opendal-release/SKILL.md
@@ -18,7 +18,7 @@ The primary repository runbook is `website/community/release/release.md`. The sp
 - Do not claim any step succeeded until the external system confirms it.
 - Treat an RC as bound to its tag, target commit, and signed source artifacts. Manual RC tags are signed; weekly preparation creates a lightweight tag and compose signs the artifacts. Do not create a new RC merely because `main` advances after tagging.
 - Do not assume bindings or integrations share the top-level OpenDAL version. Each released binding or integration can have its own version.
-- Do not start a public vote with broken links, open Maven staging, missing source artifacts at the selected staging location, or incomplete required workflows.
+- ATR is the authority for ATR candidates. Other builds and language package staging are optional and do not block starting the vote. Use the manual SVN checklist only for candidates outside ATR.
 - Do not conflate Nexus `Close` before voting with Nexus `Release` after the vote passes.
 - Do not over-block on unrelated/noncritical CI if the release gate is explicitly narrowed.
 - Do not put SVN, Nexus, or mail credentials in commands, files, issue text, PRs, or release notes. Read them from environment variables or an interactive prompt and avoid shell history when possible.
@@ -64,7 +64,10 @@ Use these states explicitly when reporting status:
 
 Weekly preparation replaces the manual bump-PR path and can compose sources while downstream builds run. A candidate Discussion confirms upload and dispatch, not readiness to vote.
 For new `releases/<version>-rc.N` branches, hourly ATR synchronization maintains
-that Discussion. Resolving a vote as passed starts final publication, announcement,
+that Discussion through status comments. Start future ATR votes with automatic
+resolution and publication enabled, and verify both settings in the returned
+task. ATR attempts resolution at the scheduled vote end; unresolved votes need
+manual follow-up. Resolving a vote as passed starts final publication, announcement,
 version-sync PR creation and same-version RC branch cleanup. Do not duplicate
 those operations manually. Older weekly branches stay on the manual path.
 
diff --git a/.agents/skills/opendal-release/references/vote.md b/.agents/skills/opendal-release/references/vote.md
index 274ad2e684..ccedaca15f 100644
--- a/.agents/skills/opendal-release/references/vote.md
+++ b/.agents/skills/opendal-release/references/vote.md
@@ -2,7 +2,10 @@
 
 Repository paths and shell commands are relative to the repository root.
 
-## Pre-Vote Readiness Checklist
+For ATR candidates, follow **ATR voting for new weekly candidates** below.
+The following checklist applies to the manual SVN path.
+
+## Manual SVN Pre-Vote Readiness Checklist
 
 Run this checklist immediately before creating the vote discussion:
 
@@ -31,13 +34,25 @@ SVN directory in the vote text. The template below applies to SVN-staged votes.
 
 ## ATR voting for new weekly candidates
 
-Use the commands and exact revision in `Release candidate: <RC>`. Start voting
-with `--auto-publish` after verification and RM authorization. Inspect the tally
-before resolving. A `passed` resolution initiates the automatic final publication
-path, including public announcements. `failed` and `cancelled` do not publish.
-Hourly synchronization updates the candidate Discussion and posts one reminder
-per vote round; do not manually create a duplicate GitHub vote or result thread.
-See `website/community/release/weekly.md` for CLI usage and recovery.
+Use the official ATR Python client command in
+`website/community/release/weekly.md` with the candidate's exact revision and RM
+authorization. Enable both `automatic_resolve_when_finished` and
+`automatic_publish_when_resolved`, plus `notify_when_finished`. Read back the
+returned task arguments to confirm the two automation flags are true; the
+dedicated CLI's `--auto-publish` option alone is insufficient. Do not replace the
+Python command with `atr api post`: that generic CLI sends strings, which the
+boolean fields reject. Other builds and
+language staging are optional and do not block starting an ATR vote.
+
+ATR attempts automatic resolution at the scheduled end. If the vote does not
+pass then, inspect ATR and handle the unresolved vote manually; do not promise
+another automatic attempt when later ballots arrive. A `passed` resolution
+initiates publication, including public announcements. `failed` and `cancelled`
+do not publish. Never restart an active vote to change automation flags.
+
+Hourly GitHub synchronization posts status comments and one reminder per vote
+round; it does not resolve votes. Do not create duplicate GitHub vote or result
+threads. See the weekly runbook for CLI usage and manual recovery.
 
 ## Start Vote Discussion (manual SVN path)
 
diff --git a/.github/workflows/release_publish.yml b/.github/workflows/release_publish.yml
index bdfedbbe57..3f84ccdf9c 100644
--- a/.github/workflows/release_publish.yml
+++ b/.github/workflows/release_publish.yml
@@ -82,4 +82,4 @@ jobs:
           RC: ${{ inputs.rc }}
         run: >-
           python3 scripts/release_lifecycle.py notify --rc "$RC"
-          --status "Publication needs attention. Inspect https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID and rerun the failed jobs before resuming."
+          --status "Publication needs attention. Inspect the latest failed run in the publication links below and rerun the failed jobs before resuming."
diff --git a/scripts/release_lifecycle.py b/scripts/release_lifecycle.py
index 1de912f23d..4ae14f0058 100644
--- a/scripts/release_lifecycle.py
+++ b/scripts/release_lifecycle.py
@@ -286,14 +286,14 @@ vote page for current progress; this opening post contains candidate instruction
 - [ATR checks]({ATR}/checks/opendal/{rc}) · [Download candidate]({ATR}/download/path/opendal/{rc}) · [Vote]({ATR}/vote/opendal/{rc})
 - [Candidate branch](https://github.com/{REPO}/tree/{branch}) · [RC tag](https://github.com/{REPO}/releases/tag/v{rc})
 - Candidate commit: `{candidate.sha}`; ATR revision: `{revision}`.
-- [RC builds](https://github.com/{REPO}/actions?query=branch%3Av{rc}) · [Publication runs](https://github.com/{REPO}/actions/workflows/release_publish.yml)
+- [RC builds](https://github.com/{REPO}/actions?query=branch%3Av{rc}) · [Scheduled publication](https://github.com/{REPO}/actions/workflows/release_lifecycle.yml) · [Manual publication](https://github.com/{REPO}/actions/workflows/release_publish.yml)
 
 {version_notes(candidate)}
 ### Release manager: next actions
 
 1. Review the candidate in ATR. Other builds and language package staging are optional and do not block starting the ATR vote.
 2. Review the source artifacts and announcement draft below.
-3. Start the vote on the verified revision. After the voting period, inspect the tally and resolve according to the result.
+3. Start the vote on the selected revision with automatic resolution and publication enabled. ATR checks the tally at the scheduled end; inspect ATR if the vote remains unresolved.
 
 ### CLI for release managers and agents
 
@@ -307,16 +307,40 @@ atr vote tabulate opendal {rc}
 After verification, start the vote (do not repeat this if voting is already open):
 
 ```bash
-atr vote start opendal {rc} {revision} -m dev@opendal.apache.org --auto-publish
+uv run --python 3.13 --with "apache-trusted-releases @ git+https://github.com/apache/tooling-releases-client" python - <<'PYTHON'
+from atrclient import api
+from atrclient.models.api import VoteStartArgs
+
+task = api.vote_start(VoteStartArgs(
+    project="opendal",
+    version="{rc}",
+    revision="{revision}",
+    email_to="dev@opendal.apache.org",
+    automatic_resolve_when_finished=True,
+    automatic_publish_when_resolved=True,
+    notify_when_finished=True,
+)).task
+print(task.model_dump_json(indent=2))
+assert task.task_args["automatic_resolve_when_finished"] is True
+assert task.task_args["automatic_publish_when_resolved"] is True
+PYTHON
 ```
 
-After reviewing the vote result, resolve with `passed`, `failed`, or `cancelled`:
+This uses the official ATR client and the same credentials as `atr`. It checks
+that the returned task enables both automatic resolution and publication. If a
+check fails, inspect that task in ATR; do not repeat the start command. The CLI's
+`--auto-publish` option alone does not enable automatic resolution.
+
+ATR attempts automatic resolution at the scheduled vote end and publishes the
+source archives if the vote passes. Insufficient votes leave the vote open for
+manual follow-up; do not assume later ballots automatically trigger another
+attempt. If manual resolution is needed, review the tally first:
 
 ```bash
 atr vote resolve opendal {rc} passed
 ```
 
-These commands change the release state; agents need the RM's authorization for voting actions. `--auto-publish` lets ATR publish the approved source archives after a passing vote. The hourly GitHub workflow then creates the final branch and tag, publishes packages, and finishes announcements and cleanup.
+These commands change the release state; agents need the RM's authorization for voting actions. The hourly GitHub workflow follows ATR's resolved result to create the final branch and tag, publish packages, and finish announcements and cleanup. It does not tally or resolve votes.
 
 <details><summary>CLI installation and first-time authentication</summary>
 
@@ -347,7 +371,7 @@ Download and verify the candidate. During voting, ASF committers can vote on ATR
         progress = f"""**{status}**
 
 - ATR revision: `{revision}`; [current ATR status]({ATR}/vote/opendal/{rc}).
-- [Source branch](https://github.com/{REPO}/tree/{branch}) · [Publication runs](https://github.com/{REPO}/actions/workflows/release_publish.yml).
+- [Source branch](https://github.com/{REPO}/tree/{branch}) · [Scheduled publication](https://github.com/{REPO}/actions/workflows/release_lifecycle.yml) · [Manual publication](https://github.com/{REPO}/actions/workflows/release_publish.yml).
 """
         digest = hashlib.sha256(progress.encode()).hexdigest()
         comment_once(
diff --git a/website/community/release/release.md b/website/community/release/release.md
index a9e972d4b9..30b5be0856 100644
--- a/website/community/release/release.md
+++ b/website/community/release/release.md
@@ -10,8 +10,9 @@ See [Reproducible source archives](./reproducible-source.md) for rebuilding and
 comparing the source packages before signing.
 
 For candidates prepared on `releases/<version>-rc.N`, follow the
-[weekly release lifecycle](weekly.md): verify and resolve the vote in ATR, then
-monitor automatic publication and review the version-sync PR. The manual steps
+[weekly release lifecycle](weekly.md): start the vote with ATR automatic resolution
+and publication enabled, then monitor publication and review the version-sync PR.
+The manual steps
 below apply to candidates outside that lifecycle, including older weekly branches.
 
 ## Introduction
diff --git a/website/community/release/weekly.md b/website/community/release/weekly.md
index 3e92b728c7..93fed2cb7f 100644
--- a/website/community/release/weekly.md
+++ b/website/community/release/weekly.md
@@ -12,8 +12,9 @@ from the selected branch commit at the time of dispatch.
 Preparation creates no version PR and requires no manual merge.
 
 The release manager then follows the [release procedure](release.md) to verify
-the candidate, start and resolve the vote. Hourly synchronization then finishes
-publication and opens the version-sync PR.
+the candidate and start the vote with automatic resolution and publication
+enabled in ATR. Hourly synchronization then finishes publication and opens the
+version-sync PR after ATR records a passing result.
 
 ## Preparation
 
@@ -141,13 +142,49 @@ revision into these commands:
 
 ```bash
 atr check status opendal 0.59.3-rc.1 00001
-atr vote start opendal 0.59.3-rc.1 00001 -m dev@opendal.apache.org --auto-publish
+uv run --python 3.13 --with "apache-trusted-releases @ git+https://github.com/apache/tooling-releases-client" python - <<'PYTHON'
+from atrclient import api
+from atrclient.models.api import VoteStartArgs
+
+task = api.vote_start(VoteStartArgs(
+    project="opendal",
+    version="0.59.3-rc.1",
+    revision="00001",
+    email_to="dev@opendal.apache.org",
+    automatic_resolve_when_finished=True,
+    automatic_publish_when_resolved=True,
+    notify_when_finished=True,
+)).task
+print(task.model_dump_json(indent=2))
+assert task.task_args["automatic_resolve_when_finished"] is True
+assert task.task_args["automatic_publish_when_resolved"] is True
+PYTHON
+```
+
+This runs the official ATR Python client with the same authentication configuration
+as `atr`, and checks both automation flags in the returned task. The dedicated
+`atr vote start --auto-publish` command only enables publication, not resolution;
+the generic `atr api post` command sends strings instead of the required booleans.
+If a flag check fails, inspect the task in ATR; do not repeat the start command.
+To read the task again, use `atr api get /task/get/TASK_ID`, replacing `TASK_ID`
+with the returned task ID. Do not repeat the start command on an active vote.
+
+At the scheduled vote end, ATR checks its Trusted Vote ballots and automatically
+resolves a passing vote, then publishes the approved source files. If the vote
+does not pass at that check, ATR leaves it unresolved for manual follow-up. Later
+ballots do not guarantee another automatic attempt. End notifications are enabled
+so the release manager can follow up. GitHub and email discussion replies do not
+count as ATR Trusted Vote ballots; follow ATR's instructions to cast a ballot.
+
+For manual recovery, inspect the tally and resolve according to the result:
+
+```bash
 atr vote tabulate opendal 0.59.3-rc.1
 atr vote resolve opendal 0.59.3-rc.1 passed
 ```
 
-Read the tally and resolve with `passed`, `failed` or `cancelled` according to the
-formal result. Agents use the same CLI after the RM authorizes the voting action;
+Use ATR's browser controls to cancel a vote or inspect the tally if the CLI is
+unavailable. Agents use the same CLI after the RM authorizes the voting action;
 credentials belong in the CLI's hidden prompt. The CLI is an interactive RM tool;
 CI reads ATR's JSON API and uses its trusted-publisher announcement endpoint.
 
@@ -155,7 +192,10 @@ CI reads ATR's JSON API and uses its trusted-publisher announcement endpoint.
 It keeps the candidate Discussion's opening post unchanged and appends status
 changes as comments, including one reminder per ATR vote round. Unchanged status
 does not generate another comment. Follow the latest replies and ATR for current
-progress. GitHub subscribers receive comments through their notification
+progress. Failure notices link to the workflow run lists so hourly retries do not
+change the notice solely because the run ID changed. Scheduled publication runs
+appear under `release_lifecycle.yml`; manual runs appear under `release_publish.yml`.
+GitHub subscribers receive comments through their notification
 settings. The official vote remains in ATR and the dev mailing-list thread; the
 Discussion does not create another ballot. To synchronize sooner:
 
@@ -163,10 +203,10 @@ Discussion does not create another ballot. To synchronize sooner:
 gh workflow run release_lifecycle.yml --repo apache/opendal --ref main
 ```
 
-Synchronization never starts or resolves a vote. A failed or cancelled vote cannot
-trigger publication. `--auto-publish` lets ATR publish the approved source files
-when the vote passes. If omitted, the RM must publish the approved files in ATR
-before the final announcement can succeed.
+GitHub synchronization never starts or resolves a vote; ATR owns those actions.
+A failed or cancelled vote cannot trigger publication. Existing votes retain
+their original settings: changing the command for future candidates does not
+enable automatic resolution on a vote that has already started.
 
 ## Recovering an existing candidate