fix(ci): fix ccache 0% hit rate and improve cache persistence
All checks were successful
Build and Test / build (pull_request) Successful in 1h16m6s

Root cause: compiler_check=mtime (default) invalidates the entire
cache on every run because pixi installs fresh compiler binaries with
new mtimes each time. The CI logs confirm 0/2579 cache hits (0.00%)
despite successfully restoring a 225MB cache.

Fix: set CCACHE_COMPILERCHECK=content to hash compiler binary content
instead of mtime. Same compiler version = same content = cache hits.

Also fix cache save strategy: use github.run_id for save keys so every
build persists its ccache objects. Previously date-based keys with
cache-hit guard meant the cache was only saved once per day — all
subsequent compilations were thrown away.

Changes:
- Add CCACHE_COMPILERCHECK=content to build.yml, release.yml, build.sh
- Use github.run_id in cache save keys (unique per run = always saves)
- Remove date-based cache key computation step
- Remove cache-hit != true guard on save step
- Add ccache-build-main- fallback to release workflow restore-keys
This commit is contained in:
forbes
2026-02-09 16:05:22 -06:00
parent f8a9fa0103
commit dfc32cabd6
3 changed files with 10 additions and 14 deletions

View File

@@ -18,6 +18,7 @@ jobs:
CCACHE_COMPRESSLEVEL: "6"
CCACHE_MAXSIZE: "4G"
CCACHE_SLOPPINESS: "include_file_ctime,include_file_mtime,pch_defines,time_macros"
CCACHE_COMPILERCHECK: "content"
CCACHE_BASEDIR: ${{ github.workspace }}
DEBIAN_FRONTEND: noninteractive
NODE_EXTRA_CA_CERTS: /etc/ssl/certs/ca-certificates.crt
@@ -68,16 +69,12 @@ jobs:
export PATH="$HOME/.pixi/bin:$PATH"
pixi --version
- name: Compute cache date key
id: cache-date
run: echo "date=$(date -u +%Y%m%d)" >> $GITHUB_OUTPUT
- name: Restore ccache
id: ccache-restore
uses: https://git.kindred-systems.com/actions/cache.git/restore@v4
with:
path: /tmp/ccache-kindred-create
key: ccache-build-${{ github.ref_name }}-${{ steps.cache-date.outputs.date }}
key: ccache-build-${{ github.ref_name }}-${{ github.run_id }}
restore-keys: |
ccache-build-${{ github.ref_name }}-
ccache-build-main-
@@ -98,11 +95,11 @@ jobs:
run: pixi run ccache -s
- name: Save ccache
if: always() && steps.ccache-restore.outputs.cache-hit != 'true'
if: always()
uses: https://git.kindred-systems.com/actions/cache.git/save@v4
with:
path: /tmp/ccache-kindred-create
key: ccache-build-${{ github.ref_name }}-${{ steps.cache-date.outputs.date }}
key: ccache-build-${{ github.ref_name }}-${{ github.run_id }}
- name: Run C++ unit tests
continue-on-error: true

View File

@@ -24,6 +24,7 @@ jobs:
CCACHE_COMPRESSLEVEL: "6"
CCACHE_MAXSIZE: "4G"
CCACHE_SLOPPINESS: "include_file_ctime,include_file_mtime,pch_defines,time_macros"
CCACHE_COMPILERCHECK: "content"
CCACHE_BASEDIR: ${{ github.workspace }}
BUILD_TAG: ${{ github.ref_name || inputs.tag }}
CFLAGS: "-O3"
@@ -78,18 +79,15 @@ jobs:
export PATH="$HOME/.pixi/bin:$PATH"
pixi --version
- name: Compute cache date key
id: cache-date
run: echo "date=$(date -u +%Y%m%d)" >> $GITHUB_OUTPUT
- name: Restore ccache
id: ccache-restore
uses: https://git.kindred-systems.com/actions/cache.git/restore@v4
with:
path: /tmp/ccache-kindred-create
key: ccache-release-linux-${{ steps.cache-date.outputs.date }}
key: ccache-release-linux-${{ github.run_id }}
restore-keys: |
ccache-release-linux-
ccache-build-main-
- name: Prepare ccache
run: |
@@ -109,11 +107,11 @@ jobs:
run: pixi run ccache -s
- name: Save ccache
if: always() && steps.ccache-restore.outputs.cache-hit != 'true'
if: always()
uses: https://git.kindred-systems.com/actions/cache.git/save@v4
with:
path: /tmp/ccache-kindred-create
key: ccache-release-linux-${{ steps.cache-date.outputs.date }}
key: ccache-release-linux-${{ github.run_id }}
- name: Clean up intermediate build files
run: |

View File

@@ -6,6 +6,7 @@ export CCACHE_COMPRESS="${CCACHE_COMPRESS:-true}"
export CCACHE_COMPRESSLEVEL="${CCACHE_COMPRESSLEVEL:-6}"
export CCACHE_MAXSIZE="${CCACHE_MAXSIZE:-4G}"
export CCACHE_SLOPPINESS="${CCACHE_SLOPPINESS:-include_file_ctime,include_file_mtime,pch_defines,time_macros}"
export CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK:-content}"
mkdir -p "$CCACHE_DIR"
echo "ccache config: CCACHE_DIR=$CCACHE_DIR CCACHE_BASEDIR=$CCACHE_BASEDIR"
ccache -z || true