Skip to content

Board make

Board make #29

Workflow file for this run

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