Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
0bd4bc6
ci: add self-hosted Linux runner (Docker) and an opt-in smoke-test wo…
Yaraslaut Aug 24, 2026
b2fd4ac
ci: document self-hosted runner setup, including on a fresh cloud VM
Yaraslaut Aug 24, 2026
9d6db9f
ci: route linux-compilers to the self-hosted runner when one is idle
Yaraslaut Aug 24, 2026
e4997d7
docs: note the second (Hetzner) runner and ci.yml's probe integration
Yaraslaut Aug 24, 2026
ab971fe
runner: make /usr/local/bin writable by the runner user
Yaraslaut Aug 24, 2026
213dec3
runner: install cmake, python3, perl, binutils, build-essential
Yaraslaut Aug 24, 2026
6095bc3
ci: route linux-sanitizers (asan/tsan/ubsan) and linux-all-features t…
Yaraslaut Aug 24, 2026
462d5bc
runner: bake in a modern libstdc++ so clang-only legs don't need gcc …
Yaraslaut Aug 24, 2026
e30f045
runner: pin a Kitware-release CMake instead of apt's 3.28.3
Yaraslaut Aug 24, 2026
86cc076
docs: reflect that the Hetzner runner was torn down; drop the smoke-t…
Yaraslaut Aug 24, 2026
1ded5a0
cmake: sync CompileCache.cmake from fastcached (adds auto-install)
Yaraslaut Aug 24, 2026
35bc559
ci: wire fastcache-cc into the self-hosted compiler-cache jobs
Yaraslaut Aug 24, 2026
54bf004
docs: document the 4-runner CPU-limited setup and fastcache-cc wiring
Yaraslaut Aug 24, 2026
59e4fbe
ci: fix FASTCACHE_AUTO_INSTALL not reaching CMake as an env var
Yaraslaut Aug 24, 2026
408675c
ci: skip sccache install entirely on the self-hosted path
Yaraslaut Aug 24, 2026
3963cef
runner: wipe /usr/local/bin/sccache on container start
Yaraslaut Aug 24, 2026
90c75e3
ci: extend self-hosted+fastcache-cc to the ladder jobs; fix clang-tid…
Yaraslaut Aug 24, 2026
86d4d1d
runner: survive a Docker Desktop/host restart without looping
Yaraslaut Aug 24, 2026
898f1e3
ci: install libsqlite3-dev for ladder-tests
Yaraslaut Aug 24, 2026
57c25cd
runner: add bootstrap-cloud-node.sh for a fastcached + runner cloud VM
Yaraslaut Aug 24, 2026
0992016
runner: pass --metrics to fastcached in bootstrap-cloud-node.sh
Yaraslaut Aug 24, 2026
f3d65c2
docs: reflect the Hetzner box as a permanent second host
Yaraslaut Aug 24, 2026
17c7635
cmake: re-sync CompileCache.cmake from fastcached
Yaraslaut Sep 1, 2026
9a60269
runner: document the Linux workstation host, and the cache version match
Yaraslaut Sep 1, 2026
0116210
runner: size containers with --cpuset-cpus, not --cpus
Yaraslaut Sep 1, 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
3 changes: 3 additions & 0 deletions .github/self-hosted-runner/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# entrypoint.sh runs inside a Linux container via its shebang; CRLF line
# endings (e.g. from Windows core.autocrlf=true checkouts) break that.
*.sh text eol=lf
103 changes: 103 additions & 0 deletions .github/self-hosted-runner/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# Self-hosted GitHub Actions runner for LASTRADA-Software/morph.
#
# Base is plain Ubuntu 24.04, matching the ubuntu-24.04 GitHub-hosted label
# the existing ci.yml jobs use. This image intentionally does NOT prebake
# gcc/clang/sccache -- ci.yml's jobs already bootstrap their own toolchain
# via apt-get / apt.llvm.org / sccache-release downloads on every run, so
# duplicating that here would just be a second place to keep in sync.
FROM ubuntu:24.04

ARG RUNNER_VERSION=2.336.0
ARG TARGETARCH=x64
ARG CMAKE_VERSION=3.31.12

ENV DEBIAN_FRONTEND=noninteractive

