Board make #44
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Board make | |
| # End-to-end: Freerouting → SES → PCB → KiCad zone refill → DRC gate. | |
| # Fast PR CI still uses the pinned manufacturing board in build.yml. | |
| # This workflow runs on demand, nightly, and when route inputs / stack change. | |
| # To refresh the manufacturing pin after a green run: download board-make-filled | |
| # and run `bun run board:make -- --skip-route --pin` locally (or copy artifacts). | |
| on: | |
| workflow_dispatch: | |
| schedule: | |
| - cron: "0 6 * * *" | |
| pull_request: | |
| paths: | |
| - "ci/artifacts/v3-for-route.kicad_pcb" | |
| - "ci/artifacts/v3-for-route.dsn" | |
| - "ci/artifacts/v3-for-route.kicad_pro" | |
| - "ci/artifacts/fp-lib-table" | |
| - "pcbkit/profiles/lightbar-dock.toml" | |
| - "pcbkit/crates/pcbkit-route/**" | |
| - "pcbkit/crates/pcbkit-cli/**" | |
| - "scripts/board-make.mjs" | |
| - "scripts/route-board-pcbkit.mjs" | |
| - "scripts/ensure-java.mjs" | |
| - "scripts/kicad-env.mjs" | |
| - ".github/workflows/board-make.yml" | |
| push: | |
| branches: [master] | |
| paths: | |
| - "ci/artifacts/v3-for-route.kicad_pcb" | |
| - "ci/artifacts/v3-for-route.dsn" | |
| - "ci/artifacts/v3-for-route.kicad_pro" | |
| - "ci/artifacts/fp-lib-table" | |
| - "pcbkit/profiles/lightbar-dock.toml" | |
| - "pcbkit/crates/pcbkit-route/**" | |
| - "pcbkit/crates/pcbkit-cli/**" | |
| - "scripts/board-make.mjs" | |
| - "scripts/route-board-pcbkit.mjs" | |
| - "scripts/ensure-java.mjs" | |
| - "scripts/kicad-env.mjs" | |
| - ".github/workflows/board-make.yml" | |
| concurrency: | |
| group: board-make-${{ github.ref }} | |
| cancel-in-progress: true | |
| env: | |
| FREEROUTING_VERSION: "2.2.4" | |
| FREEROUTING_JAR: third_party/freerouting/freerouting-2.2.4.jar | |
| jobs: | |
| route: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: 1.3.14 | |
| - uses: dtolnay/rust-toolchain@stable | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| # Freerouting 2.2.4 is classfile 69 → Java 25+. | |
| java-version: "25" | |
| - name: Cache cargo | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| pcbkit/target | |
| key: pcbkit-boardmake-${{ runner.os }}-${{ hashFiles('pcbkit/Cargo.lock', 'pcbkit/**/Cargo.toml') }} | |
| - name: Fetch Freerouting JAR | |
| run: | | |
| mkdir -p third_party/freerouting | |
| if [[ ! -f "$FREEROUTING_JAR" ]]; then | |
| curl -fsSL -o "$FREEROUTING_JAR" \ | |
| "https://github.com/freerouting/freerouting/releases/download/v${FREEROUTING_VERSION}/freerouting-${FREEROUTING_VERSION}.jar" | |
| fi | |
| ls -la "$FREEROUTING_JAR" | |
| - name: Symlink Java for pcbkit profile | |
| run: | | |
| mkdir -p third_party/java/bin | |
| ln -sfn "$JAVA_HOME/bin/java" third_party/java/bin/java | |
| third_party/java/bin/java -version | |
| - run: bun install --frozen-lockfile | |
| - name: Build pcbkit | |
| run: cargo build --release --manifest-path pcbkit/Cargo.toml -p pcbkit-cli | |
| - name: DSN freshness (placement vs Specctra) | |
| run: bun run dsn:check | |
| - name: Route board (Freerouting + USB repairs) | |
| run: bun run board:make -- --route-only | |
| - name: Upload routed (unfilled) PCB | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: board-make-routed | |
| path: | | |
| generated/kicad/v3-board-make.kicad_pcb | |
| generated/kicad/v3-board-make.kicad_pro | |
| kicad-fill-drc: | |
| needs: route | |
| runs-on: ubuntu-latest | |
| container: | |
| image: kicad/kicad:10.0 | |
| options: --user root | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Download routed PCB | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: board-make-routed | |
| path: board-make-routed | |
| - name: Stage board + fp-lib-table | |
| run: | | |
| mkdir -p generated/kicad | |
| if [[ -f board-make-routed/generated/kicad/v3-board-make.kicad_pcb ]]; then | |
| cp board-make-routed/generated/kicad/* generated/kicad/ | |
| elif [[ -f board-make-routed/kicad/v3-board-make.kicad_pcb ]]; then | |
| cp board-make-routed/kicad/* generated/kicad/ | |
| else | |
| cp board-make-routed/v3-board-make.kicad_pcb generated/kicad/ | |
| cp board-make-routed/v3-board-make.kicad_pro generated/kicad/ | |
| fi | |
| cp -f ci/artifacts/fp-lib-table generated/kicad/fp-lib-table | |
| ls -la generated/kicad | |
| - name: Zone refill + DRC | |
| working-directory: generated/kicad | |
| run: | | |
| mkdir -p ../reports | |
| # Run beside .kicad_pro + fp-lib-table so project rules / tscircuit lib load. | |
| kicad-cli pcb drc --format json --severity-error --severity-warning \ | |
| --refill-zones --save-board \ | |
| -o ../reports/v3-board-make-drc.json \ | |
| v3-board-make.kicad_pcb | |
| - name: Upload filled PCB + DRC JSON | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: board-make-filled | |
| path: | | |
| generated/kicad/v3-board-make.kicad_pcb | |
| generated/kicad/v3-board-make.kicad_pro | |
| generated/reports/v3-board-make-drc.json | |
| gate: | |
| needs: [kicad-fill-drc] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: 1.3.14 | |
| - uses: dtolnay/rust-toolchain@stable | |
| - name: Cache cargo | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| pcbkit/target | |
| key: pcbkit-boardmake-${{ runner.os }}-${{ hashFiles('pcbkit/Cargo.lock', 'pcbkit/**/Cargo.toml') }} | |
| - name: Build pcbkit | |
| run: cargo build --release --manifest-path pcbkit/Cargo.toml -p pcbkit-cli | |
| - name: Download filled board + DRC | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: board-make-filled | |
| path: board-make-out | |
| - name: Normalize artifact layout | |
| run: | | |
| # upload-artifact may strip the common `generated/` prefix. | |
| mkdir -p generated/kicad generated/reports | |
| if [[ -f board-make-out/generated/kicad/v3-board-make.kicad_pcb ]]; then | |
| cp board-make-out/generated/kicad/* generated/kicad/ | |
| cp board-make-out/generated/reports/* generated/reports/ | |
| else | |
| cp board-make-out/kicad/* generated/kicad/ | |
| cp board-make-out/reports/* generated/reports/ | |
| fi | |
| ls -la generated/kicad generated/reports | |
| - name: DRC gate (0 unconnected, 0 copper/silk errors) | |
| run: | | |
| ./pcbkit/target/release/pcbkit drc-gate \ | |
| -j generated/reports/v3-board-make-drc.json \ | |
| --max-unconnected 0 \ | |
| --max-fatal-errors 0 \ | |
| --max-type silk_edge_clearance=0 \ | |
| --max-type lib_footprint_issues=0 \ | |
| --max-type silk_over_copper=0 | |
| - run: bun install --frozen-lockfile | |
| - name: Build circuit-json for assure | |
| run: bun run build:circuit | |
| - name: Assure against freshly made board | |
| run: | | |
| ./pcbkit/target/release/pcbkit assure \ | |
| -i build/lightbar-dock.circuit.json \ | |
| --fab pcbkit/profiles/fab-jlcpcb-2layer.toml \ | |
| --golden circuit/assurance/golden-footprints.json \ | |
| --pcb generated/kicad/v3-board-make.kicad_pcb \ | |
| --skip-manifest \ | |
| --bringup circuit/assurance/bringup.toml |