Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
6bd5f1e
throwaway: exercise design -> dev pipeline (safe to delete)
Jul 18, 2026
571d8ba
Merge branch 'dev' into design
ringof Jul 18, 2026
7bebec0
Merge branch 'dev' into design
ringof Jul 18, 2026
b480fe3
Bring over ringof/dev (tranche 2, stage 1): design, library, 3D, boar…
Jul 26, 2026
255bd36
Bring over ringof/dev (tranche 2, stage 2): mechanical enclosure + 3D…
Jul 26, 2026
d5065f9
run_checks: hard-fail the 3D-model check regardless of ENFORCE
Jul 26, 2026
c99de62
Improved 3D viewer (#59)
ringof Jul 28, 2026
f355102
fix BAV99 value, TIS exclude from BOM
Jul 29, 2026
ae42987
open ERC/DRC to lower severity reporting
Jul 29, 2026
b5383a3
update CI output on severity reporting
Jul 29, 2026
93892c4
Reconcile library/schematic/board drift (ERC/DRC clean at full severity)
Jul 29, 2026
921b073
fix orientation error for J1-J4
Jul 29, 2026
d33392b
Add JLCPCB 6-layer DRC rules; refill zones in dev-checks
Jul 30, 2026
6fe387c
Nudge different-net vias to meet JLC 0.5mm hole-to-hole
Jul 30, 2026
291d4ff
Fix SC-70-6 mask slivers; min-web 0.1mm; error-clean DRC
Jul 30, 2026
3033a14
interim silkscreen warning-level DRC violations cleanup
Jul 31, 2026
fe44b41
interim silkscreen warning-level DRC violations cleanup pt. 2
Jul 31, 2026
cc221a1
interim commit detailed silk/footprint clearance rules, beginning of …
Aug 2, 2026
0897bdb
enable missing courtyard as 'warning' AND set logos as exempt from co…
Aug 2, 2026
cbb070e
fix U19 3D model alignment
Aug 2, 2026
0142fa6
fix X1 3D model alignment
Aug 2, 2026
34548ce
fix D1 3D model alignment
Aug 2, 2026
70e3f5f
fix D3 3D model alignment
Aug 2, 2026
3e74bff
1-6 uVia to std via transition pt 2
Aug 2, 2026
aff50e8
refdes and silk cleanup, now produces a zero ERC/DRC error, zero DRC …
Aug 2, 2026
ee02552
last cleanup of refdes, addition of USB3, USB2 net classes for DRC ch…
Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 152 additions & 17 deletions .github/workflows/dev-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,26 @@ name: dev-release
#
# Runs on every merge to dev. Publishes/refreshes a GitHub *pre-release* only
# when a design file changed since the last pre-release; docs/CI/script-only
# merges are a no-op. Mirrors main-release, with three differences:
# - reads/bumps the latest v0.x PRE-release (0.6 -> 0.7), first run seeds v0.6
# merges are a no-op. Mirrors main-release, with two differences:
# - bumps the minor within the current major line (0.6 -> 0.7; after a main
# X.0, continues X.1 -> X.2 -> ...), first run seeds v0.6
# - publishes with --prerelease
# - RETIRES itself: once a stable v1.0+ release exists, the 0.x phase is over
# and this lane no-ops. (Revisit the post-1.0 dev pre-release scheme then.)
#
# GIT_HASH is stamped from the last commit that touched a design file. Provenance
# is injected at build time only. See docs/RELEASE_STRATEGY.md.
# The dev v0.x pre-release is a COMBINED snapshot: it folds in the board fab
# package, BOTH end-plate fab packages, and the mechanical assembly (STEP +
# coloured GLB + viewer), and deploys the live GitHub Pages viewer. "Design
# changed" therefore spans the board, the end plates, AND the mechanical inputs
# -- any of them cuts/refreshes the snapshot. (On main the plates keep their
# INDEPENDENT endplates-vX.Y lane in endplate-release.yml; only the dev snapshot
# is combined.) See docs/RELEASE_STRATEGY.md.
#
# Dispatch with dry_run=true to build the package as run artifacts without
# Provenance is injected at build time only: GIT_HASH stamps the board package
# from the last board-design commit, and EP_GIT_HASH stamps the plates from the
# last end-plate-design commit, so each sub-package names the commit that defines
# it. The plates are stamped with the board's v0.x so their filenames/frames
# match the snapshot.
#
# Dispatch with dry_run=true to build the packages as run artifacts without
# publishing; with version=0.7 to force a specific pre-release number.

on:
Expand Down Expand Up @@ -44,6 +54,7 @@ jobs:
outputs:
revision: ${{ steps.rev.outputs.revision }}
githash: ${{ steps.rev.outputs.githash }}
ep_githash: ${{ steps.rev.outputs.ep_githash }}
publish: ${{ steps.rev.outputs.publish }}
build: ${{ steps.rev.outputs.build }}
steps:
Expand All @@ -59,9 +70,29 @@ jobs:
DRY_RUN: ${{ github.event.inputs.dry_run }}
run: |
set -euo pipefail
DESIGN=('*.kicad_sch' '*.kicad_pcb' '*.kicad_pro' '*.kicad_dru'
'*.kicad_sym' 'Library.pretty/' 'fp-lib-table' 'sym-lib-table')
githash=$(git log -1 --format=%h -- "${DESIGN[@]}")
# Root board files -- scoped to the main TAPRX-888 board. A bare glob
# like '*.kicad_pcb' is a git pathspec that matches at ANY depth
# (mechanical/**/x.kicad_pcb), so we list the root files explicitly.
BOARD=('TAPRX-888.kicad_sch' 'Front_End.kicad_sch' 'refclk.kicad_sch'
'TAPRX-888.kicad_pcb' 'TAPRX-888.kicad_pro' 'TAPRX-888.kicad_dru'
'Library.kicad_sym' 'Library.pretty/' 'fp-lib-table' 'sym-lib-table')
# End-plate design files (same set endplate-release.yml keys off).
ENDPLATE=('mechanical/endplate-front/' 'mechanical/endplate-rear/'
'TAPR.kicad_wks')
# Mechanical-assembly inputs (enclosure/hardware + the assembler
# scripts). The end-plate dirs are already under mechanical/, so this
# broader 'mechanical/' entry also covers them.
MECH=('mechanical/' '3d/' 'TAPR.kicad_wks'
'scripts/assemble_mechanical.py' 'scripts/assemble_glb.py'
'scripts/make_3d_viewer.py' 'scripts/build_endplates.sh')
# The v0.x snapshot is combined, so ANY of board/endplate/mechanical
# changing cuts or refreshes it.
TRIGGER=("${BOARD[@]}" "${MECH[@]}")

# Per-sub-package provenance: board stamped from the last board-design
# commit, plates from the last end-plate-design commit.
githash=$(git log -1 --format=%h -- "${BOARD[@]}")
ep_githash=$(git log -1 --format=%h -- "${ENDPLATE[@]}")

# All releases, newest-first: "<tag> <isPrerelease>". Feeds the shared
# version policy in scripts/next_version.sh (docs/RELEASE_STRATEGY.md).
Expand All @@ -82,11 +113,14 @@ jobs:
reason="No prior release -> seed v$revision (pre-release)"
else
base=$(git rev-list -1 "$latest_tag")
changed=$(git diff --name-only "$base"..HEAD -- "${DESIGN[@]}" || true)
# Exclude markdown: a docs edit under mechanical/ or 3d/ (e.g. a
# README) must NOT cut a pre-release. The MECH prefixes above match
# those dirs broadly, so drop *.md from the change set.
changed=$(git diff --name-only "$base"..HEAD -- "${TRIGGER[@]}" ':(exclude)*.md' || true)
if [ -n "$changed" ]; then
revision=$(printf '%s' "$releases" | bash scripts/next_version.sh dev)
publish=true
reason="Design changed since $latest_tag -> v$revision (pre-release)"
reason="Design (board/endplate/mechanical) changed since $latest_tag -> v$revision (pre-release)"
else
revision="${latest_tag#v}"; publish=false
reason="No design change since $latest_tag -> no new pre-release (docs / CI-only merge)"
Expand All @@ -103,6 +137,7 @@ jobs:
{
echo "revision=$revision"
echo "githash=$githash"
echo "ep_githash=$ep_githash"
echo "publish=$publish"
echo "build=$build"
} >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -137,35 +172,97 @@ jobs:
name: release-package
path: out/

# End-plate fab packages, folded into the SAME v0.x snapshot. Stamped with the
# board's v0.x (EPREVISION) so filenames/frames match, and with the end-plate
# design commit (EP_GIT_HASH) for accurate provenance.
build-endplates:
needs: prepare
if: needs.prepare.outputs.build == 'true'
runs-on: ubuntu-latest
container:
image: ghcr.io/inti-cmnb/kicad10_auto:1.9.0-6_k10.0.4_d13.2
options: --user root
env:
HOME: /root
EPREVISION: ${{ needs.prepare.outputs.revision }}
GIT_HASH: ${{ needs.prepare.outputs.ep_githash }}
steps:
- uses: actions/checkout@v6
- name: Build end-plate packages
run: |
chmod +x scripts/build_endplates.sh
scripts/build_endplates.sh
- uses: actions/upload-artifact@v6
with:
name: endplate-packages
path: out/

# Mechanical assembly (STEP + coloured GLB + viewer) via the shared reusable
# build. Uploads `mechanical-assembly` into this run.
mechanical:
needs: prepare
if: needs.prepare.outputs.build == 'true'
uses: ./.github/workflows/mechanical-build.yml

release:
needs: [prepare, build]
needs: [prepare, build, build-endplates, mechanical]
if: needs.prepare.outputs.publish == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v8
with:
name: release-package
path: out
- uses: actions/download-artifact@v8
with:
name: endplate-packages
path: ep
- uses: actions/download-artifact@v8
with:
name: mechanical-assembly
path: mech
- name: Package release assets
env:
REV: ${{ needs.prepare.outputs.revision }}
run: |
set -euo pipefail
# Version-stamped asset names (see docs/RELEASE_STRATEGY.md).
# --- board (version-stamped names; see docs/RELEASE_STRATEGY.md) ------
cp "out/docs/TAPRX-888-v${REV}-schematic.pdf" "TAPRX-888-v${REV}-schematic.pdf"
cp "out/docs/TAPRX-888-v${REV}-assembly.pdf" "TAPRX-888-v${REV}-assembly.pdf"
( cd out/JLCPCB/gerbers && zip -qr "../../../TAPRX-888-v${REV}-gerbers.zip" . )
# Board-only fabrication zip -- built BEFORE the plate/mechanical assets
# land at top level so it keeps its board-only meaning.
( cd out && zip -qr "../TAPRX-888-v${REV}-fabrication.zip" . )
# --- end plates (already named v${REV}: EPREVISION == board REV) ------
cp "ep/endplate-front-v${REV}-gerbers.zip" "ep/endplate-rear-v${REV}-gerbers.zip" .
cp "ep/endplate-front-v${REV}-fab.pdf" "ep/endplate-rear-v${REV}-fab.pdf" .
# --- mechanical assembly (rename to the versioned snapshot names) -----
cp "mech/TAPRX-888-mechanical-assembly.step" "TAPRX-888-v${REV}-mechanical-assembly.step"
cp "mech/TAPRX-888-mechanical-assembly.glb" "TAPRX-888-v${REV}-mechanical-assembly.glb"
cp "mech/TAPRX-888-mechanical-viewer.html" "TAPRX-888-v${REV}-mechanical-viewer.html"
ls -la
- name: Publish GitHub pre-release
env:
GH_TOKEN: ${{ github.token }}
REV: ${{ needs.prepare.outputs.revision }}
SHA: ${{ needs.prepare.outputs.githash }}
EPSHA: ${{ needs.prepare.outputs.ep_githash }}
run: |
set -euo pipefail
FILES=("TAPRX-888-v${REV}-fabrication.zip" "TAPRX-888-v${REV}-gerbers.zip" "TAPRX-888-v${REV}-schematic.pdf" "TAPRX-888-v${REV}-assembly.pdf")
NOTES="Pre-release fabrication and design package for v${REV} (design commit ${SHA}). Auto-generated by dev-release CI."
FILES=(
"TAPRX-888-v${REV}-fabrication.zip"
"TAPRX-888-v${REV}-gerbers.zip"
"TAPRX-888-v${REV}-schematic.pdf"
"TAPRX-888-v${REV}-assembly.pdf"
"endplate-front-v${REV}-gerbers.zip"
"endplate-rear-v${REV}-gerbers.zip"
"endplate-front-v${REV}-fab.pdf"
"endplate-rear-v${REV}-fab.pdf"
"TAPRX-888-v${REV}-mechanical-assembly.step"
"TAPRX-888-v${REV}-mechanical-assembly.glb"
"TAPRX-888-v${REV}-mechanical-viewer.html"
)
NOTES="Combined pre-release snapshot for v${REV}: board (design commit ${SHA}), end plates (design commit ${EPSHA}), and the mechanical assembly. Auto-generated by dev-release CI."
if gh release view "v${REV}" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then
gh release upload "v${REV}" "${FILES[@]}" --repo "$GITHUB_REPOSITORY" --clobber
gh release edit "v${REV}" --repo "$GITHUB_REPOSITORY" --prerelease \
Expand All @@ -176,7 +273,7 @@ jobs:
--title "v${REV} (pre-release)" --notes "$NOTES"
fi

# Self-cleaning: drop any assets not in the current stable set.
# Self-cleaning: drop any assets not in the current snapshot set.
keep=" ${FILES[*]} "
gh release view "v${REV}" --repo "$GITHUB_REPOSITORY" --json assets --jq '.assets[].name' \
| while read -r a; do
Expand All @@ -187,3 +284,41 @@ jobs:
gh release delete-asset "v${REV}" "$a" --yes --repo "$GITHUB_REPOSITORY" ;;
esac
done

# Deploy the live viewer to GitHub Pages (https://tapr.github.io/TAPRx888/).
# Only on an actual publish -- a dispatch dry-run builds artifacts but must not
# move the live site. Shares the `pages` concurrency group with mechanical-ci
# so the design/dev-* lane and this dev lane never deploy on top of each other.
pages:
needs: [prepare, mechanical]
if: needs.prepare.outputs.publish == 'true'
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
contents: read
concurrency:
group: pages
cancel-in-progress: false
environment:
name: github-pages
url: ${{ steps.deploy.outputs.page_url }}
steps:
- uses: actions/download-artifact@v8
with:
name: mechanical-assembly
path: dl
- name: Lay out the Pages site (viewer as index.html)
run: |
set -euxo pipefail
mkdir -p site
cp dl/TAPRX-888-mechanical-viewer.html site/index.html
ls -la site
- uses: actions/configure-pages@v5
with:
enablement: true
- uses: actions/upload-pages-artifact@v3
with:
path: site
- id: deploy
uses: actions/deploy-pages@v4
Loading
Loading