feat: Autosave Collaboration - Lock editing for spectators #50704
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: 'CI: Pull Requests (Build, Test, Lint)' | |
| on: | |
| pull_request: | |
| merge_group: | |
| concurrency: | |
| group: ci-${{ github.event.pull_request.number || github.event.merge_group.head_sha || github.ref }} | |
| cancel-in-progress: true | |
| env: | |
| COVERAGE_ENABLED: 'true' # Set globally for all jobs - ensures Turbo cache consistency | |
| jobs: | |
| install-and-build: | |
| name: Install & Build | |
| runs-on: blacksmith-2vcpu-ubuntu-2204 | |
| env: | |
| NODE_OPTIONS: '--max-old-space-size=6144' | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| outputs: | |
| non_python_changed: ${{ steps.paths-filter.outputs.non-python == 'true' }} | |
| workflows_changed: ${{ steps.paths-filter.outputs.workflows == 'true' }} | |
| commit_sha: ${{ steps.commit-sha.outputs.sha }} | |
| steps: | |
| - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
| with: | |
| # Use merge_group SHA when in merge queue, otherwise PR merge ref | |
| ref: ${{ github.event_name == 'merge_group' && github.event.merge_group.head_sha || format('refs/pull/{0}/merge', github.event.pull_request.number) }} | |
| - name: Capture commit SHA for cache consistency | |
| id: commit-sha | |
| run: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" | |
| - name: Check for relevant changes | |
| uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 | |
| id: paths-filter | |
| with: | |
| filters: | | |
| non-python: | |
| - '**' | |
| - '!packages/@n8n/task-runner-python/**' | |
| workflows: | |
| - .github/** | |
| - name: Setup and Build | |
| if: steps.paths-filter.outputs.non-python == 'true' | |
| uses: ./.github/actions/setup-nodejs | |
| - name: Run format check | |
| if: steps.paths-filter.outputs.non-python == 'true' | |
| run: pnpm format:check | |
| unit-test: | |
| name: Unit tests | |
| if: needs.install-and-build.outputs.non_python_changed == 'true' | |
| uses: ./.github/workflows/test-unit-reusable.yml | |
| needs: install-and-build | |
| with: | |
| ref: ${{ needs.install-and-build.outputs.commit_sha }} | |
| collectCoverage: true | |
| secrets: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| typecheck: | |
| name: Typecheck | |
| if: needs.install-and-build.outputs.non_python_changed == 'true' | |
| runs-on: blacksmith-4vcpu-ubuntu-2204 | |
| needs: install-and-build | |
| steps: | |
| - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
| with: | |
| ref: ${{ needs.install-and-build.outputs.commit_sha }} | |
| - name: Setup Node.js | |
| uses: ./.github/actions/setup-nodejs | |
| with: | |
| build-command: pnpm typecheck | |
| lint: | |
| name: Lint | |
| if: needs.install-and-build.outputs.non_python_changed == 'true' | |
| uses: ./.github/workflows/test-linting-reusable.yml | |
| needs: install-and-build | |
| with: | |
| ref: ${{ needs.install-and-build.outputs.commit_sha }} | |
| e2e-tests: | |
| name: E2E Tests | |
| needs: install-and-build | |
| if: needs.install-and-build.outputs.non_python_changed == 'true' | |
| uses: ./.github/workflows/test-e2e-ci-reusable.yml | |
| with: | |
| branch: ${{ needs.install-and-build.outputs.commit_sha }} | |
| secrets: inherit | |
| security-checks: | |
| name: Security Checks | |
| needs: install-and-build | |
| if: needs.install-and-build.outputs.workflows_changed == 'true' | |
| uses: ./.github/workflows/sec-ci-reusable.yml | |
| with: | |
| ref: ${{ needs.install-and-build.outputs.commit_sha }} | |
| secrets: inherit | |
| # This job is required by GitHub branch protection rules. | |
| # PRs cannot be merged unless this job passes. | |
| # If you add/remove jobs that should block merging, update the 'needs' array | |
| # and the skip conditions in the 'if' block below. | |
| required-checks: | |
| name: Required Checks | |
| needs: [install-and-build, unit-test, typecheck, lint, e2e-tests, security-checks] | |
| if: always() | |
| runs-on: ubuntu-slim | |
| steps: | |
| - name: Fail if any required job failed or was skipped unexpectedly | |
| # Explicit checks for each job's skip conditions: | |
| # - Non-python jobs (unit-test, typecheck, lint, e2e-tests): can skip when non_python_changed == false | |
| # - security-checks: can skip when workflows_changed == false | |
| if: | | |
| contains(needs.*.result, 'failure') || | |
| (needs.install-and-build.outputs.non_python_changed == 'true' && ( | |
| needs.unit-test.result == 'skipped' || | |
| needs.typecheck.result == 'skipped' || | |
| needs.lint.result == 'skipped' || | |
| needs.e2e-tests.result == 'skipped' | |
| )) || | |
| (needs.install-and-build.outputs.workflows_changed == 'true' && | |
| needs.security-checks.result == 'skipped') | |
| run: exit 1 |