# Unified PR Validation Pipeline
#
# Optimized for maximum parallelism and minimum duplication.
# All independent jobs run in parallel, integration tests run after matrix completion.
name: PR Validation
on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: read
jobs:
# Fast lint check - no build required
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: "22"
- name: Enable Corepack
run: corepack enable
- name: Install Yarn
run: corepack prepare yarn@4.12.0 --activate
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Run ESLint
run: yarn lint
# Conventional commits validation
commits:
name: Conventional Commits
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check conventional commits
uses: webiny/action-conventional-commits@v1.3.1
# Matrix test across Node versions - runs in parallel
test:
name: Test (Node ${{ matrix.node-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: ["20", "22", "24"]
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
- name: Enable Corepack
run: corepack enable
- name: Install Yarn
run: corepack prepare yarn@4.12.0 --activate
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Generate Prisma client
run: yarn prisma generate
- name: Build project
run: yarn build
- name: Run tests
run: yarn test
- name: Type check
run: yarn tsc --noEmit
# Coverage report - only on Node 22
coverage:
name: Coverage
runs-on: ubuntu-latest
if: github.event.pull_request.draft == false
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: "22"
- name: Enable Corepack
run: corepack enable
- name: Install Yarn
run: corepack prepare yarn@4.12.0 --activate
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Generate Prisma client
run: yarn prisma generate
- name: Build project
run: yarn build
- name: Run tests with coverage
run: yarn test:cov
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage/lcov.info
fail_ci_if_error: false
# Code quality checks
code-quality:
name: Code Quality
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: "22"
- name: Enable Corepack
run: corepack enable
- name: Install Yarn
run: corepack prepare yarn@4.12.0 --activate
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Check code formatting
run: yarn prettier --check "**/*.{js,ts,json,md}" || echo "Some files need formatting"
- name: Check for console.log statements
run: |
if grep -r "console\.log" --include="*.ts" --exclude-dir=node_modules --exclude-dir=dist --exclude="*.test.ts" --exclude="test*.ts" src/; then
echo "::warning::Found console.log statements in source code"
fi
# Docker build test
docker:
name: Docker Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
uses: docker/build-push-action@v6
with:
context: .
push: false
tags: gitlab-mcp:test
cache-from: type=gha
cache-to: type=gha,mode=max