Repository navigation
Add GitHub CI on native amd64 + arm64 and move to Python 3.14 - #1
Merged
Merged
Conversation
CI (.github/workflows/ci.yml), on push to main, PRs and manual runs: - test (amd64, arm64): hash-locked install, ruff format/lint, mypy --strict, pytest with a 90% branch-coverage floor - docker (amd64, arm64): native buildx build with GHA layer cache, smoke run hardened like compose (read-only, cap-drop ALL, no-new-privileges; must exit 2 with "config error"), non-root UID check, compose file validation - least-privilege token (contents: read), SHA-pinned actions, no persisted checkout credentials, per-ref concurrency, job timeouts Uses GitHub's free arm64 runners for public repos (ubuntu-24.04-arm), so arm64 is built and tested natively instead of under QEMU. Python 3.14 everywhere so what is tested is what ships: image pinned to python:3.14.7-slim-trixie, lock regenerated for 3.14 (all 17 Linux wheels verified for cp314 on both arches), ruff/mypy targets bumped. ruff's py314 formatter applies PEP 758 unparenthesized except in the webhook handler. Dependabot: weekly grouped action SHA bumps and Python patch-only base image bumps. pip stays manual (hash-locked uv output). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
CI (
.github/workflows/ci.yml) runs on pushes tomain, pull requests and manual runs. Each job runs on native amd64 (ubuntu-24.04) and arm64 (ubuntu-24.04-arm) runners.testruff format --check,ruff check,mypy --strict, pytest with a 90% branch-coverage floor (currently 93.7%)dockerdocker-compose.yml(--read-only --cap-drop ALL --security-opt no-new-privileges) that must exit2withconfig error, a check that the container runs as UID10001, anddocker compose configvalidationpermissions: contents: read, every action pinned to a full commit SHA (tag in a comment),persist-credentials: false, per-ref concurrency (superseded PR runs are cancelled), and job timeouts..github/dependabot.yml): weekly grouped bumps for the pinned actions, plus patch-only bumps for the Python base image.Python 3.14 everywhere, so the version CI tests is the version the image ships:
Dockerfilepinned topython:3.14.7-slim-trixie, currently the same image aspython:3.14-slim(digest51dafde81dbd);requirements.txtregenerated for 3.14.audioop-ltsis now unconditional andtyping-extensionsis gone;requires-python = ">=3.14", and ruff/mypy now target 3.14.Why
The image had never been built: there was no Docker runtime on the dev machine. This PR's CI run is the first real build and smoke test of the image, on both architectures. GitHub's standard arm64 Linux runners are free for public repositories (runner docs source), so arm64 builds and tests run natively instead of under QEMU emulation.
Notes for the reviewer
bot/webhooks/server.py: the only code change. With targetpy314,ruff formatrewritesexcept (A, B):to the PEP 758 formexcept A, B:. They mean the same thing, andtest_rejects_bad_json_unknown_format_and_huge_bodycovers that line.uv pip compileoutput; regenerating it is documented in the README.mypy --strictclean;actionlint1.7.12 with ShellCheck 0.11.0: 0 issues;cp314Linux wheel for amd64 and aarch64 (17 each);docker build. This PR's CI run is that check.README badges (
05b4c9e): CI (tracksmain), top language, Docker, Discord, last commit and license. Each badge links somewhere relevant, and the brand colours come from Simple Icons.🤖 Generated with Claude Code