From 4c68bfdb6ca879f2aae92ebd3a35e2242bf4e2f0 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 3 May 2026 22:44:50 -0700 Subject: [PATCH] ci(release): filter QA live lanes --- .github/workflows/full-release-validation.yml | 2 +- .github/workflows/openclaw-release-checks.yml | 66 +++++++++++++++++-- CHANGELOG.md | 1 + 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/.github/workflows/full-release-validation.yml b/.github/workflows/full-release-validation.yml index 3f91e8e25f2..bbf39f3d773 100644 --- a/.github/workflows/full-release-validation.yml +++ b/.github/workflows/full-release-validation.yml @@ -54,7 +54,7 @@ on: - qa-live - npm-telegram live_suite_filter: - description: Optional exact live suite id for focused live/E2E reruns; blank runs all selected live suites + description: Optional exact live/E2E suite id, or comma-separated QA live lanes such as qa-live-matrix,qa-live-telegram; blank runs all selected live suites required: false default: "" type: string diff --git a/.github/workflows/openclaw-release-checks.yml b/.github/workflows/openclaw-release-checks.yml index 375123e11df..95c2a3f2757 100644 --- a/.github/workflows/openclaw-release-checks.yml +++ b/.github/workflows/openclaw-release-checks.yml @@ -54,7 +54,7 @@ on: - qa-parity - qa-live live_suite_filter: - description: Optional exact live suite id for focused live/E2E reruns; blank runs all selected live suites + description: Optional exact live/E2E suite id, or comma-separated QA live lanes such as qa-live-matrix,qa-live-telegram; blank runs all selected live suites required: false default: "" type: string @@ -88,6 +88,9 @@ jobs: release_profile: ${{ steps.inputs.outputs.release_profile }} rerun_group: ${{ steps.inputs.outputs.rerun_group }} live_suite_filter: ${{ steps.inputs.outputs.live_suite_filter }} + qa_live_matrix_enabled: ${{ steps.inputs.outputs.qa_live_matrix_enabled }} + qa_live_telegram_enabled: ${{ steps.inputs.outputs.qa_live_telegram_enabled }} + qa_live_slack_enabled: ${{ steps.inputs.outputs.qa_live_slack_enabled }} package_acceptance_package_spec: ${{ steps.inputs.outputs.package_acceptance_package_spec }} steps: - name: Require main or release workflow ref for release checks @@ -208,6 +211,57 @@ jobs: RELEASE_PACKAGE_ACCEPTANCE_PACKAGE_SPEC_INPUT: ${{ inputs.package_acceptance_package_spec }} run: | set -euo pipefail + qa_live_matrix_enabled=true + qa_live_telegram_enabled=true + qa_live_slack_enabled=true + + filter="$(printf '%s' "$RELEASE_LIVE_SUITE_FILTER_INPUT" | tr '[:upper:]' '[:lower:]')" + if [[ -n "${filter// }" ]]; then + qa_filter_seen=false + matrix_selected=false + telegram_selected=false + slack_selected=false + + IFS=', ' read -r -a filter_tokens <<< "$filter" + for token in "${filter_tokens[@]}"; do + token="${token//$'\t'/}" + token="${token//$'\r'/}" + token="${token//$'\n'/}" + [[ -z "$token" ]] && continue + case "$token" in + qa-live|qa-live-all|qa-all) + qa_filter_seen=true + matrix_selected=true + telegram_selected=true + slack_selected=true + ;; + qa-live-non-slack|qa-non-slack|non-slack|no-slack|without-slack) + qa_filter_seen=true + matrix_selected=true + telegram_selected=true + ;; + qa-live-matrix|qa-matrix|matrix) + qa_filter_seen=true + matrix_selected=true + ;; + qa-live-telegram|qa-telegram|telegram) + qa_filter_seen=true + telegram_selected=true + ;; + qa-live-slack|qa-slack|slack) + qa_filter_seen=true + slack_selected=true + ;; + esac + done + + if [[ "$qa_filter_seen" == "true" ]]; then + qa_live_matrix_enabled="$matrix_selected" + qa_live_telegram_enabled="$telegram_selected" + qa_live_slack_enabled="$slack_selected" + fi + fi + { printf 'ref=%s\n' "$RELEASE_REF_INPUT" printf 'provider=%s\n' "$RELEASE_PROVIDER_INPUT" @@ -215,6 +269,9 @@ jobs: printf 'release_profile=%s\n' "$RELEASE_PROFILE_INPUT" printf 'rerun_group=%s\n' "$RELEASE_RERUN_GROUP_INPUT" printf 'live_suite_filter=%s\n' "$RELEASE_LIVE_SUITE_FILTER_INPUT" + printf 'qa_live_matrix_enabled=%s\n' "$qa_live_matrix_enabled" + printf 'qa_live_telegram_enabled=%s\n' "$qa_live_telegram_enabled" + printf 'qa_live_slack_enabled=%s\n' "$qa_live_slack_enabled" printf 'package_acceptance_package_spec=%s\n' "$RELEASE_PACKAGE_ACCEPTANCE_PACKAGE_SPEC_INPUT" } >> "$GITHUB_OUTPUT" @@ -243,6 +300,7 @@ jobs: if [[ -n "${RELEASE_LIVE_SUITE_FILTER// }" ]]; then echo "- Live suite filter: \`${RELEASE_LIVE_SUITE_FILTER}\`" fi + echo "- QA live lanes: Matrix \`${{ steps.inputs.outputs.qa_live_matrix_enabled }}\`, Telegram \`${{ steps.inputs.outputs.qa_live_telegram_enabled }}\`, Slack \`${{ steps.inputs.outputs.qa_live_slack_enabled }}\`" if [[ -n "${PACKAGE_ACCEPTANCE_PACKAGE_SPEC// }" ]]; then echo "- Package Acceptance package spec: \`${PACKAGE_ACCEPTANCE_PACKAGE_SPEC}\`" else @@ -655,7 +713,7 @@ jobs: qa_live_matrix_release_checks: name: Run QA Lab live Matrix lane needs: [resolve_target] - if: contains(fromJSON('["all","qa","qa-live"]'), needs.resolve_target.outputs.rerun_group) + if: contains(fromJSON('["all","qa","qa-live"]'), needs.resolve_target.outputs.rerun_group) && needs.resolve_target.outputs.qa_live_matrix_enabled == 'true' runs-on: blacksmith-8vcpu-ubuntu-2404 timeout-minutes: 60 permissions: @@ -732,7 +790,7 @@ jobs: qa_live_telegram_release_checks: name: Run QA Lab live Telegram lane needs: [resolve_target] - if: contains(fromJSON('["all","qa","qa-live"]'), needs.resolve_target.outputs.rerun_group) + if: contains(fromJSON('["all","qa","qa-live"]'), needs.resolve_target.outputs.rerun_group) && needs.resolve_target.outputs.qa_live_telegram_enabled == 'true' runs-on: blacksmith-8vcpu-ubuntu-2404 timeout-minutes: 60 permissions: @@ -825,7 +883,7 @@ jobs: qa_live_slack_release_checks: name: Run QA Lab live Slack lane needs: [resolve_target] - if: contains(fromJSON('["all","qa","qa-live"]'), needs.resolve_target.outputs.rerun_group) + if: contains(fromJSON('["all","qa","qa-live"]'), needs.resolve_target.outputs.rerun_group) && needs.resolve_target.outputs.qa_live_slack_enabled == 'true' runs-on: blacksmith-8vcpu-ubuntu-2404 timeout-minutes: 60 permissions: diff --git a/CHANGELOG.md b/CHANGELOG.md index 26e3ea6c88e..8bf5bdfcee0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ Docs: https://docs.openclaw.ai - Google Meet: log the resolved audio provider model when starting Chrome and paired-node Meet talk-back bridges, so agent-mode joins show the STT model and bidi joins show the realtime voice model. - Diagnostics: handle missing session-tail files in cron recovery context without tripping extension test typecheck. Thanks @vincentkoc. - QA/Slack: update the Slack dispatch preview fallback test SDK mock for structured progress draft helpers, so the rich progress draft regression suite covers the new imports instead of failing before assertions run. Thanks @vincentkoc. +- Release validation: allow focused QA live reruns to select Matrix and Telegram without running Slack, so known Slack credential-pool outages do not block non-Slack live proof. Thanks @vincentkoc. - Plugins/loader: keep bundled plugin package `test-api.js` aliases behind private QA mode, so source transforms do not expose test-only public surfaces during normal plugin loading. Thanks @vincentkoc. - Gateway/startup: start cron and record the post-ready memory trace even when deferred maintenance timers fail after readiness, so a non-fatal timer setup issue does not silently leave scheduled jobs idle. Thanks @vincentkoc. - Exec approvals: unwrap BSD/macOS `env -P ` carrier commands before approval-command and strict inline-eval checks, so `/approve` shell execution and inline interpreter payloads are still blocked behind that env form.