mirror of
https://github.com/n8n-io/n8n.git
synced 2026-08-28 17:22:01 +08:00
ci: Improve e2e test timings (#23159)
This commit is contained in:
@@ -1,33 +0,0 @@
|
||||
name: 'GitHub Node.js Build Setup for Github Hosted Runners'
|
||||
description: 'Configures Node.js with pnpm, installs dependencies, enables Turborepo caching, and builds the project or an optional command.'
|
||||
|
||||
inputs:
|
||||
node-version:
|
||||
description: 'Node.js version to use. Uses latest 22.x by default.'
|
||||
required: false
|
||||
default: '22.x'
|
||||
build-command:
|
||||
description: 'Command to execute for building the project or an optional command. Leave empty to skip build step.'
|
||||
required: false
|
||||
default: 'pnpm build'
|
||||
type: string
|
||||
|
||||
runs:
|
||||
using: 'composite'
|
||||
steps:
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version: ${{ inputs.node-version }}
|
||||
|
||||
- name: Setup pnpm and Install Dependencies
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
with:
|
||||
run_install: true
|
||||
|
||||
- name: Configure Turborepo Cache
|
||||
uses: rharkor/caching-for-turbo@2b4b5b14a8d16b8556a58993a8ac331d56d8906d # v2.3.2
|
||||
|
||||
- name: Build Project
|
||||
run: ${{ inputs.build-command }}
|
||||
shell: bash
|
||||
+16
-9
@@ -1,4 +1,8 @@
|
||||
name: 'Blacksmith Node.js Build Setup'
|
||||
# This action works transparently on both Blacksmith and GitHub-hosted runners.
|
||||
# Blacksmith runners benefit from transparent caching and optional Docker layer caching.
|
||||
# GitHub-hosted runners use standard GitHub Actions caching.
|
||||
|
||||
name: 'Node.js Build Setup'
|
||||
description: 'Configures Node.js with pnpm, installs dependencies, enables Turborepo caching, (optional) sets up Docker layer caching, and builds the project or an optional command.'
|
||||
|
||||
inputs:
|
||||
@@ -7,7 +11,7 @@ inputs:
|
||||
required: false
|
||||
default: '22.x'
|
||||
enable-docker-cache:
|
||||
description: 'Whether to set up Blacksmith Buildx for Docker layer caching.'
|
||||
description: 'Whether to set up Blacksmith Buildx for Docker layer caching (Blacksmith runners only).'
|
||||
required: false
|
||||
default: 'false'
|
||||
type: boolean
|
||||
@@ -20,22 +24,25 @@ inputs:
|
||||
runs:
|
||||
using: 'composite'
|
||||
steps:
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: useblacksmith/setup-node@65c6ca86fdeb0ab3d85e78f57e4f6a7e4780b391 # v5.0.4
|
||||
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
|
||||
with:
|
||||
node-version: ${{ inputs.node-version }}
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Setup pnpm and Install Dependencies
|
||||
uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0
|
||||
with:
|
||||
run_install: true
|
||||
- name: Install Dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
shell: bash
|
||||
|
||||
- name: Configure Turborepo Cache
|
||||
uses: useblacksmith/caching-for-turbo@bafb57e7ebdbf1185762286ec94d24648cd3938a # v1
|
||||
uses: rharkor/caching-for-turbo@cda201ff2b32699a2ae9f59704db029e3dde4fbd # v2.3.5
|
||||
|
||||
- name: Setup Docker Builder for Docker Cache
|
||||
if: ${{ inputs.enable-docker-cache == 'true' }}
|
||||
uses: useblacksmith/setup-docker-builder@0b434dfbb431f4e3a2bcee7a773a56bd363184c5 # v1
|
||||
uses: useblacksmith/setup-docker-builder@53647ab5afe8827af5623b35bd4302eabd41619f # v1.2.0
|
||||
|
||||
- name: Build Project
|
||||
run: ${{ inputs.build-command }}
|
||||
@@ -31,7 +31,7 @@ class BuildContext {
|
||||
case 'pull_request':
|
||||
context.version = `pr-${pr}`;
|
||||
context.release_type = 'dev';
|
||||
context.push_to_ghcr = false;
|
||||
context.platforms = ['linux/amd64'];
|
||||
break;
|
||||
|
||||
case 'workflow_dispatch':
|
||||
|
||||
@@ -34,7 +34,7 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Setup Node.js and Build
|
||||
uses: ./.github/actions/setup-nodejs-github
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: pnpm build
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: turbo build --filter=*nodes*
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: pnpm run build --filter=@n8n/utils --filter=@n8n/vitest-config --filter=@n8n/design-system
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ jobs:
|
||||
echo "LANGSMITH_DATASET_NAME=$DATASET" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Setup and Build
|
||||
uses: ./.github/actions/setup-nodejs-blacksmith
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@d9e0f98d3fc6adb07d1e3d37f3043649ddad06a1 # 6.5.0
|
||||
|
||||
@@ -55,7 +55,7 @@ jobs:
|
||||
ref: ${{ inputs.ref }}
|
||||
|
||||
- name: Setup and Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Run format check
|
||||
run: pnpm format:check
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Setup and Build
|
||||
uses: ./.github/actions/setup-nodejs-github
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
unit-test:
|
||||
name: Unit tests
|
||||
|
||||
@@ -19,7 +19,7 @@ on:
|
||||
|
||||
concurrency:
|
||||
group: db-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: false
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
NODE_OPTIONS: '--max-old-space-size=3072'
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Setup and Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
sqlite-pooled:
|
||||
name: SQLite Pooled
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Setup and Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Test SQLite Pooled
|
||||
working-directory: packages/cli
|
||||
@@ -70,7 +70,7 @@ jobs:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Setup and Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Start MariaDB
|
||||
uses: isbang/compose-action@802a148945af6399a338c7906c267331b39a71af # v2.0.0
|
||||
@@ -99,7 +99,7 @@ jobs:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Setup and Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Start MySQL
|
||||
uses: isbang/compose-action@802a148945af6399a338c7906c267331b39a71af # v2.0.0
|
||||
@@ -124,7 +124,7 @@ jobs:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Setup and Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Start Postgres
|
||||
uses: isbang/compose-action@802a148945af6399a338c7906c267331b39a71af # v2.0.0
|
||||
|
||||
@@ -2,9 +2,10 @@ name: Build, unit test and lint branch
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
merge_group:
|
||||
|
||||
concurrency:
|
||||
group: ci-${{ github.event.pull_request.number || github.ref }}
|
||||
group: ci-${{ github.event.pull_request.number || github.event.merge_group.head_sha || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
@@ -19,10 +20,16 @@ jobs:
|
||||
outputs:
|
||||
frontend_changed: ${{ steps.paths-filter.outputs.frontend == 'true' }}
|
||||
non_python_changed: ${{ steps.paths-filter.outputs.non-python == 'true' }}
|
||||
commit_sha: ${{ steps.commit-sha.outputs.sha }}
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||
# 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 frontend changes
|
||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
@@ -41,7 +48,7 @@ jobs:
|
||||
- '!packages/@n8n/task-runner-python/**'
|
||||
- name: Setup and Build
|
||||
if: steps.paths-filter.outputs.non-python == 'true'
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Run format check
|
||||
if: steps.paths-filter.outputs.non-python == 'true'
|
||||
@@ -63,16 +70,16 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||
ref: ${{ needs.install-and-build.outputs.commit_sha }}
|
||||
|
||||
- name: Setup pnpm CLI
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
|
||||
with:
|
||||
node-version: '22.x'
|
||||
cache: pnpm
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
@@ -92,7 +99,7 @@ jobs:
|
||||
uses: ./.github/workflows/units-tests-reusable.yml
|
||||
needs: install-and-build
|
||||
with:
|
||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||
ref: ${{ needs.install-and-build.outputs.commit_sha }}
|
||||
collectCoverage: true
|
||||
secrets:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
@@ -105,10 +112,10 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||
ref: ${{ needs.install-and-build.outputs.commit_sha }}
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: pnpm typecheck
|
||||
|
||||
@@ -118,13 +125,15 @@ jobs:
|
||||
uses: ./.github/workflows/linting-reusable.yml
|
||||
needs: install-and-build
|
||||
with:
|
||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||
ref: ${{ needs.install-and-build.outputs.commit_sha }}
|
||||
|
||||
e2e-tests:
|
||||
name: E2E Tests
|
||||
needs: [install-and-build]
|
||||
needs: install-and-build
|
||||
if: needs.install-and-build.outputs.non_python_changed == 'true'
|
||||
uses: ./.github/workflows/playwright-test-ci.yml
|
||||
with:
|
||||
branch: ${{ needs.install-and-build.outputs.commit_sha }}
|
||||
secrets: inherit
|
||||
|
||||
# This job is required by GitHub branch protection rules.
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
- packages/cli/**
|
||||
- name: Setup, build and export sqlite
|
||||
if: steps.paths-filter.outputs.db == 'true'
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: |
|
||||
pnpm build
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
|
||||
- name: Setup and Build
|
||||
if: steps.paths-filter.outputs.db == 'true'
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Start Postgres
|
||||
if: steps.paths-filter.outputs.db == 'true'
|
||||
|
||||
@@ -86,9 +86,10 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup and Build
|
||||
uses: ./.github/actions/setup-nodejs-blacksmith
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: pnpm build:n8n
|
||||
enable-docker-cache: 'true'
|
||||
|
||||
- name: Determine Docker tags for all images
|
||||
id: determine-tags
|
||||
@@ -104,9 +105,6 @@ jobs:
|
||||
echo "${key}: ${value%%,*}..." # Show first tag for brevity
|
||||
done
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: needs.determine-build-context.outputs.push_enabled == 'true'
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||
@@ -125,7 +123,7 @@ jobs:
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Build and push n8n Docker image
|
||||
uses: useblacksmith/build-push-action@574eb0ee0b59c6a687ace24192f0727dfb65d6d7 # v1.2
|
||||
uses: useblacksmith/build-push-action@30c71162f16ea2c27c3e21523255d209b8b538c1 # v2
|
||||
with:
|
||||
context: .
|
||||
file: ./docker/images/n8n/Dockerfile
|
||||
@@ -140,7 +138,7 @@ jobs:
|
||||
tags: ${{ steps.determine-tags.outputs.n8n_tags }}
|
||||
|
||||
- name: Build and push task runners Docker image (Alpine)
|
||||
uses: useblacksmith/build-push-action@574eb0ee0b59c6a687ace24192f0727dfb65d6d7 # v1.2
|
||||
uses: useblacksmith/build-push-action@30c71162f16ea2c27c3e21523255d209b8b538c1 # v2
|
||||
with:
|
||||
context: .
|
||||
file: ./docker/images/runners/Dockerfile
|
||||
@@ -155,7 +153,7 @@ jobs:
|
||||
tags: ${{ steps.determine-tags.outputs.runners_tags }}
|
||||
|
||||
- name: Build and push task runners Docker image (distroless)
|
||||
uses: useblacksmith/build-push-action@574eb0ee0b59c6a687ace24192f0727dfb65d6d7 # v1.2
|
||||
uses: useblacksmith/build-push-action@30c71162f16ea2c27c3e21523255d209b8b538c1 # v2
|
||||
with:
|
||||
context: .
|
||||
file: ./docker/images/runners/Dockerfile.distroless
|
||||
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
ref: ${{ inputs.ref }}
|
||||
|
||||
- name: Build and Test
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: pnpm lint
|
||||
node-version: ${{ inputs.nodeVersion }}
|
||||
|
||||
@@ -2,15 +2,23 @@ name: E2E Tests for CI
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
branch:
|
||||
description: 'GitHub branch/ref to test'
|
||||
required: false
|
||||
type: string
|
||||
default: ''
|
||||
|
||||
jobs:
|
||||
# Multi-main: postgres + redis + caddy + 2 mains + 1 worker
|
||||
# Only runs for internal PRs (not community/fork PRs)
|
||||
# Builds Docker images locally per shard for faster parallel execution
|
||||
multi-main-ui:
|
||||
name: 'Multi-Main: UI'
|
||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||
uses: ./.github/workflows/playwright-test-reusable.yml
|
||||
with:
|
||||
branch: ${{ inputs.branch }}
|
||||
test-mode: docker-build
|
||||
test-command: pnpm --filter=n8n-playwright test:container:multi-main:ui
|
||||
shards: '[1, 2, 3, 4, 5, 6, 7, 8]'
|
||||
@@ -23,6 +31,7 @@ jobs:
|
||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||
uses: ./.github/workflows/playwright-test-reusable.yml
|
||||
with:
|
||||
branch: ${{ inputs.branch }}
|
||||
test-mode: docker-build
|
||||
test-command: pnpm --filter=n8n-playwright test:container:multi-main:isolated
|
||||
shards: '[1]'
|
||||
@@ -37,6 +46,7 @@ jobs:
|
||||
if: ${{ github.event.pull_request.head.repo.fork }}
|
||||
uses: ./.github/workflows/playwright-test-reusable.yml
|
||||
with:
|
||||
branch: ${{ inputs.branch }}
|
||||
test-mode: local
|
||||
test-command: pnpm --filter=n8n-playwright test:local
|
||||
shards: '[1, 2, 3, 4, 5]'
|
||||
@@ -48,6 +58,7 @@ jobs:
|
||||
if: ${{ github.event.pull_request.head.repo.fork }}
|
||||
uses: ./.github/workflows/playwright-test-reusable.yml
|
||||
with:
|
||||
branch: ${{ inputs.branch }}
|
||||
test-mode: local
|
||||
test-command: pnpm --filter=n8n-playwright test:local:isolated
|
||||
shards: '[1]'
|
||||
|
||||
@@ -6,10 +6,10 @@ on:
|
||||
workflow_dispatch: # Allow manual triggering
|
||||
|
||||
env:
|
||||
PLAYWRIGHT_BROWSERS_PATH: packages/testing/playwright/ms-playwright-cache
|
||||
NODE_OPTIONS: --max-old-space-size=16384
|
||||
TESTCONTAINERS_RYUK_DISABLED: true
|
||||
PLAYWRIGHT_WORKERS: 4
|
||||
PLAYWRIGHT_BROWSERS_PATH: packages/testing/playwright/.playwright-browsers
|
||||
|
||||
jobs:
|
||||
coverage:
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
|
||||
- name: Setup Environment
|
||||
uses: ./.github/actions/setup-nodejs-blacksmith
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
env:
|
||||
INCLUDE_TEST_CONTROLLER: 'true'
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
INCLUDE_TEST_CONTROLLER: 'true'
|
||||
|
||||
- name: Install Browsers
|
||||
run: pnpm turbo install-browsers:ci
|
||||
run: pnpm turbo run install-browsers --filter=n8n-playwright
|
||||
|
||||
- name: Run Container Coverage Tests
|
||||
id: coverage-tests
|
||||
|
||||
@@ -23,7 +23,7 @@ on:
|
||||
default: '[1, 2, 3, 4, 5, 6, 7, 8]'
|
||||
type: string
|
||||
docker-image:
|
||||
description: 'Docker image to use (for docker-pull mode)'
|
||||
description: 'Docker image to use (for docker-pull mode). The runners image is derived automatically from the n8n image.'
|
||||
required: false
|
||||
default: 'n8nio/n8n:nightly'
|
||||
type: string
|
||||
@@ -53,13 +53,16 @@ on:
|
||||
required: false
|
||||
|
||||
env:
|
||||
PLAYWRIGHT_BROWSERS_PATH: packages/testing/playwright/ms-playwright-cache
|
||||
NODE_OPTIONS: --max-old-space-size=3072
|
||||
NODE_OPTIONS: ${{ contains(inputs.runner, '2vcpu') && '--max-old-space-size=6144' || '' }}
|
||||
# Disable Ryuk to avoid issues with Docker since it needs privileged access, containers are cleaned on teardown anyway
|
||||
TESTCONTAINERS_RYUK_DISABLED: true
|
||||
PLAYWRIGHT_WORKERS: ${{ inputs.workers || '2' }} # Configurable workers, defaults to 2 to reduce resource contention
|
||||
PLAYWRIGHT_WORKERS: ${{ inputs.workers != '' && inputs.workers || '2' }}
|
||||
# Must match CI's COVERAGE_ENABLED to ensure Turbo cache hits (it's a globalEnv in turbo.json)
|
||||
COVERAGE_ENABLED: 'true'
|
||||
# Browser cache location - must match install-browsers script
|
||||
PLAYWRIGHT_BROWSERS_PATH: packages/testing/playwright/.playwright-browsers
|
||||
N8N_DOCKER_IMAGE: ${{ inputs.test-mode == 'docker-build' && 'n8nio/n8n:local' || inputs.docker-image }}
|
||||
N8N_SKIP_LICENSES: 'true'
|
||||
|
||||
jobs:
|
||||
test:
|
||||
@@ -79,28 +82,24 @@ jobs:
|
||||
ref: ${{ inputs.branch || github.ref }}
|
||||
|
||||
- name: Setup Environment
|
||||
uses: ./.github/actions/setup-nodejs-blacksmith
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: ${{ inputs.test-mode == 'docker-build' && 'pnpm build:docker' || 'pnpm turbo build:playwright' }}
|
||||
enable-docker-cache: ${{ inputs.test-mode != 'local' }}
|
||||
# docker-build: build app + docker image locally
|
||||
# docker-pull: no build needed, image is pre-built
|
||||
# local: build app for local server
|
||||
build-command: ${{ inputs.test-mode == 'docker-build' && 'pnpm build:docker' || (inputs.test-mode == 'local' && 'pnpm build' || '') }}
|
||||
enable-docker-cache: ${{ inputs.test-mode == 'docker-build' }}
|
||||
env:
|
||||
INCLUDE_TEST_CONTROLLER: ${{ inputs.test-mode == 'docker-build' && 'true' || '' }}
|
||||
|
||||
- name: Install Browsers
|
||||
if: inputs.test-mode == 'docker-build'
|
||||
run: pnpm turbo install-browsers:ci
|
||||
run: pnpm turbo run install-browsers --filter=n8n-playwright
|
||||
|
||||
- name: Pre-pull Test Container Images
|
||||
if: ${{ !contains(inputs.test-command, 'test:local') }}
|
||||
run: |
|
||||
# Pre-pull all test container images to avoid network changes during test execution
|
||||
npx tsx packages/testing/containers/pull-test-images.ts || true
|
||||
env:
|
||||
N8N_DOCKER_IMAGE: ${{ inputs.test-mode == 'docker-build' && 'n8nio/n8n:local' || inputs.docker-image }}
|
||||
|
||||
- name: Prepare Test Image
|
||||
if: inputs.test-mode == 'docker-pull'
|
||||
run: pnpm --filter=n8n-playwright prepare-test-image ${{ inputs.docker-image }}
|
||||
|
||||
- name: Run Tests
|
||||
run: |
|
||||
@@ -108,7 +107,6 @@ jobs:
|
||||
--shard=${{ matrix.shard }}/${{ strategy.job-total }} \
|
||||
--workers=${{ env.PLAYWRIGHT_WORKERS }}
|
||||
env:
|
||||
N8N_DOCKER_IMAGE: ${{ inputs.test-mode == 'docker-build' && 'n8nio/n8n:local' || inputs.docker-image }}
|
||||
CURRENTS_RECORD_KEY: ${{ secrets.CURRENTS_RECORD_KEY }}
|
||||
QA_PERFORMANCE_METRICS_WEBHOOK_URL: ${{ secrets.QA_PERFORMANCE_METRICS_WEBHOOK_URL }}
|
||||
QA_PERFORMANCE_METRICS_WEBHOOK_USER: ${{ secrets.QA_PERFORMANCE_METRICS_WEBHOOK_USER }}
|
||||
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Setup and Build ARM64
|
||||
uses: ./.github/actions/setup-nodejs-blacksmith
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
env:
|
||||
N8N_FAIL_ON_POPULARITY_FETCH_ERROR: true
|
||||
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Setup and Build
|
||||
uses: ./.github/actions/setup-nodejs-github
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
env:
|
||||
N8N_FAIL_ON_POPULARITY_FETCH_ERROR: true
|
||||
|
||||
@@ -133,7 +133,7 @@ jobs:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Restore Turbo Cache
|
||||
uses: ./.github/actions/setup-nodejs-github
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Create a frontend release
|
||||
uses: getsentry/action-release@e769183448303de84c5a06aaaddf9da7be26d6c7 # v1.7.0
|
||||
|
||||
@@ -41,7 +41,7 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Setup and Build
|
||||
uses: ./.github/actions/setup-nodejs-github
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: 'pnpm turbo build --filter "...${{ github.event.inputs.package }}"'
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Setup Node.js
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: pnpm run build --filter=@n8n/utils --filter=@n8n/vitest-config --filter=@n8n/design-system
|
||||
|
||||
|
||||
@@ -31,10 +31,10 @@ jobs:
|
||||
fetch-depth: 0 # Fetch all history for git log
|
||||
|
||||
- name: Setup PNPM
|
||||
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
|
||||
with:
|
||||
node-version: '22.x'
|
||||
cache: 'pnpm'
|
||||
@@ -107,7 +107,7 @@ jobs:
|
||||
|
||||
# Find all commits between the last success and now that touched the relevant files
|
||||
# NOTE: The pathspecs here mirror the workflow's 'paths' trigger for precision
|
||||
RELEVANT_COMMITS=$(git log --pretty=format:"- [%h](https://github.com/${{ github.repository }}/commit/%H) %s" $LAST_SUCCESS_SHA..${{ github.sha }} -- \
|
||||
RELEVANT_COMMITS=$(git log --pretty=format:"- [%h](https://github.com/${{ github.repository }}/commit/%H) %s" "${LAST_SUCCESS_SHA}..${{ github.sha }}" -- \
|
||||
'packages/cli/src/public-api/**/*.css' \
|
||||
'packages/cli/src/public-api/**/*.yaml' \
|
||||
'packages/cli/src/public-api/**/*.yml')
|
||||
@@ -129,9 +129,11 @@ jobs:
|
||||
SOURCE_LINK="Source commit(s):"$'\n'"$RELEVANT_COMMITS"
|
||||
fi
|
||||
|
||||
echo "source_link<<EOF" >> "$GITHUB_OUTPUT"
|
||||
echo "$SOURCE_LINK" >> "$GITHUB_OUTPUT"
|
||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||
{
|
||||
echo "source_link<<EOF"
|
||||
echo "$SOURCE_LINK"
|
||||
echo "EOF"
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Create PR in Docs Repo
|
||||
if: steps.verify_file.outputs.file_exists == 'true'
|
||||
|
||||
@@ -34,7 +34,7 @@ jobs:
|
||||
ref: ${{ inputs.git_ref }}
|
||||
|
||||
- name: Set up Environment
|
||||
uses: ./.github/actions/setup-nodejs-blacksmith
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
|
||||
- name: Set up Workflow Tests
|
||||
run: pnpm --filter=n8n-playwright test:workflows:setup
|
||||
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
ref: ${{ inputs.ref }}
|
||||
|
||||
- name: Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
node-version: ${{ inputs.nodeVersion }}
|
||||
|
||||
@@ -70,7 +70,7 @@ jobs:
|
||||
ref: ${{ inputs.ref }}
|
||||
|
||||
- name: Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
node-version: ${{ inputs.nodeVersion }}
|
||||
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
ref: ${{ inputs.ref }}
|
||||
|
||||
- name: Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
node-version: ${{ inputs.nodeVersion }}
|
||||
|
||||
@@ -140,7 +140,7 @@ jobs:
|
||||
ref: ${{ inputs.ref }}
|
||||
|
||||
- name: Build
|
||||
uses: n8n-io/n8n/.github/actions/setup-nodejs-blacksmith@f5fbbbe0a28a886451c886cac6b49192a39b0eea # v1.104.1
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
node-version: ${{ inputs.nodeVersion }}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Setup Node.js and Dependencies
|
||||
uses: ./.github/actions/setup-nodejs-github
|
||||
uses: ./.github/actions/setup-nodejs
|
||||
with:
|
||||
build-command: '' # Skip build, we only need to fetch data
|
||||
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ test-results.json
|
||||
*.0x
|
||||
packages/testing/playwright/playwright-report
|
||||
packages/testing/playwright/test-results
|
||||
packages/testing/playwright/ms-playwright-cache
|
||||
packages/testing/playwright/.playwright-browsers
|
||||
test-results/
|
||||
compiled_app_output
|
||||
trivy_report*
|
||||
|
||||
@@ -5,18 +5,15 @@
|
||||
// Use N8N_DOCKER_IMAGE env var if set, otherwise default to 'n8nio/n8n:local'
|
||||
const n8nImage = process.env.N8N_DOCKER_IMAGE ?? 'n8nio/n8n:local';
|
||||
|
||||
// Derive the task runner image from the n8n image tag for consistency
|
||||
// Derive the task runner image from the n8n image for consistency
|
||||
// e.g., 'n8nio/n8n:local' -> 'n8nio/runners:local'
|
||||
// e.g., 'n8nio/n8n:1.50.0' -> 'n8nio/runners:1.50.0'
|
||||
// e.g., 'ghcr.io/n8n-io/n8n:pr-123' -> 'ghcr.io/n8n-io/runners:pr-123'
|
||||
function getTaskRunnerImage(): string {
|
||||
// Allow explicit override via env var
|
||||
if (process.env.N8N_RUNNERS_IMAGE) {
|
||||
return process.env.N8N_RUNNERS_IMAGE;
|
||||
}
|
||||
|
||||
// Extract the tag from the n8n image and apply it to runners
|
||||
const tag = n8nImage.split(':').at(-1) ?? 'local';
|
||||
return `n8nio/runners:${tag}`;
|
||||
return n8nImage.replace(/\/n8n:/, '/runners:');
|
||||
}
|
||||
|
||||
export const TEST_CONTAINER_IMAGES = {
|
||||
|
||||
@@ -27,8 +27,7 @@
|
||||
"test:workflows:update": "playwright test --project=cli-workflows --update-snapshots",
|
||||
"coverage:report": "node scripts/generate-coverage-report.js",
|
||||
"coverage:clean": "rm -rf coverage .nyc_output",
|
||||
"install-browsers:local": "playwright install chromium --with-deps",
|
||||
"install-browsers:ci": "PLAYWRIGHT_BROWSERS_PATH=./ms-playwright-cache playwright install chromium --with-deps",
|
||||
"install-browsers": "PLAYWRIGHT_BROWSERS_PATH=./.playwright-browsers playwright install chromium --with-deps",
|
||||
"browsers:uninstall": "playwright uninstall --all",
|
||||
"prepare-test-image": "node scripts/build-test-image.mjs",
|
||||
"lint": "eslint . --quiet",
|
||||
|
||||
+15
-10
@@ -105,16 +105,21 @@ try {
|
||||
buildProcess.pipe(process.stdout);
|
||||
await buildProcess;
|
||||
|
||||
// Generate third-party licenses for production build
|
||||
echo(chalk.yellow('INFO: Generating third-party licenses...'));
|
||||
try {
|
||||
const licenseProcess = $`cd ${config.rootDir} && node scripts/generate-third-party-licenses.mjs`;
|
||||
licenseProcess.pipe(process.stdout);
|
||||
await licenseProcess;
|
||||
echo(chalk.green('✅ Third-party licenses generated successfully'));
|
||||
} catch (error) {
|
||||
echo(chalk.yellow('⚠️ Warning: Third-party license generation failed, continuing build...'));
|
||||
echo(chalk.red(`ERROR: License generation failed: ${error.message}`));
|
||||
// Generate third-party licenses for production builds
|
||||
// Skip with N8N_SKIP_LICENSES=true for CI test builds
|
||||
if (process.env.N8N_SKIP_LICENSES !== 'true') {
|
||||
echo(chalk.yellow('INFO: Generating third-party licenses...'));
|
||||
try {
|
||||
const licenseProcess = $`cd ${config.rootDir} && node scripts/generate-third-party-licenses.mjs`;
|
||||
licenseProcess.pipe(process.stdout);
|
||||
await licenseProcess;
|
||||
echo(chalk.green('✅ Third-party licenses generated successfully'));
|
||||
} catch (error) {
|
||||
echo(chalk.yellow('⚠️ Warning: Third-party license generation failed, continuing build...'));
|
||||
echo(chalk.red(`ERROR: License generation failed: ${error.message}`));
|
||||
}
|
||||
} else {
|
||||
echo(chalk.gray('INFO: Skipping license generation (N8N_SKIP_LICENSES=true)'));
|
||||
}
|
||||
|
||||
echo(chalk.green('✅ pnpm install and build completed'));
|
||||
|
||||
+3
-11
@@ -35,21 +35,13 @@
|
||||
},
|
||||
"watch": { "cache": false, "persistent": true },
|
||||
"dev": { "cache": false, "persistent": true },
|
||||
"build:playwright": {
|
||||
"dependsOn": ["install-browsers:ci", "build"]
|
||||
},
|
||||
"install-browsers:ci": {
|
||||
"install-browsers": {
|
||||
"cache": true,
|
||||
"inputs": ["package.json"],
|
||||
"outputs": ["ms-playwright-cache/**"],
|
||||
"inputs": ["$TURBO_DEFAULT$", "../../pnpm-lock.yaml"],
|
||||
"outputs": [".playwright-browsers/**"],
|
||||
"env": ["PLAYWRIGHT_BROWSERS_PATH"]
|
||||
},
|
||||
"install-browsers:local": {
|
||||
"cache": false,
|
||||
"inputs": ["package.json"]
|
||||
},
|
||||
"test:container:standard": {
|
||||
"dependsOn": ["install-browsers:local"],
|
||||
"env": ["E2E_TESTS"],
|
||||
"cache": false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user