commit 00ddaeba1331a36a092a9df41557966d66ac3579 Author: grabowski Date: Thu Oct 15 16:25:47 2026 +0700 kicad10_auto_node: KiBot KiCad 10 image with Node.js for Gitea Actions Base ghcr.io/inti-cmnb/kicad10_auto_full:1.9.1-1_k10.0.5 (KiBot 1.9.1, KiCad 10.0.5) plus Node.js 24.22.0 LTS from nodejs.org (SHA-256 checked). act_runner runs JavaScript actions inside the job container; the KiBot images have no Node. build.sh builds, tests and pushes git.b4l.co.th/b4l/kicad10_auto_node:latest and a versioned tag. diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/README.md b/README.md new file mode 100644 index 0000000..c0810ca --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# CI images for B4L Gitea Actions + +Images the B4L runners use, published in the Gitea container registry of the +B4L organisation (public, so runners pull them without a login). + +## kicad10_auto_node + +KiBot's KiCad 10 image (`ghcr.io/inti-cmnb/kicad10_auto_full`) with Node.js +added. Gitea's act_runner runs JavaScript actions such as `actions/checkout` +inside the job container, and the KiBot images have no Node. + +| | | +|---|---| +| Image | `git.b4l.co.th/b4l/kicad10_auto_node:latest` | +| Versioned tag | `_k_node`, e.g. `1.9.1-1_k10.0.5_node24.22.0` | +| Contents | KiBot 1.9.1, KiCad 10.0.5, Debian 13, Node.js 24 LTS with npm | +| Used by | runner label `kicad10_auto` (product template, LVSolarBuck, harNES) | + +### Runner + +In the runner's `config.yaml` (or its registration labels): + +```yaml +runner: + labels: + - "kicad10_auto:docker://git.b4l.co.th/b4l/kicad10_auto_node:latest" +``` + +Restart the runner after changing labels. With the full registry name the +runner pulls the image whenever it is missing, so a `docker image prune` no +longer breaks the jobs. `container.force_pull: true` (act_runner's default) is +fine: with the layers cached, a pull only compares the manifest. + +### Build and publish + +```bash +docker login git.b4l.co.th # once; a token with write:package +./build.sh # build and test +./build.sh --push # build, test, push :latest and the versioned tag +``` + +For a newer KiBot or Node, set `BASE` and/or `NODE_VERSION`: + +```bash +BASE=ghcr.io/inti-cmnb/kicad10_auto_full: NODE_VERSION= ./build.sh --push +``` + +Base tags: https://github.com/INTI-CMNB/kicad_auto_full/pkgs/container/kicad10_auto_full ; +Node LTS: https://nodejs.org/dist/index.json . + +### Not included + +`typecad-docgen`, which the docgen workflows call: the npm package +`@typecad/typecad-docgen` is no longer published (checked 2026-10-15). +Once a replacement is chosen, add it with `NPM_GLOBAL="" ./build.sh --push`. diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..1c5d968 --- /dev/null +++ b/build.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Build, test and (with --push) publish kicad10_auto_node. +# ./build.sh build and test +# ./build.sh --push also push :latest and the versioned tag +# Newer base or Node: BASE=ghcr.io/inti-cmnb/kicad10_auto_full: NODE_VERSION= ./build.sh --push +# Needs `docker login git.b4l.co.th` (a token with write:package) for --push. +set -euo pipefail +cd "$(dirname "$0")" + +BASE=${BASE:-ghcr.io/inti-cmnb/kicad10_auto_full:1.9.1-1_k10.0.5_d13.2_b4.2.4LTS} +NODE_VERSION=${NODE_VERSION:-24.22.0} +REPO=${REPO:-git.b4l.co.th/b4l/kicad10_auto_node} +# KiBot 1.9.1-1, KiCad 10.0.5 -> 1.9.1-1_k10.0.5_node24.22.0 +basetag=${BASE##*:} +TAG="$(printf '%s' "$basetag" | sed -E 's/^([^_]+_k[^_]+).*/\1/')_node${NODE_VERSION}" + +docker build --pull \ + --build-arg BASE="$BASE" --build-arg NODE_VERSION="$NODE_VERSION" \ + --build-arg NPM_GLOBAL="${NPM_GLOBAL:-}" \ + -t "$REPO:$TAG" -t "$REPO:latest" kicad10_auto_node + +echo "== test $REPO:$TAG" +docker run --rm "$REPO:$TAG" bash -ec ' + test "$(node --version)" = "v'"$NODE_VERSION"'" + node -e "require(\"https\"); require(\"child_process\"); console.log(\"node\", process.version)" + npm --version >/dev/null + kibot --version | head -1 + echo "kicad-cli $(kicad-cli --version)" + git --version; python3 --version' + +if [ "${1:-}" = "--push" ]; then + docker push "$REPO:$TAG" + docker push "$REPO:latest" + echo "pushed $REPO:$TAG and :latest" +fi diff --git a/kicad10_auto_node/Dockerfile b/kicad10_auto_node/Dockerfile new file mode 100644 index 0000000..41453a8 --- /dev/null +++ b/kicad10_auto_node/Dockerfile @@ -0,0 +1,36 @@ +# KiBot's KiCad 10 image plus Node.js, for Gitea Actions. +# +# act_runner runs JavaScript actions (actions/checkout, upload-artifact) inside +# the job container, and the KiBot images have no Node. The runner label is +# kicad10_auto:docker://git.b4l.co.th/b4l/kicad10_auto_node:latest +# so a runner without the image pulls it, instead of every job installing Node. +# +# Build and push with ../build.sh (see ../README.md). + +ARG BASE=ghcr.io/inti-cmnb/kicad10_auto_full:1.9.1-1_k10.0.5_d13.2_b4.2.4LTS +FROM ${BASE} + +ARG BASE +ARG NODE_VERSION=24.22.0 +# Extra global npm packages, space separated (none by default). +ARG NPM_GLOBAL="" + +# Node.js from nodejs.org, checked against the release's SHA-256 list. +# The base image has no xz, so use the .tar.gz build. +RUN set -eux; \ + file="node-v${NODE_VERSION}-linux-x64.tar.gz"; \ + cd /tmp; \ + curl -fsSLO "https://nodejs.org/dist/v${NODE_VERSION}/${file}"; \ + curl -fsSLO "https://nodejs.org/dist/v${NODE_VERSION}/SHASUMS256.txt"; \ + grep " ${file}\$" SHASUMS256.txt | sha256sum -c -; \ + tar -xzf "${file}" -C /usr/local --strip-components=1 --no-same-owner \ + --exclude='*/CHANGELOG.md' --exclude='*/README.md' --exclude='*/LICENSE'; \ + rm -f "${file}" SHASUMS256.txt; \ + if [ -n "${NPM_GLOBAL}" ]; then npm install -g --no-fund --no-audit ${NPM_GLOBAL}; fi; \ + npm cache clean --force; \ + node --version; npm --version + +LABEL org.opencontainers.image.title="kicad10_auto_node" \ + org.opencontainers.image.description="KiBot KiCad 10 image with Node.js for Gitea Actions" \ + org.opencontainers.image.source="https://git.b4l.co.th/B4L/ci-images" \ + org.opencontainers.image.base.name="${BASE}"