From 4b43f074e89e82b11c60ee73c21ec3e840b156e0 Mon Sep 17 00:00:00 2001 From: Andy <119136210+AndyMik90@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:33:01 +0100 Subject: [PATCH] fix(ci): add gate jobs and consolidate linting workflow (#1182) * fix(ci): standardize workflow naming and remove redundant workflows - Rename CI job names to consistent format: - test-python ({version}, {os}) - test-frontend ({os}) - test-integration ({os}) - Remove redundant workflows: - test-on-tag.yml: Tests already run via CI before tag creation - validate-version.yml: Should be part of prepare-release - test-azure-auth.yml: Dead trigger (manual only) - pr-status-gate.yml: Redundant with branch protection rules Co-Authored-By: Claude Opus 4.5 * fix(ci): remove status labels and update docs for deleted workflows - Remove STATUS labels from pr-labeler.yml (redundant with GitHub's native PR checks UI) - Remove stale comments referencing deleted pr-status-gate.yml - Update CONTRIBUTING.md to remove 'Test on Tag' workflow reference - Update RELEASE.md to remove validate-version.yml reference Co-Authored-By: Claude Opus 4.5 * fix(ci): remove review labels from pr-labeler Review labels (Missing AC Approval, AC: Approved, etc.) are removed since pr-status-gate.yml was deleted and GitHub's native review system already handles approval state and invalidation on new commits. Co-Authored-By: Claude Opus 4.5 * fix(ci): add gate jobs and consolidate linting workflow - Add CI Complete gate job to ci.yml for simplified branch protection - Add TypeScript (ESLint) linting to lint.yml alongside Python (Ruff) - Add Lint Complete gate job to lint.yml - Remove redundant lint step from test-frontend (now in lint.yml) Branch protection now only needs 3 checks: - CI Complete (all tests/builds) - Lint Complete (Python + TypeScript) - Security Summary (CodeQL + Bandit) Co-Authored-By: Claude Opus 4.5 --------- Co-authored-by: Test User Co-authored-by: Claude Opus 4.5 --- .github/workflows/ci.yml | 30 ++++++++++++++++++--- .github/workflows/lint.yml | 53 +++++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f328a74c..7c4f7510 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -131,10 +131,6 @@ jobs: working-directory: apps/frontend run: npm ci --ignore-scripts - - name: Run linter - working-directory: apps/frontend - run: npm run lint - - name: Run TypeScript type check working-directory: apps/frontend run: npm run typecheck @@ -196,3 +192,29 @@ jobs: source .venv/bin/activate fi pytest ../../tests/test_platform.py -v --tb=short + + # -------------------------------------------------------------------------- + # Gate Job - Single check for branch protection + # -------------------------------------------------------------------------- + ci-complete: + name: CI Complete + runs-on: ubuntu-latest + needs: [test-python, test-frontend, test-platform-integration] + if: always() + steps: + - name: Check all CI jobs passed + run: | + echo "CI Job Results:" + echo " test-python: ${{ needs.test-python.result }}" + echo " test-frontend: ${{ needs.test-frontend.result }}" + echo " test-platform-integration: ${{ needs.test-platform-integration.result }}" + echo "" + + if [[ "${{ needs.test-python.result }}" != "success" ]] || \ + [[ "${{ needs.test-frontend.result }}" != "success" ]] || \ + [[ "${{ needs.test-platform-integration.result }}" != "success" ]]; then + echo "❌ One or more CI jobs failed" + exit 1 + fi + + echo "✅ All CI checks passed" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 86035f1c..e105d774 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,8 +11,9 @@ concurrency: cancel-in-progress: true jobs: - # Python linting + # Python linting (Ruff) python: + name: Python (Ruff) runs-on: ubuntu-latest steps: - name: Checkout @@ -32,3 +33,53 @@ jobs: - name: Run ruff format check run: ruff format apps/backend/ --check --diff + + # TypeScript/JavaScript linting (ESLint) + typescript: + name: TypeScript (ESLint) + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + + - name: Get npm cache directory + id: npm-cache + run: echo "dir=$(npm config get cache)" >> "$GITHUB_OUTPUT" + + - name: Cache npm dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.npm-cache.outputs.dir }} + key: ${{ runner.os }}-npm-lint-${{ hashFiles('apps/frontend/package-lock.json') }} + restore-keys: ${{ runner.os }}-npm-lint- + + - name: Install dependencies + working-directory: apps/frontend + run: npm ci --ignore-scripts + + - name: Run ESLint + working-directory: apps/frontend + run: npm run lint + + # Gate job for branch protection + lint-complete: + name: Lint Complete + runs-on: ubuntu-latest + needs: [python, typescript] + if: always() + steps: + - name: Check lint results + run: | + if [[ "${{ needs.python.result }}" != "success" ]] || \ + [[ "${{ needs.typescript.result }}" != "success" ]]; then + echo "❌ Linting failed" + echo " Python: ${{ needs.python.result }}" + echo " TypeScript: ${{ needs.typescript.result }}" + exit 1 + fi + echo "✅ All linting passed"