mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-03 03:03:24 -04:00
- Add testing-strategy.yml that calls existing ci.yml + adds macOS/smoke for stable - Add promote-branch.yml for develop alpha beta main promotion PRs - Add deployment-strategy.yml for npm (alpha/beta/latest) + Docker (GHCR) - Add release-orchestrator.yml to coordinate version changelog test deploy - Add version-operations.yml for YYYY.M.D versioning with prerelease suffixes - Add generate-changelog.yml for conventional commit parsing - Add release.yml manual trigger workflow - Add discord-notify composite action for notifications - Modify ci.yml to support workflow_call for reuse by testing-strategy
220 lines
7.2 KiB
YAML
220 lines
7.2 KiB
YAML
name: Testing Strategy
|
|
|
|
# Reusable testing workflow for staged releases
|
|
# Calls ci.yml for core tests, adds stage-specific extras
|
|
#
|
|
# Test coverage by stage:
|
|
# - develop/alpha/beta: Uses ci.yml (checks, secrets, windows)
|
|
# - stable: + macOS tests, install smoke
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
test_stage:
|
|
description: 'Testing stage: develop, alpha, beta, or stable'
|
|
required: true
|
|
type: string
|
|
app_version:
|
|
description: 'Version of the application being tested'
|
|
required: false
|
|
type: string
|
|
default: 'dev'
|
|
outputs:
|
|
test_status:
|
|
description: 'Overall test status'
|
|
value: ${{ jobs.test-summary.outputs.overall_status }}
|
|
secrets:
|
|
DISCORD_WEBHOOK_URL:
|
|
required: false
|
|
|
|
jobs:
|
|
# Run existing CI workflow (checks, secrets, windows)
|
|
ci:
|
|
name: Core CI
|
|
uses: ./.github/workflows/ci.yml
|
|
secrets: inherit
|
|
|
|
# macOS tests (stable only)
|
|
checks-macos:
|
|
name: macOS Checks
|
|
if: inputs.test_stage == 'stable'
|
|
runs-on: macos-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- task: test
|
|
command: pnpm test
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: false
|
|
|
|
- name: Checkout submodules (retry)
|
|
run: |
|
|
set -euo pipefail
|
|
git submodule sync --recursive
|
|
for attempt in 1 2 3 4 5; do
|
|
if git -c protocol.version=2 submodule update --init --force --depth=1 --recursive; then
|
|
exit 0
|
|
fi
|
|
echo "Submodule update failed (attempt $attempt/5). Retrying…"
|
|
sleep $((attempt * 10))
|
|
done
|
|
exit 1
|
|
|
|
- name: Setup Node.js
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 22.x
|
|
check-latest: true
|
|
|
|
- name: Setup pnpm (corepack retry)
|
|
run: |
|
|
set -euo pipefail
|
|
corepack enable
|
|
for attempt in 1 2 3; do
|
|
if corepack prepare pnpm@10.23.0 --activate; then
|
|
pnpm -v
|
|
exit 0
|
|
fi
|
|
echo "corepack prepare failed (attempt $attempt/3). Retrying..."
|
|
sleep $((attempt * 10))
|
|
done
|
|
exit 1
|
|
|
|
- name: Capture node path
|
|
run: echo "NODE_BIN=$(dirname \"$(node -p \"process.execPath\")\")" >> "$GITHUB_ENV"
|
|
|
|
- name: Install dependencies
|
|
env:
|
|
CI: true
|
|
run: |
|
|
export PATH="$NODE_BIN:$PATH"
|
|
pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true
|
|
|
|
- name: Run ${{ matrix.task }}
|
|
env:
|
|
NODE_OPTIONS: --max-old-space-size=4096
|
|
run: ${{ matrix.command }}
|
|
|
|
# Install smoke test (stable only)
|
|
install-smoke:
|
|
name: Install Smoke Test
|
|
if: inputs.test_stage == 'stable'
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup pnpm (corepack retry)
|
|
run: |
|
|
set -euo pipefail
|
|
corepack enable
|
|
for attempt in 1 2 3; do
|
|
if corepack prepare pnpm@10.23.0 --activate; then
|
|
pnpm -v
|
|
exit 0
|
|
fi
|
|
echo "corepack prepare failed (attempt $attempt/3). Retrying..."
|
|
sleep $((attempt * 10))
|
|
done
|
|
exit 1
|
|
|
|
- name: Install pnpm deps (minimal)
|
|
run: pnpm install --ignore-scripts --frozen-lockfile
|
|
|
|
- name: Run installer smoke tests
|
|
env:
|
|
CLAWDBOT_INSTALL_URL: https://openclaw.ai/install.sh
|
|
CLAWDBOT_INSTALL_CLI_URL: https://openclaw.ai/install-cli.sh
|
|
CLAWDBOT_NO_ONBOARD: "1"
|
|
CLAWDBOT_INSTALL_SMOKE_SKIP_CLI: "1"
|
|
CLAWDBOT_INSTALL_SMOKE_SKIP_NONROOT: "1"
|
|
CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS: "1"
|
|
run: pnpm test:install:smoke
|
|
|
|
# Test summary
|
|
test-summary:
|
|
name: Test Summary (${{ inputs.test_stage }})
|
|
runs-on: ubuntu-latest
|
|
needs: [ci, checks-macos, install-smoke]
|
|
if: always()
|
|
outputs:
|
|
overall_status: ${{ steps.summary.outputs.overall_status }}
|
|
steps:
|
|
- name: Generate summary
|
|
id: summary
|
|
run: |
|
|
echo "## 🧪 Test Results - ${{ inputs.test_stage }}" >> $GITHUB_STEP_SUMMARY
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
echo "| Test Suite | Result |" >> $GITHUB_STEP_SUMMARY
|
|
echo "|------------|--------|" >> $GITHUB_STEP_SUMMARY
|
|
echo "| CI (checks + secrets + windows) | ${{ needs.ci.result }} |" >> $GITHUB_STEP_SUMMARY
|
|
echo "| macOS Checks | ${{ needs.checks-macos.result || 'skipped' }} |" >> $GITHUB_STEP_SUMMARY
|
|
echo "| Install Smoke | ${{ needs.install-smoke.result || 'skipped' }} |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
# CI must pass
|
|
if [ "${{ needs.ci.result }}" != "success" ]; then
|
|
echo "overall_status=failed" >> $GITHUB_OUTPUT
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
echo "### ❌ Core CI failed" >> $GITHUB_STEP_SUMMARY
|
|
exit 0
|
|
fi
|
|
|
|
# Stage-specific checks (stable only has extras)
|
|
STAGE="${{ inputs.test_stage }}"
|
|
FAILED=false
|
|
|
|
if [ "$STAGE" = "stable" ]; then
|
|
if [ "${{ needs.checks-macos.result }}" = "failure" ]; then
|
|
FAILED=true
|
|
fi
|
|
if [ "${{ needs.install-smoke.result }}" = "failure" ]; then
|
|
FAILED=true
|
|
fi
|
|
fi
|
|
|
|
if [ "$FAILED" = "true" ]; then
|
|
echo "overall_status=failed" >> $GITHUB_OUTPUT
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
echo "### ❌ Some stage-specific tests failed" >> $GITHUB_STEP_SUMMARY
|
|
else
|
|
echo "overall_status=passed" >> $GITHUB_OUTPUT
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
echo "### ✅ All required tests passed!" >> $GITHUB_STEP_SUMMARY
|
|
fi
|
|
|
|
# Discord notifications
|
|
notify:
|
|
name: Discord Notification
|
|
needs: test-summary
|
|
if: always()
|
|
runs-on: ubuntu-latest
|
|
env:
|
|
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Discord success notification
|
|
if: ${{ env.DISCORD_WEBHOOK_URL != '' && needs.test-summary.outputs.overall_status == 'passed' }}
|
|
uses: ./.github/actions/discord-notify
|
|
with:
|
|
webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
|
title: '✅ Tests Passed: ${{ inputs.test_stage }} v${{ inputs.app_version }}'
|
|
description: 'All tests passed for ${{ inputs.test_stage }} stage!'
|
|
color: '3066993'
|
|
|
|
- name: Discord failure notification
|
|
if: ${{ env.DISCORD_WEBHOOK_URL != '' && needs.test-summary.outputs.overall_status != 'passed' }}
|
|
uses: ./.github/actions/discord-notify
|
|
with:
|
|
webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
|
title: '❌ Tests Failed: ${{ inputs.test_stage }} v${{ inputs.app_version }}'
|
|
description: |
|
|
Some tests failed for ${{ inputs.test_stage }} stage.
|
|
[View Logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
|
|
color: '15158332'
|