Skip to content
Latchkey

CI workflow (lamaalrajih/kicad-mcp)

The CI workflow from lamaalrajih/kicad-mcp, explained and optimized by Latchkey.

C

CI health: C - fair

Point runs-on at Latchkey and get run de-duplication, job timeouts, SHA-pinned actions, self-healing for flaky steps, and up to 58% lower cost, applied automatically.

Grade your own workflow free or run it on Latchkey →
Source: lamaalrajih/kicad-mcp.github/workflows/ci.ymlLicense MITView source

What it does

This is the CI workflow from the lamaalrajih/kicad-mcp repository, a real project running GitHub Actions. It is shown here with attribution under its MIT license.

Below, Latchkey shows a faster, safer version produced by its optimization engine.

The workflow

workflow (.yml)
name: CI

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]

jobs:
  lint:
    runs-on: ubuntu-latest
    name: Lint and Format

    steps:
    - uses: actions/checkout@v4

    - name: Install uv
      uses: astral-sh/setup-uv@v4
      with:
        enable-cache: true

    - name: Set up Python 3.12
      run: |
        uv python install 3.12
        uv python pin 3.12

    - name: Install dependencies
      run: uv sync --group dev

    - name: Lint with ruff
      run: uv run ruff check kicad_mcp/ tests/

    - name: Check formatting with ruff
      run: uv run ruff format --check kicad_mcp/ tests/

  test:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest]
        python-version: ["3.10", "3.11", "3.12", "3.13"]
        exclude:
          - os: macos-latest
            python-version: "3.10"

    name: Test Python ${{ matrix.python-version }} on ${{ matrix.os }}

    steps:
    - uses: actions/checkout@v4

    - name: Install uv
      uses: astral-sh/setup-uv@v4
      with:
        enable-cache: true

    - name: Set up Python ${{ matrix.python-version }}
      run: |
        uv python install ${{ matrix.python-version }}
        uv python pin ${{ matrix.python-version }}

    - name: Install dependencies
      run: uv sync --group dev

    - name: Run tests
      run: uv run python -m pytest tests/ -v --cov=kicad_mcp --cov-report=xml --cov-fail-under=30

    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v4
      if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
      with:
        file: ./coverage.xml
        fail_ci_if_error: false

  security:
    runs-on: ubuntu-latest
    name: Security Scan

    steps:
    - uses: actions/checkout@v4

    - name: Install uv
      uses: astral-sh/setup-uv@v4
      with:
        enable-cache: true

    - name: Set up Python 3.12
      run: |
        uv python install 3.12
        uv python pin 3.12

    - name: Install dependencies
      run: uv sync --group dev

    - name: Run security scan
      run: uv run bandit -r kicad_mcp/

  build:
    runs-on: ubuntu-latest
    name: Build Package
    needs: [lint, test]

    steps:
    - uses: actions/checkout@v4

    - name: Install uv
      uses: astral-sh/setup-uv@v4
      with:
        enable-cache: true

    - name: Set up Python 3.12
      run: |
        uv python install 3.12
        uv python pin 3.12

    - name: Build package
      run: uv build

    - name: Upload artifacts
      uses: actions/upload-artifact@v4
      with:
        name: dist
        path: dist/

The same workflow, on Latchkey

Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.

name: CI
 
on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]
 
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
 
jobs:
  lint:
    timeout-minutes: 30
    runs-on: latchkey-small
    name: Lint and Format
 
    steps:
    - uses: actions/checkout@v4
 
    - name: Install uv
      uses: astral-sh/setup-uv@v4
      with:
        enable-cache: true
 
    - name: Set up Python 3.12
      run: |
        uv python install 3.12
        uv python pin 3.12
 
    - name: Install dependencies
      run: uv sync --group dev
 
    - name: Lint with ruff
      run: uv run ruff check kicad_mcp/ tests/
 
    - name: Check formatting with ruff
      run: uv run ruff format --check kicad_mcp/ tests/
 
  test:
    timeout-minutes: 30
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest]
        python-version: ["3.10", "3.11", "3.12", "3.13"]
        exclude:
          - os: macos-latest
            python-version: "3.10"
 
    name: Test Python ${{ matrix.python-version }} on ${{ matrix.os }}
 
    steps:
    - uses: actions/checkout@v4
 
    - name: Install uv
      uses: astral-sh/setup-uv@v4
      with:
        enable-cache: true
 
    - name: Set up Python ${{ matrix.python-version }}
      run: |
        uv python install ${{ matrix.python-version }}
        uv python pin ${{ matrix.python-version }}
 
    - name: Install dependencies
      run: uv sync --group dev
 
    - name: Run tests
      run: uv run python -m pytest tests/ -v --cov=kicad_mcp --cov-report=xml --cov-fail-under=30
 
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v4
      if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
      with:
        file: ./coverage.xml
        fail_ci_if_error: false
 
  security:
    timeout-minutes: 30
    runs-on: latchkey-small
    name: Security Scan
 
    steps:
    - uses: actions/checkout@v4
 
    - name: Install uv
      uses: astral-sh/setup-uv@v4
      with:
        enable-cache: true
 
    - name: Set up Python 3.12
      run: |
        uv python install 3.12
        uv python pin 3.12
 
    - name: Install dependencies
      run: uv sync --group dev
 
    - name: Run security scan
      run: uv run bandit -r kicad_mcp/
 
  build:
    timeout-minutes: 30
    runs-on: latchkey-small
    name: Build Package
    needs: [lint, test]
 
    steps:
    - uses: actions/checkout@v4
 
    - name: Install uv
      uses: astral-sh/setup-uv@v4
      with:
        enable-cache: true
 
    - name: Set up Python 3.12
      run: |
        uv python install 3.12
        uv python pin 3.12
 
    - name: Build package
      run: uv build
 
    - name: Upload artifacts
      uses: actions/upload-artifact@v4
      with:
        name: dist
        path: dist/
 

What changed

2 third-party actions are referenced by a movable tag. Pin them to the commit SHA (Latchkey resolves and applies this automatically) so a repointed tag cannot change what runs.

This workflow runs 4 jobs (11 with the matrix expanded) per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.

Actions used in this workflow