




















@@ -32,6 +32,8 @@ concurrency:
32323333env:
3434FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
35+NODE_VERSION: "24.x"
36+PNPM_VERSION: "10.33.0"
35373638jobs:
3739resolve_target:
@@ -121,7 +123,7 @@ jobs:
121123 echo "- Validated SHA: \`${RELEASE_SHA}\`"
122124 echo "- Cross-OS provider: \`${RELEASE_PROVIDER}\`"
123125 echo "- Cross-OS mode: \`${RELEASE_MODE}\`"
124- echo "- This run will execute cross-OS release validation plus the non-Parallels Docker/live/openwebui coverage from the CI migration plan."
126+ echo "- This run will execute cross-OS release validation, QA Lab parity/live lanes, and the non-Parallels Docker/live/openwebui coverage from the CI migration plan."
125127 } >> "$GITHUB_STEP_SUMMARY"
126128127129 cross_os_release_checks:
@@ -197,3 +199,161 @@ jobs:
197199OPENCLAW_CLAUDE_SETTINGS_JSON: ${{ secrets.OPENCLAW_CLAUDE_SETTINGS_JSON }}
198200OPENCLAW_CLAUDE_SETTINGS_LOCAL_JSON: ${{ secrets.OPENCLAW_CLAUDE_SETTINGS_LOCAL_JSON }}
199201OPENCLAW_GEMINI_SETTINGS_JSON: ${{ secrets.OPENCLAW_GEMINI_SETTINGS_JSON }}
202+203+qa_lab_parity_release_checks:
204+name: Run QA Lab parity gate
205+needs: [resolve_target]
206+runs-on: blacksmith-32vcpu-ubuntu-2404
207+timeout-minutes: 30
208+permissions:
209+contents: read
210+env:
211+QA_PARITY_CONCURRENCY: "1"
212+OPENCLAW_QA_TRANSPORT_READY_TIMEOUT_MS: "180000"
213+OPENAI_API_KEY: ""
214+ANTHROPIC_API_KEY: ""
215+OPENCLAW_LIVE_OPENAI_KEY: ""
216+OPENCLAW_LIVE_ANTHROPIC_KEY: ""
217+OPENCLAW_LIVE_GEMINI_KEY: ""
218+OPENCLAW_LIVE_SETUP_TOKEN_VALUE: ""
219+OPENCLAW_BUILD_PRIVATE_QA: "1"
220+OPENCLAW_ENABLE_PRIVATE_QA_CLI: "1"
221+steps:
222+ - name: Checkout selected ref
223+uses: actions/checkout@v6
224+with:
225+ref: ${{ needs.resolve_target.outputs.ref }}
226+fetch-depth: 1
227+228+ - name: Setup Node environment
229+uses: ./.github/actions/setup-node-env
230+with:
231+node-version: ${{ env.NODE_VERSION }}
232+pnpm-version: ${{ env.PNPM_VERSION }}
233+install-bun: "true"
234+235+ - name: Build private QA runtime
236+run: pnpm build
237+238+ - name: Run GPT-5.4 lane
239+run: |
240+ pnpm openclaw qa suite \
241+ --provider-mode mock-openai \
242+ --parity-pack agentic \
243+ --concurrency "${QA_PARITY_CONCURRENCY}" \
244+ --model openai/gpt-5.4 \
245+ --alt-model openai/gpt-5.4-alt \
246+ --output-dir .artifacts/qa-e2e/gpt54
247+248+ - name: Run Opus 4.6 lane
249+run: |
250+ pnpm openclaw qa suite \
251+ --provider-mode mock-openai \
252+ --parity-pack agentic \
253+ --concurrency "${QA_PARITY_CONCURRENCY}" \
254+ --model anthropic/claude-opus-4-6 \
255+ --alt-model anthropic/claude-sonnet-4-6 \
256+ --output-dir .artifacts/qa-e2e/opus46
257+258+ - name: Generate parity report
259+run: |
260+ pnpm openclaw qa parity-report \
261+ --repo-root . \
262+ --candidate-summary .artifacts/qa-e2e/gpt54/qa-suite-summary.json \
263+ --baseline-summary .artifacts/qa-e2e/opus46/qa-suite-summary.json \
264+ --candidate-label openai/gpt-5.4 \
265+ --baseline-label anthropic/claude-opus-4-6 \
266+ --output-dir .artifacts/qa-e2e/parity
267+268+ - name: Upload parity artifacts
269+if: always()
270+uses: actions/upload-artifact@v4
271+with:
272+name: release-qa-parity-${{ needs.resolve_target.outputs.sha }}
273+path: .artifacts/qa-e2e/
274+retention-days: 14
275+if-no-files-found: warn
276+277+qa_live_telegram_release_checks:
278+name: Run QA Lab live Telegram lane
279+needs: [resolve_target]
280+runs-on: blacksmith-32vcpu-ubuntu-2404
281+timeout-minutes: 60
282+permissions:
283+contents: read
284+pull-requests: read
285+environment: qa-live-shared
286+env:
287+OPENCLAW_BUILD_PRIVATE_QA: "1"
288+OPENCLAW_ENABLE_PRIVATE_QA_CLI: "1"
289+steps:
290+ - name: Checkout selected ref
291+uses: actions/checkout@v6
292+with:
293+ref: ${{ needs.resolve_target.outputs.ref }}
294+fetch-depth: 1
295+296+ - name: Setup Node environment
297+uses: ./.github/actions/setup-node-env
298+with:
299+node-version: ${{ env.NODE_VERSION }}
300+pnpm-version: ${{ env.PNPM_VERSION }}
301+install-bun: "true"
302+303+ - name: Validate required QA credential env
304+env:
305+OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
306+OPENCLAW_QA_CONVEX_SITE_URL: ${{ secrets.OPENCLAW_QA_CONVEX_SITE_URL }}
307+OPENCLAW_QA_CONVEX_SECRET_CI: ${{ secrets.OPENCLAW_QA_CONVEX_SECRET_CI }}
308+shell: bash
309+run: |
310+ set -euo pipefail
311+312+ require_var() {
313+ local key="$1"
314+ if [[ -z "${!key:-}" ]]; then
315+ echo "Missing required ${key}." >&2
316+ exit 1
317+ fi
318+ }
319+320+ require_var OPENAI_API_KEY
321+ require_var OPENCLAW_QA_CONVEX_SITE_URL
322+ require_var OPENCLAW_QA_CONVEX_SECRET_CI
323+324+ - name: Build private QA runtime
325+run: pnpm build
326+327+ - name: Run Telegram live lane
328+id: run_lane
329+shell: bash
330+env:
331+OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
332+OPENCLAW_QA_CONVEX_SITE_URL: ${{ secrets.OPENCLAW_QA_CONVEX_SITE_URL }}
333+OPENCLAW_QA_CONVEX_SECRET_CI: ${{ secrets.OPENCLAW_QA_CONVEX_SECRET_CI }}
334+OPENCLAW_QA_REDACT_PUBLIC_METADATA: "1"
335+OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT: "1"
336+run: |
337+ set -euo pipefail
338+339+ output_dir=".artifacts/qa-e2e/telegram-live-release-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
340+ echo "output_dir=${output_dir}" >> "$GITHUB_OUTPUT"
341+342+ pnpm openclaw qa telegram \
343+ --repo-root . \
344+ --output-dir "${output_dir}" \
345+ --provider-mode live-frontier \
346+ --model openai/gpt-5.4 \
347+ --alt-model openai/gpt-5.4 \
348+ --fast \
349+ --credential-source convex \
350+ --credential-role ci
351+352+ - name: Upload Telegram QA artifacts
353+if: always()
354+uses: actions/upload-artifact@v4
355+with:
356+name: release-qa-live-telegram-${{ needs.resolve_target.outputs.sha }}
357+path: ${{ steps.run_lane.outputs.output_dir }}
358+retention-days: 14
359+if-no-files-found: warn
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。