Repository navigation
Full Public Smokes #3259
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Full Public Smokes | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| timeout_seconds: | |
| description: "Per-smoke timeout in seconds" | |
| required: false | |
| default: "360" | |
| type: string | |
| schedule: | |
| # Daily off-hours sweep. The workflow is intentionally not a PR-required check. | |
| - cron: "37 18 * * *" | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: full-public-smokes-${{ github.ref }} | |
| cancel-in-progress: true | |
| env: | |
| LOOPX_USAGE_PING: "0" | |
| jobs: | |
| chat-bundle: | |
| if: github.repository == 'loopx-project/loopx' | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: "3.11" | |
| - uses: actions/setup-node@v6 | |
| with: | |
| node-version: "24" | |
| cache: npm | |
| cache-dependency-path: apps/presentation/dashboard/package-lock.json | |
| - run: python scripts/chat_bundle.py build --install | |
| - run: python scripts/chat_bundle.py verify --source | |
| - uses: actions/upload-artifact@v7 | |
| with: | |
| name: full-public-chat-${{ github.sha }} | |
| path: loopx/web/chat/ | |
| if-no-files-found: error | |
| retention-days: 1 | |
| full-public-smokes: | |
| needs: chat-bundle | |
| if: github.repository == 'loopx-project/loopx' | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 120 | |
| strategy: | |
| fail-fast: false | |
| # Background sweeps leave runner capacity for required PR qualification. | |
| max-parallel: 2 | |
| matrix: | |
| include: | |
| - shard: 0 | |
| offset: 0 | |
| - shard: 1 | |
| offset: 110 | |
| - shard: 2 | |
| offset: 220 | |
| - shard: 3 | |
| offset: 330 | |
| - shard: 4 | |
| offset: 440 | |
| env: | |
| SHARD_LIMIT: "110" | |
| SMOKE_TIMEOUT_SECONDS: ${{ github.event_name == 'workflow_dispatch' && inputs.timeout_seconds || '360' }} | |
| SMOKE_JOBS: "4" | |
| steps: | |
| - name: Check out repository | |
| uses: actions/checkout@v7 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: "3.11" | |
| - name: Set up Node.js | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: "24" | |
| cache: npm | |
| cache-dependency-path: | | |
| package-lock.json | |
| apps/presentation/dashboard/package-lock.json | |
| - name: Install the shell used by launch-agent contract checks | |
| run: sudo apt-get update && sudo apt-get install -y zsh | |
| - name: Install smoke runtime dependencies | |
| run: python -m pip install --disable-pip-version-check "jsonschema>=4.23,<5" | |
| - name: Install locked TypeScript parser for semantic production checks | |
| run: npm ci --ignore-scripts | |
| # The shared bundle contains build output, not each runner's test dependencies. | |
| - name: Install locked Dashboard smoke dependencies | |
| run: npm --prefix apps/presentation/dashboard ci --ignore-scripts | |
| - name: Download the exact-source frontend built once for this run | |
| uses: actions/download-artifact@v7 | |
| with: | |
| name: full-public-chat-${{ github.sha }} | |
| path: loopx/web/chat/ | |
| - name: Reject missing, stale or corrupt frontend artifacts | |
| run: python scripts/chat_bundle.py verify --source | |
| - name: Preview full-public shard | |
| run: | | |
| python3 examples/run-smokes.py \ | |
| --suite full-public \ | |
| --offset "${{ matrix.offset }}" \ | |
| --limit "${SHARD_LIMIT}" \ | |
| --timeout-seconds "${SMOKE_TIMEOUT_SECONDS}" \ | |
| --jobs "${SMOKE_JOBS}" \ | |
| --no-execute | |
| - name: Run full-public shard | |
| run: | | |
| set -euo pipefail | |
| mkdir -p "$RUNNER_TEMP/loopx-smoke-results" | |
| python3 examples/run-smokes.py \ | |
| --suite full-public \ | |
| --offset "${{ matrix.offset }}" \ | |
| --limit "${SHARD_LIMIT}" \ | |
| --timeout-seconds "${SMOKE_TIMEOUT_SECONDS}" \ | |
| --jobs "${SMOKE_JOBS}" \ | |
| --json \ | |
| | tee "$RUNNER_TEMP/loopx-smoke-results/full-public-shard-${{ matrix.shard }}.json" | |
| - name: Upload smoke result | |
| if: always() | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: full-public-smokes-shard-${{ matrix.shard }} | |
| path: ${{ runner.temp }}/loopx-smoke-results/full-public-shard-${{ matrix.shard }}.json | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| smoke-fleet-health: | |
| if: always() | |
| needs: full-public-smokes | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Check out repository | |
| uses: actions/checkout@v7 | |
| - name: Set up Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: "3.11" | |
| - name: Download full-public receipts | |
| continue-on-error: true | |
| uses: actions/download-artifact@v7 | |
| with: | |
| pattern: full-public-smokes-shard-* | |
| path: smoke-results | |
| merge-multiple: true | |
| - name: Build compact smoke fleet health | |
| run: | | |
| mkdir -p smoke-health | |
| python -m loopx.cli --format json canary smoke-health \ | |
| --receipt smoke-results \ | |
| > smoke-health/smoke-fleet-health.json | |
| jq -e '.ready == true' smoke-health/smoke-fleet-health.json | |
| - name: Upload smoke fleet health | |
| if: always() | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: smoke-fleet-health | |
| path: smoke-health/smoke-fleet-health.json | |
| if-no-files-found: ignore | |
| retention-days: 7 |