name: 'CI: Master (Build, Test, Lint)'

on:
  push:
    branches:
      - master
      - 1.x
    paths-ignore:
      - packages/@n8n/task-runner-python/**

jobs:
  build-github:
    name: Build for Github Cache
    runs-on: ubuntu-latest
    env:
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
      QA_METRICS_WEBHOOK_URL: ${{ secrets.QA_METRICS_WEBHOOK_URL }}
      QA_METRICS_WEBHOOK_USER: ${{ secrets.QA_METRICS_WEBHOOK_USER }}
      QA_METRICS_WEBHOOK_PASSWORD: ${{ secrets.QA_METRICS_WEBHOOK_PASSWORD }}
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: Setup and Build
        uses: ./.github/actions/setup-nodejs

  unit-test:
    name: Unit tests
    uses: ./.github/workflows/test-unit-reusable.yml
    strategy:
      fail-fast: false
      matrix:
        node-version: [22.22.3, 24.15.0]
    with:
      ref: ${{ github.sha }}
      nodeVersion: ${{ matrix.node-version }}
      collectCoverage: ${{ matrix.node-version == '24.15.0' }}
    secrets: inherit

  lint:
    name: Lint
    uses: ./.github/workflows/test-linting-reusable.yml
    with:
      ref: ${{ github.sha }}

  performance:
    name: Performance
    uses: ./.github/workflows/test-bench-reusable.yml
    with:
      ref: ${{ github.sha }}

  notify-on-failure:
    name: Notify Slack on failure
    runs-on: ubuntu-latest
    needs: [unit-test, lint, performance, build-github]
    if: ${{ always() && contains(needs.*.result, 'failure') }}
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          sparse-checkout: .github/scripts/slack
          sparse-checkout-cone-mode: false
      - name: Notify Slack
        env:
          SLACK_TOKEN: ${{ secrets.QBOT_SLACK_TOKEN }}
        run: |
          node .github/scripts/slack/notify.mjs \
            --channel '#alerts-build' \
            --text '${{ github.ref_name }} branch (build or test or lint) failed (${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})'
