cmakegithub-actionsccache

Hit rate 0.00 % for cache in GitHub Actions CI


I have a dummy C++ project for which I have the following github actions config:

name: CI

on: [push, pull_request] # on all pushes and PRs

jobs:
  dummy:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        distro: ["ros:foxy-ros-base-focal"]
    container:
      image: ${{ matrix.distro }}
    env:
      CCACHE_DIR: "${{ github.workspace }}/.ccache"
    steps:
      - uses: actions/checkout@v2
      - name: install ccache
        run: |
          sudo apt-get update -y
          sudo apt-get -qq install ccache
      - name: ccache cache
        uses: actions/cache@v2
        with:
          path: ${{ env.CCACHE_DIR }}
          key: ccache-${{ matrix.distro }}-${{github.run_id}}
          restore-keys: |
            ccache-${{ matrix.distro }}
      - name: ccache stats
        run: ccache -s
      - name: Build workspace
        run: |
          bash ./build_bridge.sh

I am testing ccache by adding / removing libs in CMakeLists.txt, but each time the ccache hit rate is 0%

cache directory                     /__w/action_test/action_test/.ccache
primary config                      /__w/action_test/action_test/.ccache/ccache.conf
secondary config      (readonly)    /etc/ccache.conf
cache hit (direct)                     0
cache hit (preprocessed)               0
cache miss                             0
cache hit rate                      0.00 %
cleanups performed                     0
files in cache                         0
cache size                           0.0 kB
max cache size                       5.0 GB

The previous job from which the cache was restored from had an output:

Post job cleanup.
/usr/bin/docker exec  b170bb77ebaac32aed0561984bb959d515d8a025b9329b6309b986f6b676c6c4 sh -c "cat /etc/*release | grep ^ID"
/usr/bin/tar --posix -z -cf cache.tgz -P -C /__w/action_test/action_test --files-from manifest.txt
Cache saved successfully

Do I need to do anything specific to save cmake-specific cache?


Solution

  • CMake should use the ccache's compiler wrappers Reference: "Enabling ccache in your project". I modified the build step to:

          - name: Build workspace
            run: |
              sudo /usr/sbin/update-ccache-symlinks
              export PATH="/usr/lib/ccache:$PATH"
              bash ./build_bridge.sh
    

    CMake output:

    -- Check for working C compiler: /usr/lib/ccache/cc -- works
    -- Check for working CXX compiler: /usr/lib/ccache/c++ -- works
    

    Now the ccache stats look good

    stats updated                       Wed Mar 31 17:30:50 2021
    cache hit (direct)                     1
    cache hit (preprocessed)               0
    cache miss                            48
    cache hit rate                      2.04 %
    called for link                       41
    cleanups performed                     0
    files in cache                        94
    cache size                          42.8 MB
    max cache size                       5.0 GB
    

    And the build time reduced from 1min ~20sec to 24sec.