From ff286c5117e50a85b49cded57400566f40f55096 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 12 Nov 2026 12:43:31 +0000 Subject: [PATCH] Actions: name the runner ubuntu-26.04; Teensy check without the Node 20 action Every job asked for ubuntu-latest, and GitHub printed a notice on every run that the label moves to Ubuntu 26 (runner-images issue 14748). The jobs already run on the ubuntu-26.04 image and pass, so naming it changes nothing but the notice. The Teensy check installed the Arduino CLI with arduino/setup-arduino-cli@v2, which is built for Node 20 and has no Node 24 release: the runner warned on every build. The step now downloads Arduino CLI 1.6.0 (the version the action picked) from Arduino's GitHub release and checks it against the release's checksum file. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VKEBDEzteaXivNsJC5RyK4 --- .github/workflows/docs.yml | 2 +- .github/workflows/shared-code.yml | 2 +- .github/workflows/simulator.yml | 4 ++-- .github/workflows/teensy-firmware.yml | 16 ++++++++++++++-- Firmware/simulator/README.md | 4 ++-- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 2f61bdb..734947a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -27,7 +27,7 @@ permissions: jobs: changelog: name: changelog - runs-on: ubuntu-latest + runs-on: ubuntu-26.04 timeout-minutes: 5 steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/shared-code.yml b/.github/workflows/shared-code.yml index ce37baa..b04d0f3 100644 --- a/.github/workflows/shared-code.yml +++ b/.github/workflows/shared-code.yml @@ -29,7 +29,7 @@ permissions: jobs: blocks: name: blocks - runs-on: ubuntu-latest + runs-on: ubuntu-26.04 timeout-minutes: 5 steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/simulator.yml b/.github/workflows/simulator.yml index b74ef9e..e051533 100644 --- a/.github/workflows/simulator.yml +++ b/.github/workflows/simulator.yml @@ -41,7 +41,7 @@ env: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-26.04 timeout-minutes: 15 # a build and check take about 4 minutes; a stuck browser must not hold the queue for hours # a newer push to the same branch replaces the check of the older one; each branch has its own queue concurrency: @@ -101,7 +101,7 @@ jobs: deploy: if: github.event_name != 'pull_request' needs: build - runs-on: ubuntu-latest + runs-on: ubuntu-26.04 permissions: pages: write # to publish id-token: write # Pages checks that the publication comes from this workflow diff --git a/.github/workflows/teensy-firmware.yml b/.github/workflows/teensy-firmware.yml index cdf062b..1a2d002 100644 --- a/.github/workflows/teensy-firmware.yml +++ b/.github/workflows/teensy-firmware.yml @@ -36,12 +36,13 @@ permissions: env: ARDUINO_BOARD_MANAGER_ADDITIONAL_URLS: https://www.pjrc.com/teensy/package_teensy_index.json TEENSYDUINO: '1.58' + ARDUINO_CLI: '1.6.0' # the Arduino CLI release the build installs (the newest on 12 Nov 2026) # Tools menu as in the README: Teensy 4.1, USB type Serial, CPU 450 MHz, Optimize "Faster" FQBN: teensy:avr:teensy41:usb=serial,speed=450,opt=o2std,keys=en-us # 450 MHz since 4 Nov 2026: cooler, the loop has time to spare jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-26.04 defaults: run: shell: bash # -eo pipefail: a failed compile is not hidden by tee @@ -58,7 +59,18 @@ jobs: echo "sha=${sha::7}" >> "$GITHUB_OUTPUT" echo "Firmware folder: $dir" - - uses: arduino/setup-arduino-cli@v2 # built for Node 20 (no Node 24 release yet); the runner runs it on Node 24 and says so in a warning, which is harmless + - name: Install the Arduino CLI ${{ env.ARDUINO_CLI }} + run: | + # straight from Arduino's GitHub release, checked against its checksum file; the setup-arduino-cli action + # did this before, but it is built for Node 20 (no Node 24 release) and the runner warned on every build + base="https://github.com/arduino/arduino-cli/releases/download/v$ARDUINO_CLI" + file="arduino-cli_${ARDUINO_CLI}_Linux_64bit.tar.gz" + cd "$RUNNER_TEMP" + curl -fsSL -O "$base/$file" + curl -fsSL "$base/$ARDUINO_CLI-checksums.txt" | grep " $file\$" | sha256sum -c - + mkdir -p "$HOME/.local/bin" + tar xzf "$file" -C "$HOME/.local/bin" arduino-cli + echo "$HOME/.local/bin" >> "$GITHUB_PATH" - name: Install Teensyduino ${{ env.TEENSYDUINO }} run: | diff --git a/Firmware/simulator/README.md b/Firmware/simulator/README.md index f2b5242..a739942 100644 --- a/Firmware/simulator/README.md +++ b/Firmware/simulator/README.md @@ -29,7 +29,7 @@ One row per day, in short; the details are in the sections of this file (the lin | Date | What changed | |---|---| -| 12 Nov 2026 | **Set up AgOpenWeb from your measures** (version 1.4): tractor buttons, Renato's Maxxum 135 and Farmall 115C; an implement on the drawbar takes the chosen tractor's pin ([the page](#set-up-agopenweb-from-your-measures)). | +| 12 Nov 2026 | **Set up AgOpenWeb from your measures** (version 1.4): tractor buttons, Renato's Maxxum 135 and Farmall 115C; an implement on the drawbar takes the chosen tractor's pin ([the page](#set-up-agopenweb-from-your-measures)). [Action](#how-it-is-built) on `ubuntu-26.04`. | | 11 Nov 2026 | `build.py` leaves the pages' own build date (`PAGE_BUILT`) empty, so the pages' new "is this the running firmware's page" check stays off here. The pretend Keya reports its current in amps, the kickout sensor. | | 10 Nov 2026 | Teensy page: the pretend UM982 reports its temperature (59 °C, from `HWSTATUSA`) and the module's name on the network reads `AiO-3F2A`, as the firmware now does. | | 9 Nov 2026 | **Set up AgOpenWeb from your measures** 1.3: front corner, drawbar at the tyre, turns by headland, reasons ([the page](#set-up-agopenweb-from-your-measures)). Seed drill: 19 sections offline; short start page. [Action](#how-it-is-built) on Node 24. Check: pages in a web card's frame ([How it is built](#how-it-is-built)). | @@ -45,7 +45,7 @@ One row per day, in short; the details are in the sections of this file (the lin ## How it is built -`build.py` cuts the pages out of the newest `Firmware/vX.Y_AiO_WEB` folder, `Seeder/Seeder_ESP32` and `Sprayer/Sprayer_ESP32` exactly as the firmware serves them and puts the simulator scripts in their `` (a module page also gets its implement, `window.SIM_IMPL`). The scripts answer the page's `/api/...` requests (and the firmware upload) instead of the module, so the page's own JavaScript is not changed: what you see is the page as it is in the firmware. The GitHub Action `.github/workflows/simulator.yml` runs on every change under `Firmware/`, `Seeder/Seeder_ESP32/` or `Sprayer/Sprayer_ESP32/`, opens every tab in a browser as a check (`smoke-test.js`), and publishes the result on GitHub Pages when the change reaches `main`. A pull request only builds and checks: the simulator shows the merged firmware. Since 9 Nov 2026 it uses the versions of GitHub's own actions that run on Node 24 (`checkout@v7`, `setup-node@v7`, `upload-artifact@v7`, `upload-pages-artifact@v5`, `deploy-pages@v5`): the runners now run every action on Node 24 and warn about one built for Node 20. +`build.py` cuts the pages out of the newest `Firmware/vX.Y_AiO_WEB` folder, `Seeder/Seeder_ESP32` and `Sprayer/Sprayer_ESP32` exactly as the firmware serves them and puts the simulator scripts in their `` (a module page also gets its implement, `window.SIM_IMPL`). The scripts answer the page's `/api/...` requests (and the firmware upload) instead of the module, so the page's own JavaScript is not changed: what you see is the page as it is in the firmware. The GitHub Action `.github/workflows/simulator.yml` runs on every change under `Firmware/`, `Seeder/Seeder_ESP32/` or `Sprayer/Sprayer_ESP32/`, opens every tab in a browser as a check (`smoke-test.js`), and publishes the result on GitHub Pages when the change reaches `main`. A pull request only builds and checks: the simulator shows the merged firmware. Since 9 Nov 2026 it uses the versions of GitHub's own actions that run on Node 24 (`checkout@v7`, `setup-node@v7`, `upload-artifact@v7`, `upload-pages-artifact@v5`, `deploy-pages@v5`): the runners now run every action on Node 24 and warn about one built for Node 20. Since 12 Nov 2026 every job of the repository's Actions names its runner, `ubuntu-26.04`, instead of `ubuntu-latest`, which GitHub moved to Ubuntu 26.04 that autumn with a notice on every run. `build.py` also writes `firmware.json` at the top of the site: the Teensy `.hex` and the two XIAO `.bin` files of the newest version folder, each with the date and time it was compiled, read from the file itself (the `__DATE__ __TIME__` text every program carries). The Teensy page and the XIAO page fetch it from `https://renatorgr.github.io/Boards/firmware.json` for **Install from GitHub**, so a new build of the same version shows as new once its file is on `main` and the site is published again. The pretend Teensy and XIAO run those same builds. It also has the sprayer module's `Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.bin` (`"sprayer"`): its version, board and build date, read from the text its `/api/status` answer starts with, for the sprayer page's **Firmware** tab; the pretend sprayer module runs that build. The same for the seed drill module's `Seeder/Seeder_ESP32/Seeder_ESP32.ino.bin` (`"seeder"`), once that file is on `main`.