From fa8a85586c007d6741843e872e2a63cd25be2b29 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 7 May 2026 22:03:09 +0100 Subject: [PATCH] ci(release): create GitHub release during publish --- .../workflows/openclaw-release-publish.yml | 53 ++++++++++++++++++- docs/reference/RELEASING.md | 10 ++-- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/.github/workflows/openclaw-release-publish.yml b/.github/workflows/openclaw-release-publish.yml index c07663de168..4c5b68cd475 100644 --- a/.github/workflows/openclaw-release-publish.yml +++ b/.github/workflows/openclaw-release-publish.yml @@ -45,7 +45,7 @@ on: permissions: actions: write - contents: read + contents: write concurrency: group: openclaw-release-publish-${{ inputs.tag }} @@ -263,6 +263,53 @@ jobs: wait_run_pid="$!" } + create_or_update_github_release() { + local release_version notes_version title notes_file changelog_file latest_arg prerelease_args + release_version="${RELEASE_TAG#v}" + notes_version="${release_version}" + if [[ "${notes_version}" =~ ^([0-9]{4}\.[1-9][0-9]*\.[1-9][0-9]*)-(alpha|beta)\.[1-9][0-9]*$ ]]; then + notes_version="${BASH_REMATCH[1]}" + fi + title="openclaw ${release_version}" + changelog_file="${RUNNER_TEMP}/CHANGELOG.md" + notes_file="${RUNNER_TEMP}/release-notes.md" + + gh api --repo "$GITHUB_REPOSITORY" "repos/${GITHUB_REPOSITORY}/contents/CHANGELOG.md?ref=${TARGET_SHA}" \ + --jq '.content' | base64 --decode > "${changelog_file}" + awk -v version="${notes_version}" ' + $0 == "## " version { in_section = 1; next } + /^## / && in_section { exit } + in_section { print } + ' "${changelog_file}" > "${notes_file}" + if [[ ! -s "${notes_file}" ]]; then + echo "CHANGELOG.md does not contain release notes for ${notes_version}." >&2 + exit 1 + fi + + prerelease_args=() + latest_arg="--latest=false" + if [[ "${RELEASE_TAG}" == *"-alpha."* || "${RELEASE_TAG}" == *"-beta."* ]]; then + prerelease_args=(--prerelease) + elif [[ "${RELEASE_NPM_DIST_TAG}" == "latest" ]]; then + latest_arg="--latest" + fi + + if gh release view "${RELEASE_TAG}" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then + gh release edit "${RELEASE_TAG}" --repo "$GITHUB_REPOSITORY" \ + --title "${title}" \ + --notes-file "${notes_file}" \ + "${prerelease_args[@]}" + else + gh release create "${RELEASE_TAG}" --repo "$GITHUB_REPOSITORY" \ + --verify-tag \ + --title "${title}" \ + --notes-file "${notes_file}" \ + "${prerelease_args[@]}" \ + "${latest_arg}" + fi + echo "- GitHub release: https://github.com/${GITHUB_REPOSITORY}/releases/tag/${RELEASE_TAG}" >> "$GITHUB_STEP_SUMMARY" + } + { echo "### Publish sequence" echo @@ -345,3 +392,7 @@ jobs: if [[ "${failed}" != "0" ]]; then exit 1 fi + + if [[ -n "${openclaw_npm_run_id}" ]]; then + create_or_update_github_release + fi diff --git a/docs/reference/RELEASING.md b/docs/reference/RELEASING.md index 01d64523ff0..bc8b9325de4 100644 --- a/docs/reference/RELEASING.md +++ b/docs/reference/RELEASING.md @@ -81,6 +81,11 @@ the maintainer-only release runbook. dispatches all publishable plugin packages to npm and the same set to ClawHub in parallel, and then promotes the prepared OpenClaw npm preflight artifact with the matching dist-tag as soon as plugin npm publish succeeds. + After the OpenClaw npm publish child succeeds, it creates or updates the + matching GitHub release/prerelease page from the complete matching + `CHANGELOG.md` section. Stable releases published to npm `latest` become the + GitHub latest release; stable maintenance releases kept on npm `beta` are + created with GitHub `latest=false`. ClawHub publishing may still be running while OpenClaw npm publishes, but the release publish workflow prints the child run IDs immediately. By default it does not wait for ClawHub after dispatching it, so OpenClaw npm availability @@ -102,9 +107,8 @@ the maintainer-only release runbook. packaged `.zip`, `.dmg`, `.dSYM.zip`, and updated `appcast.xml` on `main`. 11. After publish, run the npm post-publish verifier, optional standalone published-npm Telegram E2E when you need post-publish channel proof, - dist-tag promotion when needed, GitHub release/prerelease notes from the - complete matching `CHANGELOG.md` section, and the release announcement - steps. + dist-tag promotion when needed, verify the generated GitHub release page, + and run the release announcement steps. ## Release preflight