























@@ -14,6 +14,10 @@ on:
1414description: Optional comma-separated Telegram scenario ids
1515required: false
1616type: string
17+discord_scenario:
18+description: Optional comma-separated Discord scenario ids
19+required: false
20+type: string
17211822permissions:
1923contents: read
@@ -346,3 +350,95 @@ jobs:
346350path: ${{ steps.run_lane.outputs.output_dir }}
347351retention-days: 14
348352if-no-files-found: warn
353+354+run_live_discord:
355+name: Run Discord live QA lane with Convex leases
356+needs: [authorize_actor, validate_selected_ref]
357+runs-on: blacksmith-32vcpu-ubuntu-2404
358+timeout-minutes: 60
359+environment: qa-live-shared
360+steps:
361+ - name: Checkout selected ref
362+uses: actions/checkout@v6
363+with:
364+ref: ${{ needs.validate_selected_ref.outputs.selected_sha }}
365+fetch-depth: 1
366+367+ - name: Setup Node environment
368+uses: ./.github/actions/setup-node-env
369+with:
370+node-version: ${{ env.NODE_VERSION }}
371+pnpm-version: ${{ env.PNPM_VERSION }}
372+install-bun: "true"
373+374+ - name: Validate required QA credential env
375+env:
376+OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
377+OPENCLAW_QA_CONVEX_SITE_URL: ${{ secrets.OPENCLAW_QA_CONVEX_SITE_URL }}
378+OPENCLAW_QA_CONVEX_SECRET_CI: ${{ secrets.OPENCLAW_QA_CONVEX_SECRET_CI }}
379+shell: bash
380+run: |
381+ set -euo pipefail
382+383+ require_var() {
384+ local key="$1"
385+ if [[ -z "${!key:-}" ]]; then
386+ echo "Missing required ${key}." >&2
387+ exit 1
388+ fi
389+ }
390+391+ require_var OPENAI_API_KEY
392+ require_var OPENCLAW_QA_CONVEX_SITE_URL
393+ require_var OPENCLAW_QA_CONVEX_SECRET_CI
394+395+ - name: Build private QA runtime
396+run: pnpm build
397+398+ - name: Run Discord live lane
399+id: run_lane
400+shell: bash
401+env:
402+OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
403+OPENCLAW_QA_CONVEX_SITE_URL: ${{ secrets.OPENCLAW_QA_CONVEX_SITE_URL }}
404+OPENCLAW_QA_CONVEX_SECRET_CI: ${{ secrets.OPENCLAW_QA_CONVEX_SECRET_CI }}
405+OPENCLAW_QA_REDACT_PUBLIC_METADATA: "1"
406+OPENCLAW_QA_DISCORD_CAPTURE_CONTENT: "1"
407+INPUT_SCENARIO: ${{ github.event_name == 'workflow_dispatch' && inputs.discord_scenario || '' }}
408+run: |
409+ set -euo pipefail
410+411+ output_dir=".artifacts/qa-e2e/discord-live-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
412+ scenario_args=()
413+414+ if [[ -n "${INPUT_SCENARIO// }" ]]; then
415+ IFS=',' read -r -a raw_scenarios <<<"${INPUT_SCENARIO}"
416+ for raw in "${raw_scenarios[@]}"; do
417+ scenario="$(printf '%s' "${raw}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
418+ if [[ -n "${scenario}" ]]; then
419+ scenario_args+=(--scenario "${scenario}")
420+ fi
421+ done
422+ fi
423+424+ echo "output_dir=${output_dir}" >> "$GITHUB_OUTPUT"
425+426+ pnpm openclaw qa discord \
427+ --repo-root . \
428+ --output-dir "${output_dir}" \
429+ --provider-mode live-frontier \
430+ --model openai/gpt-5.4 \
431+ --alt-model openai/gpt-5.4 \
432+ --fast \
433+ --credential-source convex \
434+ --credential-role ci \
435+ "${scenario_args[@]}"
436+437+ - name: Upload Discord QA artifacts
438+if: always()
439+uses: actions/upload-artifact@v4
440+with:
441+name: qa-live-discord-${{ github.run_id }}-${{ github.run_attempt }}
442+path: ${{ steps.run_lane.outputs.output_dir }}
443+retention-days: 14
444+if-no-files-found: warn
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。