Merge branch 'master' into v2

This commit is contained in:
Tomi Turtiainen
2025-12-10 10:08:10 +02:00
772 changed files with 41955 additions and 14266 deletions
+1
View File
@@ -5,3 +5,4 @@ self-hosted-runner:
- blacksmith-2vcpu-ubuntu-2204-arm
- blacksmith-4vcpu-ubuntu-2204-arm
- blacksmith-8vcpu-ubuntu-2204
- ubuntu-slim
+17 -15
View File
@@ -123,24 +123,26 @@ jobs:
with:
ref: refs/pull/${{ github.event.pull_request.number }}/merge
e2e-test:
e2e-tests:
name: E2E Tests
needs: [install-and-build, unit-test, typecheck, lint]
if: |
always() &&
needs.install-and-build.result == 'success' &&
needs.unit-test.result != 'failure' &&
needs.typecheck.result != 'failure' &&
needs.lint.result != 'failure'
uses: ./.github/workflows/playwright-test-reusable.yml
needs: [install-and-build]
if: needs.install-and-build.outputs.non_python_changed == 'true'
uses: ./.github/workflows/playwright-test-ci.yml
secrets: inherit
e2e-checks:
name: E2E - Checks
runs-on: ubuntu-latest
needs: [e2e-test]
# 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 below.
required-checks:
name: Required Checks
needs: [install-and-build, unit-test, typecheck, lint, e2e-tests]
if: always()
runs-on: ubuntu-slim
steps:
- name: Fail if E2E tests failed
if: needs.e2e-test.result == 'failure'
- name: Fail if any required job failed or was skipped unexpectedly
# The non_python_changed check allows jobs to be skipped for python-only changes,
# since those jobs don't run when only python files are modified.
if: |
contains(needs.*.result, 'failure') ||
(needs.install-and-build.outputs.non_python_changed == 'true' && contains(needs.*.result, 'skipped'))
run: exit 1
+1 -13
View File
@@ -42,18 +42,6 @@ on:
required: false
type: string
pull_request:
types:
- opened
- ready_for_review
paths:
- '.github/workflows/docker-build-push.yml'
- '.github/scripts/docker/docker-config.mjs'
- '.github/scripts/docker/docker-tags.mjs'
- 'docker/images/n8n/Dockerfile'
- 'docker/images/runners/Dockerfile'
- 'docker/images/runners/Dockerfile.distroless'
jobs:
determine-build-context:
name: Determine Build Context
@@ -83,7 +71,7 @@ jobs:
name: Build App, then Build and Push Docker Image (${{ matrix.platform }})
needs: determine-build-context
runs-on: ${{ matrix.runner }}
timeout-minutes: 15
timeout-minutes: 25
strategy:
matrix: ${{ fromJSON(needs.determine-build-context.outputs.build_matrix) }}
outputs:
-29
View File
@@ -1,29 +0,0 @@
name: Playwright Tests - Nightly
on:
schedule:
- cron: '0 4 * * *'
workflow_dispatch:
inputs:
image:
description: 'Docker image to test against'
required: false
default: 'n8nio/n8n:nightly'
type: string
push:
branches:
- ci-containers-nightly
jobs:
test-configurations:
strategy:
fail-fast: false
matrix:
config: [standard, postgres]
name: Test ${{ matrix.config }}
uses: ./.github/workflows/playwright-test-reusable.yml
with:
test-mode: docker-pull
docker-image: ${{ github.event.inputs.image || 'n8nio/n8n:nightly' }}
test-command: pnpm --filter=n8n-playwright test:container:${{ matrix.config }}
secrets: inherit
+55
View File
@@ -0,0 +1,55 @@
name: E2E Tests for CI
on:
workflow_call:
jobs:
# Multi-main: postgres + redis + caddy + 2 mains + 1 worker
# Only runs for internal PRs (not community/fork PRs)
multi-main-ui:
name: 'Multi-Main: UI'
if: ${{ !github.event.pull_request.head.repo.fork }}
uses: ./.github/workflows/playwright-test-reusable.yml
with:
test-mode: docker-build
test-command: pnpm --filter=n8n-playwright test:container:multi-main:ui
shards: '[1, 2, 3, 4, 5, 6, 7, 8]'
runner: blacksmith-4vcpu-ubuntu-2204
workers: '1'
secrets: inherit
multi-main-isolated:
name: 'Multi-Main: Isolated'
if: ${{ !github.event.pull_request.head.repo.fork }}
uses: ./.github/workflows/playwright-test-reusable.yml
with:
test-mode: docker-build
test-command: pnpm --filter=n8n-playwright test:container:multi-main:isolated
shards: '[1]'
runner: blacksmith-4vcpu-ubuntu-2204
workers: '1'
secrets: inherit
# Community PR tests: Local mode with SQLite (no container building, no secrets required)
# Runs on GitHub-hosted runners without Currents reporting
community-ui:
name: 'Community: UI'
if: ${{ github.event.pull_request.head.repo.fork }}
uses: ./.github/workflows/playwright-test-reusable.yml
with:
test-mode: local
test-command: pnpm --filter=n8n-playwright test:local
shards: '[1, 2, 3, 4, 5]'
runner: ubuntu-latest
workers: '2'
community-isolated:
name: 'Community: Isolated'
if: ${{ github.event.pull_request.head.repo.fork }}
uses: ./.github/workflows/playwright-test-reusable.yml
with:
test-mode: local
test-command: pnpm --filter=n8n-playwright test:local:isolated
shards: '[1]'
runner: ubuntu-latest
workers: '1'
+25 -7
View File
@@ -22,15 +22,21 @@ jobs:
- name: Setup Environment
uses: ./.github/actions/setup-nodejs-blacksmith
with:
build-command: pnpm turbo build:playwright
env:
INCLUDE_TEST_CONTROLLER: 'true'
- name: Build with Coverage
run: pnpm --filter n8n-editor-ui build:coverage
- name: Build Docker Image with Coverage
run: pnpm build:docker:coverage
env:
INCLUDE_TEST_CONTROLLER: 'true'
- name: Run Coverage Tests
- name: Install Browsers
run: pnpm turbo install-browsers:ci
- name: Run Container Coverage Tests
id: coverage-tests
run: |
pnpm --filter n8n-playwright test:local \
pnpm --filter n8n-playwright test:container:standard \
--workers=${{ env.PLAYWRIGHT_WORKERS }}
env:
BUILD_WITH_COVERAGE: 'true'
@@ -40,11 +46,23 @@ jobs:
QA_PERFORMANCE_METRICS_WEBHOOK_PASSWORD: ${{ secrets.QA_PERFORMANCE_METRICS_WEBHOOK_PASSWORD }}
- name: Generate Coverage Report
if: always() && steps.coverage-tests.outcome != 'skipped'
run: pnpm --filter n8n-playwright coverage:report
- name: Upload Coverage Report
- name: Upload Coverage Report Artifact
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: coverage-report
path: packages/testing/playwright/coverage/
retention-days: 14
- name: Upload E2E Coverage to Codecov
if: always()
uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: packages/testing/playwright/coverage/lcov.info
flags: frontend-e2e
name: playwright-e2e
fail_ci_if_error: false
@@ -1,14 +0,0 @@
name: Run Playwright Tests (Docker Build)
# This workflow is used to run Playwright tests in a Docker container built from the current branch
on:
workflow_call:
workflow_dispatch:
jobs:
build-and-test:
uses: ./.github/workflows/playwright-test-reusable.yml
with:
test-mode: docker-build
test-command: pnpm --filter=n8n-playwright test:container:standard
secrets: inherit
+14 -1
View File
@@ -32,6 +32,11 @@ on:
required: false
default: ''
type: string
runner:
description: 'GitHub runner to use'
required: false
default: 'blacksmith-2vcpu-ubuntu-2204'
type: string
secrets:
CURRENTS_RECORD_KEY:
@@ -42,6 +47,10 @@ on:
required: false
QA_PERFORMANCE_METRICS_WEBHOOK_PASSWORD:
required: false
N8N_LICENSE_ACTIVATION_KEY:
required: false
N8N_ENCRYPTION_KEY:
required: false
env:
PLAYWRIGHT_BROWSERS_PATH: packages/testing/playwright/ms-playwright-cache
@@ -49,10 +58,13 @@ env:
# 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
# Must match CI's COVERAGE_ENABLED to ensure Turbo cache hits (it's a globalEnv in turbo.json)
COVERAGE_ENABLED: 'true'
jobs:
test:
runs-on: blacksmith-2vcpu-ubuntu-2204
runs-on: ${{ inputs.runner }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
@@ -101,3 +113,4 @@ jobs:
QA_PERFORMANCE_METRICS_WEBHOOK_URL: ${{ secrets.QA_PERFORMANCE_METRICS_WEBHOOK_URL }}
QA_PERFORMANCE_METRICS_WEBHOOK_USER: ${{ secrets.QA_PERFORMANCE_METRICS_WEBHOOK_USER }}
QA_PERFORMANCE_METRICS_WEBHOOK_PASSWORD: ${{ secrets.QA_PERFORMANCE_METRICS_WEBHOOK_PASSWORD }}
N8N_LICENSE_ACTIVATION_KEY: ${{ secrets.N8N_LICENSE_ACTIVATION_KEY }}
+1 -1
View File
@@ -43,7 +43,7 @@ jobs:
pnpm add --global wrangler
- name: Deploy
uses: cloudflare/wrangler-action@da0e0dfe58b7a431659754fdf3f186c529afbe65
uses: cloudflare/wrangler-action@da0e0dfe58b7a431659754fdf3f186c529afbe65 # v3.14.1
id: cloudflare_deployment
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+1 -1
View File
@@ -137,7 +137,7 @@ jobs:
if: steps.verify_file.outputs.file_exists == 'true'
# Pin v7.0.8
uses: peter-evans/create-pull-request@18e469570b1cf0dfc11d60ec121099f8ff3e617a
uses: peter-evans/create-pull-request@84ae59a2cdc2258d6fa0732dd66352dddae2a412
with:
token: ${{ steps.generate_token.outputs.token }}
+2 -2
View File
@@ -56,5 +56,5 @@ jobs:
branch: update-node-popularity
base: master
delete-branch: true
author: n8n Bot <191478365+n8n-bot@users.noreply.github.com>
committer: n8n Bot <191478365+n8n-bot@users.noreply.github.com>
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
committer: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>