mirror of
https://github.com/webstudio-is/webstudio.git
synced 2026-11-03 10:37:48 +09:00
Unpublish finishes in the request, but it returned a job ID that `get-publish-job` could never find. It now returns the domains it unpublished. A missing publish job also stays a normal not-found error instead of suggesting a CLI update. Closes #6578 ## Changes - Keep filename-based E2E shard discovery. Rebalance the files across ten shards using measured CI times; each shard keeps its own test environment and the same 12-minute safety timeout. - Remove the fabricated unpublish job ID. `get-publish-job` remains for publish jobs. - Remove publish-only flags from the unpublish CLI and clarify CLI/MCP guidance. - Keep legacy optional server inputs for compatibility. The API input contract does not change; clients that read the old `jobId` result need to use `unpublishedDomains` instead. - No database migration. Existing domain-removal behavior is unchanged, including retention of other published domains. ## Checklist - [x] Reproduced both reported failures with tests before the fix. - [x] Reviewed the change for compatibility, redundant code, and retained-domain behavior. - [x] Updated the authoritative MCP docs and regenerated the CLI/MCP docs. - [x] Ran focused Builder, CLI, domain, and build tests; workspace typecheck, lint, package-boundary, generated API, and generated-doc checks. - [x] Restore filename-based shard discovery and rebalance the files across ten shards. - [x] Verify every Chromium workflow test runs in exactly one shard and update the E2E contributor docs. All 141 tests are assigned once across the ten shards. - [x] Verify parallel-safe long E2E files and the two-submission legacy form test in CI. - [x] Let independent slow E2E files run their tests concurrently; all ten shard jobs passed. - [ ] Confirm all E2E jobs finish in under five minutes. Eight did; shard 1 took 5:10 and shard 4 took 6:32. Move the long Content-mode page and shared-project bridge files to separate shards, then remeasure. - [x] Required CI checks pass. No live unpublish was run because it would change a published site. Agent evaluations were not run; they require separate approval.
226 lines
6.2 KiB
YAML
226 lines
6.2 KiB
YAML
name: Main workflow
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
pull_request:
|
|
workflow_call:
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.number || github.sha }}
|
|
cancel-in-progress: true
|
|
|
|
permissions:
|
|
contents: read # to fetch code (actions/checkout)
|
|
|
|
jobs:
|
|
ssg-artifact:
|
|
name: Packaged SSG Assets build
|
|
timeout-minutes: 7
|
|
runs-on: ubuntu-24.04-arm
|
|
environment:
|
|
name: development
|
|
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
allow-unsafe-pr-checkout: ${{ github.event_name == 'pull_request_target' && github.event.action == 'labeled' && github.event.label.name == 'safe-to-deploy' }}
|
|
|
|
- uses: ./.github/actions/submodules-checkout
|
|
with:
|
|
submodules-ssh-key: ${{ secrets.PRIVATE_GITHUB_DEPLOY_TOKEN }}
|
|
|
|
- uses: ./.github/actions/ci-setup
|
|
|
|
- name: Build packaged SSG fixture
|
|
run: pnpm --filter webstudio test:ssg-package
|
|
|
|
tests:
|
|
name: tests (${{ matrix.environment }}, ${{ matrix.suite.name }})
|
|
timeout-minutes: ${{ (matrix.suite.name == 'builder-app' || matrix.suite.name == 'packages') && 12 || 7 }}
|
|
runs-on: ubuntu-24.04
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
environment:
|
|
- empty
|
|
- development
|
|
suite:
|
|
- name: packages
|
|
script: test:packages
|
|
browsers: chromium-firefox
|
|
- name: cli
|
|
script: test:cli
|
|
browsers: none
|
|
- name: builder-core
|
|
script: test:builder:core
|
|
browsers: chromium
|
|
- name: builder-app
|
|
script: test:builder:app
|
|
browsers: chromium
|
|
environment:
|
|
name: ${{ matrix.environment }}
|
|
env:
|
|
DATABASE_URL: postgres://
|
|
AUTH_SECRET: test
|
|
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
allow-unsafe-pr-checkout: ${{ github.event_name == 'pull_request_target' && github.event.action == 'labeled' && github.event.label.name == 'safe-to-deploy' }}
|
|
|
|
- uses: ./.github/actions/test-suite
|
|
with:
|
|
submodules-ssh-key: ${{ secrets.PRIVATE_GITHUB_DEPLOY_TOKEN }}
|
|
script: ${{ matrix.suite.script }}
|
|
browsers: ${{ matrix.suite.browsers }}
|
|
|
|
checks:
|
|
timeout-minutes: 7
|
|
|
|
environment:
|
|
name: empty
|
|
|
|
env:
|
|
DATABASE_URL: postgres://
|
|
AUTH_SECRET: test
|
|
|
|
runs-on: ubuntu-24.04-arm
|
|
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
allow-unsafe-pr-checkout: ${{ github.event_name == 'pull_request_target' && github.event.action == 'labeled' && github.event.label.name == 'safe-to-deploy' }}
|
|
|
|
- uses: pnpm/action-setup@v6
|
|
|
|
- uses: actions/setup-node@v5
|
|
with:
|
|
node-version: 22
|
|
cache: pnpm
|
|
|
|
- name: Pnpm install
|
|
run: |
|
|
pnpm install
|
|
|
|
- run: |
|
|
pnpm oxfmt --check
|
|
|
|
- name: Lint
|
|
run: |
|
|
pnpm lint
|
|
|
|
- name: Package boundaries
|
|
run: |
|
|
pnpm check:package-boundaries
|
|
|
|
- name: Generated API contracts
|
|
run: |
|
|
pnpm check:generated-api
|
|
|
|
- name: Generated CLI docs
|
|
run: |
|
|
pnpm check:generated-docs
|
|
|
|
- name: Typecheck
|
|
run: |
|
|
pnpm -r typecheck
|
|
|
|
check-size:
|
|
timeout-minutes: 7
|
|
|
|
runs-on: ubuntu-24.04-arm
|
|
|
|
environment:
|
|
name: development
|
|
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
allow-unsafe-pr-checkout: ${{ github.event_name == 'pull_request_target' && github.event.action == 'labeled' && github.event.label.name == 'safe-to-deploy' }}
|
|
|
|
- uses: ./.github/actions/submodules-checkout
|
|
with:
|
|
submodules-ssh-key: ${{ secrets.PRIVATE_GITHUB_DEPLOY_TOKEN }}
|
|
|
|
- uses: ./.github/actions/ci-setup
|
|
|
|
- run: pnpm --filter "{./fixtures/*}..." build
|
|
|
|
- run: pnpm check:fixture-sizes
|
|
|
|
builder-e2e-build:
|
|
name: builder-e2e build
|
|
timeout-minutes: 7
|
|
|
|
runs-on: ubuntu-24.04
|
|
|
|
environment:
|
|
name: development
|
|
|
|
outputs:
|
|
shards: ${{ steps.build.outputs.shards }}
|
|
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
allow-unsafe-pr-checkout: ${{ github.event_name == 'pull_request_target' && github.event.action == 'labeled' && github.event.label.name == 'safe-to-deploy' }}
|
|
|
|
- id: build
|
|
uses: ./.github/actions/builder-e2e-build
|
|
with:
|
|
submodules-ssh-key: ${{ secrets.PRIVATE_GITHUB_DEPLOY_TOKEN }}
|
|
|
|
supabase-migrations:
|
|
name: Supabase migrations
|
|
timeout-minutes: 7
|
|
runs-on: ubuntu-24.04
|
|
environment:
|
|
name: empty
|
|
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
allow-unsafe-pr-checkout: ${{ github.event_name == 'pull_request_target' && github.event.action == 'labeled' && github.event.label.name == 'safe-to-deploy' }}
|
|
|
|
- uses: ./.github/actions/ci-setup
|
|
with:
|
|
run-scripts: "true"
|
|
|
|
- name: Apply migrations to Supabase PostgreSQL
|
|
run: pnpm --filter @webstudio-is/builder e2e:supabase-migrations
|
|
|
|
builder-e2e:
|
|
name: builder-e2e (${{ matrix.shard }})
|
|
timeout-minutes: 12
|
|
|
|
needs: builder-e2e-build
|
|
|
|
runs-on: ubuntu-24.04
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include: ${{ fromJSON(needs.builder-e2e-build.outputs.shards) }}
|
|
|
|
environment:
|
|
name: development
|
|
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
allow-unsafe-pr-checkout: ${{ github.event_name == 'pull_request_target' && github.event.action == 'labeled' && github.event.label.name == 'safe-to-deploy' }}
|
|
|
|
- uses: ./.github/actions/builder-e2e-shard
|
|
with:
|
|
submodules-ssh-key: ${{ secrets.PRIVATE_GITHUB_DEPLOY_TOKEN }}
|
|
shard: ${{ matrix.shard }}
|
|
partition: ${{ matrix.partition }}
|