# GitHub-hosted ubuntu-24.04 runner images bundle ~500 packages that
# ci.yml's jobs rely on without installing themselves (perl, python3,
# binutils' nm, a base gcc/g++/make toolchain, ...). A bare ubuntu:24.04
# Docker image has none of that, so it's listed out explicitly here
# rather than discovered one "command not found" at a time -- python3
# (clang-tidy, coverage script), perl (deprecation-lint,
# test-type-name-lint scripts), binutils' nm (ladder-sanitizers'
# instrumentation check), build-essential for a base gcc/g++/make
# (ci.yml still installs its own pinned gcc-15/clang versions on top).
# cmake is intentionally NOT installed from apt here -- see below.
RUN apt-get update -q && apt-get install -y --no-install-recommends \
curl \
ca-certificates \
git \
jq \
sudo \
software-properties-common \
gnupg2 \
lsb-release \
wget \
tar \
gzip \
python3 \
perl \
binutils \
build-essential \
&& rm -rf /var/lib/apt/lists/*

# Ubuntu 24.04's apt package is CMake 3.28.3. GitHub-hosted ubuntu-24.04
# ships a newer CMake from Kitware's own release archive rather than the
# distro package, and that gap is not cosmetic: linux-all-features'
# configure step failed here with "Impossible to link target ...
# because the link item ... has already occurred with the feature
# 'WHOLE_ARCHIVE', which is not allowed" on 3.28.3 -- a false positive in
# $<LINK_LIBRARY:WHOLE_ARCHIVE,...> duplicate-feature detection, an area
# CMake was still actively patching in the 3.28-3.30 range. The same
# configure passes cleanly on GitHub-hosted ubuntu-24.04, confirming this
# is a CMake-version gap, not a real target-graph conflict in
# cmake/morph_add_rung.cmake. Installed directly from Kitware's binary
# release rather than a PPA/apt repo, to pin an exact known-good version.
RUN curl -fsSL -o cmake.tar.gz \
"https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz" \
&& tar -xzf cmake.tar.gz --strip-components=1 -C /usr/local \
&& rm cmake.tar.gz

# clang (installed per-job from apt.llvm.org, not baked into this image)
# uses libstdc++'s headers by default, not its own libc++. Stock
# ubuntu:24.04's default libstdc++ is 13.x, which predates C++23 <print>
# (needs GCC 14+) -- morph's headers use it unconditionally, so any
# clang-only job leg (no gcc install step of its own) fails to compile
# with "fatal error: 'print' file not found" unless a modern-enough
# libstdc++ already exists on the box. ci.yml's own "Install GCC 15" step
# pulls libstdc++-15-dev in as a side effect of gcc-15/g++-15 on legs that
# run it, but clang-only legs (clang-release, clang-asan, ...) never do --
# GitHub-hosted ubuntu-24.04 apparently ships a modern-enough libstdc++ by
# default, which this doesn't unless it's here explicitly. Same PPA
# ci.yml's own gcc-15 step uses, so this tracks that step's version rather
# than diverging from it.
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test \
&& apt-get update -q \
&& apt-get install -y --no-install-recommends libstdc++-15-dev \
&& rm -rf /var/lib/apt/lists/*

RUN useradd -m -s /bin/bash runner \
&& usermod -aG sudo runner \
&& echo "runner ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/runner

# GitHub-hosted ubuntu-24.04 runners ship /usr/local/bin writable by the
# runner user (ci.yml's "Install sccache" step untars straight into it,
# with no sudo). Stock ubuntu:24.04 leaves it root:root 755, which makes
# that same step fail with "Permission denied" here.
RUN chown runner:runner /usr/local/bin

USER runner
WORKDIR /home/runner/actions-runner

RUN curl -fsSL -o actions-runner.tar.gz \
"https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-${TARGETARCH}-${RUNNER_VERSION}.tar.gz" \
&& tar xzf actions-runner.tar.gz \
&& rm actions-runner.tar.gz

# Installs libicu/libssl/etc. that the runner's dotnet host needs.
RUN sudo ./bin/installdependencies.sh

COPY --chown=runner:runner entrypoint.sh /home/runner/entrypoint.sh
RUN sudo chmod +x /home/runner/entrypoint.sh

ENTRYPOINT ["/home/runner/entrypoint.sh"]
Loading
Loading