From 25a9a2e020c1780573ccdd5e840a168fde8d8135 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 10 Aug 2026 09:35:51 -0700 Subject: [PATCH] fix(ci): guard empty QA-live filter token join in release checks An all-QA live_suite_filter leaves repo_filter_tokens empty; joining the empty array under set -u aborts the scheduling script on bash <4.4. Default the expansion and update the workflow-content assertion. --- .github/workflows/openclaw-release-checks.yml | 2 +- test/scripts/package-acceptance-workflow.test.ts | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/openclaw-release-checks.yml b/.github/workflows/openclaw-release-checks.yml index baa577ccad5e..a5480bd21e93 100644 --- a/.github/workflows/openclaw-release-checks.yml +++ b/.github/workflows/openclaw-release-checks.yml @@ -507,7 +507,7 @@ jobs: done if [[ "$qa_filter_seen" == "true" ]]; then - repo_live_suite_filter="$(IFS=,; printf '%s' "${repo_filter_tokens[*]}")" + repo_live_suite_filter="$(IFS=,; printf '%s' "${repo_filter_tokens[*]:-}")" fi if [[ "${#disabled_required_lanes[@]}" -gt 0 ]]; then diff --git a/test/scripts/package-acceptance-workflow.test.ts b/test/scripts/package-acceptance-workflow.test.ts index 714cfeaf0b4a..511161ee0bce 100644 --- a/test/scripts/package-acceptance-workflow.test.ts +++ b/test/scripts/package-acceptance-workflow.test.ts @@ -2700,8 +2700,8 @@ describe("package artifact reuse", () => { ), ) .map(([jobId]) => jobId) - .sort(); - expect(typedHarnessJobIds).toEqual(harnessJobCases.map(({ jobId }) => jobId).sort()); + .toSorted(); + expect(typedHarnessJobIds).toEqual(harnessJobCases.map(({ jobId }) => jobId).toSorted()); for (const { jobId, planStepName, setupIf } of harnessJobCases) { const harnessJob = workflowJob(LIVE_E2E_WORKFLOW, jobId); @@ -3871,7 +3871,7 @@ describe("package artifact reuse", () => { expect(workflow).toContain("repo_live_suite_filter:"); expect(workflow).toContain('repo_filter_tokens+=("$token")'); expect(workflow).toContain( - 'repo_live_suite_filter="$(IFS=,; printf \'%s\' "${repo_filter_tokens[*]}")"', + 'repo_live_suite_filter="$(IFS=,; printf \'%s\' "${repo_filter_tokens[*]:-}")"', ); expect(workflow).toContain("cross_os_suite_filter:"); expect(workflow).toContain("advisory: false"); @@ -6249,7 +6249,6 @@ wait_for_run plugin-clawhub-new.yml 123 "${expectedSha}" || status=$? const crossOs = readWorkflow(CROSS_OS_RELEASE_CHECKS_REUSABLE_WORKFLOW); const packageAcceptance = readWorkflow(PACKAGE_ACCEPTANCE_WORKFLOW); const qaLive = readWorkflow(QA_LIVE_TRANSPORTS_WORKFLOW); - const performance = readWorkflow(PERFORMANCE_WORKFLOW); const profiles = ["beta", "stable", "full"] as const; const ciPreflight = workflowJob(CI_WORKFLOW, "preflight"); @@ -6364,8 +6363,7 @@ wait_for_run plugin-clawhub-new.yml 123 "${expectedSha}" || status=$? ]), ); expect(releasePackageTimeouts).toEqual({ beta: 280, stable: 280, full: 310 }); - for (const profile of profiles) { - const childTimeout = releasePackageTimeouts[profile]; + for (const [profile, childTimeout] of Object.entries(releasePackageTimeouts)) { expect(childTimeout, `release-package:${profile}`).toBeLessThanOrEqual(420); expect(420 - childTimeout, `release-package:${profile}`).toBeGreaterThanOrEqual(60); }