Eigen CI infrastructure

Eigen's CI infrastructure uses three stages:

  1. A checkformat stage to verify MRs satisfy proper formatting style, as defined by clang-format.
  2. A build stage to build the unit-tests.
  3. A test stage to run the unit-tests.

For merge requests, only a small subset of tests are built/run, and only on a small subset of platforms. This is to reduce our overall testing infrastructure resource usage. In addition, a weekly scheduled pipeline builds and runs the full suite of tests on most officially supported platforms.

Persistent compiler cache

Self-hosted runners can configure a persistent host directory for ccache to avoid the 5 GB GitLab archive limit and eliminate compression overhead. Set the standard CCACHE_* environment variables in the runner's config.toml:

[[runners]]
  environment = [
    "CCACHE_DIR=/ccache",
    "CCACHE_MAXSIZE=50G",
  ]
  [runners.docker]
    volumes = ["/var/cache/eigen-ccache:/ccache:rw", "/cache"]

The YAML templates prefix their defaults with EIGEN_CI_CCACHE_* (EIGEN_CI_CCACHE_DIR, EIGEN_CI_CCACHE_MAXSIZE, EIGEN_CI_CCACHE_BASEDIR, EIGEN_CI_CCACHE_COMPRESSLEVEL) so that runner-level environment = [...] settings in config.toml are not shadowed by GitLab CI. When a runner sets standard CCACHE_DIR, the build scripts (build.linux.script.sh and build.windows.script.ps1) preserve the runner‘s value, leaving ${CI_PROJECT_DIR}/.ccache absent so GitLab’s restore_cache and archive_cache steps are no-ops.

If the runner has already cached these jobs locally, restore_cache still extracts the stale pool into ${CI_PROJECT_DIR}/.ccache on every job (and archive_cache re-archives it whenever a job‘s primary key has no archive yet, such as the first run under a new -mr<iid> key). When switching an existing runner to a host CCACHE_DIR, clear the runner’s local cache storage once (the /cache volumes, or clear-docker-cache for the Docker executor); once .ccache/ is absent, cache-archiver reports No files to cache and nothing recreates the archive. A runner with a distributed [runners.cache] backend has no equivalent one-time clear—any other runner writing the same bucket recreates the archive—so a host directory only fits cleanly on runners with a local-only cache, where it also costs the shared pool nothing.

Concurrent jobs may share one local directory on a POSIX or NTFS filesystem, but not over network shares. The build scripts record per-job cache hits and misses via CCACHE_STATSLOG and ccache --show-log-stats so that concurrent jobs sharing a cache directory do not zero or mix each other's counters.