name: CI on: push: branches: - master pull_request: branches: - master workflow_dispatch: jobs: lint: name: Lint runs-on: ubuntu-latest timeout-minutes: 30 steps: - name: Checkout code uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'pnpm' - name: Install dependencies run: pnpm install --frozen-lockfile - name: Lint all projects run: pnpm nx run-many --target=lint --all --parallel=3 --output-style=static env: CI: true NX_TASKS_RUNNER_DYNAMIC_OUTPUT: false unit-and-typecheck: name: Unit Tests and Typechecks runs-on: ubuntu-latest timeout-minutes: 45 steps: - name: Checkout code uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'pnpm' - name: Install dependencies run: pnpm install --frozen-lockfile - name: Typecheck web and Electron entry points run: pnpm run typecheck:ci - name: Check i18n drift run: pnpm run i18n:check - name: Run Tier A unit coverage suite run: pnpm run coverage:ci env: CI: true NX_TASKS_RUNNER_DYNAMIC_OUTPUT: false - name: Run Tier B/C validation commands run: node tools/coverage/check-coverage-policy.mjs --run-non-tier-a env: CI: true NX_TASKS_RUNNER_DYNAMIC_OUTPUT: false - name: Upload unit coverage artifact if: always() uses: actions/upload-artifact@v4 with: name: unit-coverage path: | coverage/merged/ retention-days: 14 - name: Upload unit coverage to Codecov if: always() uses: codecov/codecov-action@v6 with: files: ./coverage/merged/lcov.info,./coverage/merged/cobertura-coverage.xml flags: unit name: iptvnator-unit fail_ci_if_error: false handle_no_reports_found: true disable_search: true token: ${{ secrets.CODECOV_TOKEN }}