Replace every remaining reference to the old Gitea infrastructure with the new GitHub-hosted equivalents across all documentation, wiki pages, test files, and historical ticket summaries. - README.md: CI badge, clone URL, releases link, CI/CD section, project structure - docs/wiki/CICD-Pipeline.md: full rewrite for GitHub Actions + ghcr.io - docs/wiki/Home.md: CI badge, releases link, phase status, tech stack - docs/wiki/Troubleshooting.md: rewrite CI troubleshooting for GitHub Actions - docs/architecture/README.md: update CI/CD pipeline diagram - AGENTS.md: CI/CD section, environment references - PLAN.md: directory structure, pipeline table - SECURITY_AUDIT.md: mark C3 and L4 findings as resolved - ticket-git-cliff-changelog.md: workflow path updated - tickets/ci-runner-speed-optimization.md: image registry updated - 2026-hackathon_AgenticFeature.md: workflow path updated - tests: workflow path assertions updated in all three test files
5.7 KiB
CI Runner Speed Optimization via Pre-baked Images + Caching
Description
Every CI run (both test.yml and auto-tag.yml) was installing system packages from scratch
on each job invocation: apt-get update, Tauri system libs, Node.js via nodesource, and in
the arm64 job — a full rustup install. This was the primary cause of slow builds.
The repository already contains pre-baked builder Docker images (.docker/Dockerfile.*) and a
build-images.yml workflow to push them to ghcr.io/msicie/.
These images were never referenced by the actual CI jobs — a critical gap. This work closes
that gap and adds actions/cache@v3 for Cargo and npm.
Acceptance Criteria
Dockerfile.linux-amd64includesrustfmtandclippycomponentsDockerfile.linux-arm64includesrustfmtandclippycomponentstest.ymlRust jobs useghcr.io/msicie/trcaa-linux-amd64:rust1.88-node22test.ymlRust jobs have no inlineapt-getorrustup component addstepstest.ymlRust jobs includeactions/cache@v3for~/.cargo/registrytest.ymlfrontend jobs includeactions/cache@v3for~/.npmauto-tag.ymlbuild-linux-amd64uses pre-bakedtrcaa-linux-amd64imageauto-tag.ymlbuild-windows-amd64uses pre-bakedtrcaa-windows-crossimageauto-tag.ymlbuild-linux-arm64uses pre-bakedtrcaa-linux-arm64image- All three build jobs have no
Install dependenciesstep - All three build jobs include
actions/cache@v3for Cargo and npm docs/wiki/CICD-Pipeline.mddocuments pre-baked images, cache keys, and server prerequisitesbuild-images.ymltriggered manually before merging to ensure images exist in registry
Work Implemented
.docker/Dockerfile.linux-amd64
Added RUN rustup component add rustfmt clippy after the existing target add line.
The rust-fmt-check and rust-clippy CI jobs now rely on these being pre-installed
in the image rather than installing them at job runtime.
.docker/Dockerfile.linux-arm64
Added && /root/.cargo/bin/rustup component add rustfmt clippy appended to the
existing rustup installation RUN command (chained with && to keep it one layer).
.github/workflows/test.yml
- rust-test (fmt + clippy + tests): switched container image from
rust:1.88-slim→ghcr.io/msicie/trcaa-linux-amd64:rust1.88-node22. Removedapt-get install gitfrom Checkout steps (git is pre-installed in image). Removedapt-get install libwebkit2gtk-...steps. Removedrustup component add rustfmtandrustup component add clippysteps. Addedactions/cache@v3step for~/.cargo/registry/index,~/.cargo/registry/cache,~/.cargo/git/dbkeyed onCargo.lockhash. - frontend-typecheck, frontend-tests: kept
node:22-alpineimage (no change needed). Addedactions/cache@v3step for~/.npmkeyed onpackage-lock.jsonhash.
.github/workflows/release.yml
- build-linux-amd64: image
rust:1.88-slim→ghcr.io/msicie/trcaa-linux-amd64:rust1.88-node22. Removed Checkout apt-get install git, removed entire Install dependencies step. Removedrustup target add x86_64-unknown-linux-gnufrom Build step. Added cargo + npm cache. - build-windows-amd64: image
rust:1.88-slim→ghcr.io/msicie/trcaa-windows-cross:rust1.88-node22. Removed Checkout apt-get install git, removed entire Install dependencies step. Removedrustup target add x86_64-pc-windows-gnufrom Build step. Added cargo (with-windows-suffix key to avoid collision) + npm cache. - build-linux-arm64: image
ubuntu:22.04→ghcr.io/msicie/trcaa-linux-arm64:rust1.88-node22. Removed Checkout apt-get install git, removed entire Install dependencies step (~40 lines). Removed. "$HOME/.cargo/env"(PATH already set viaENVin Dockerfile). Removedrustup target add aarch64-unknown-linux-gnufrom Build step. Added cargo (with-arm64-suffix key) + npm cache.
docs/wiki/CICD-Pipeline.md
Added two new sections before the Test Pipeline section:
- Pre-baked Builder Images: table of all three images and their contents, rebuild triggers, how-to-rebuild instructions, and the insecure-registries Docker daemon prerequisite for ghcr.io access.
- Cargo and npm Caching: documents the
actions/cache@v3key patterns in use, including the per-platform cache key suffixes for cross-compile jobs. Updated the Test Pipeline section to reference the correct pre-baked image name. Updated the Release Pipeline job table to show which image each build job uses.
Testing Needed
-
Pre-build images (prerequisite): Trigger
build-images.ymlvia Actions → Build CI Docker Images → Run workflow. Confirm all 3 images are pushed and visible atghcr.io/msicie/. -
PR test suite: Open a PR with these changes. Verify:
rust-testandfrontend-testjobs pass- Job logs show no
apt-getorrustup component addoutput - Cache hit messages appear on second run
-
Release build: Merge to
main. Verifyrelease.ymlruns and:- All build jobs start without Install dependencies step
- Artifacts are produced and uploaded to the GitHub Release
- Total release time is significantly reduced (~7 min vs ~25 min before)
-
Expected time savings after caching warms up:
Job Before After rust-fmt-check ~2 min ~20 sec rust-clippy ~4 min ~45 sec rust-tests ~5 min ~1.5 min frontend-typecheck ~2 min ~30 sec frontend-tests ~3 min ~40 sec build-linux-amd64 ~10 min ~3 min build-windows-amd64 ~12 min ~4 min build-linux-arm64 ~15 min ~4 min PR test total (parallel) ~5 min ~1.5 min Release total ~25 min ~7 min