From 5265503edc7735dc8fa2ca3e173aac73b221eba0 Mon Sep 17 00:00:00 2001 From: Thaddeus Crews Date: Sun, 15 Dec 2024 13:16:05 -0600 Subject: [PATCH] CI: Ensure default branch cache persists --- .../actions/godot-cache-restore/action.yml | 48 +++++++++++++------ .github/actions/godot-cache-save/action.yml | 2 +- .github/workflows/android_builds.yml | 2 - .github/workflows/ios_builds.yml | 2 - .github/workflows/linux_builds.yml | 2 - .github/workflows/macos_builds.yml | 2 - .github/workflows/web_builds.yml | 2 - .github/workflows/windows_builds.yml | 2 - 8 files changed, 34 insertions(+), 28 deletions(-) diff --git a/.github/actions/godot-cache-restore/action.yml b/.github/actions/godot-cache-restore/action.yml index e2a1b9701910..cc3359b7c72b 100644 --- a/.github/actions/godot-cache-restore/action.yml +++ b/.github/actions/godot-cache-restore/action.yml @@ -11,24 +11,42 @@ inputs: runs: using: composite steps: - - name: Restore SCons cache directory + # Because all branches can refer to the repository's default branch's cache, we want it to + # persist as the de-facto fallback. However, it easily expunges in a matter of hours if + # nothing explicitly calls to it, so we work around that by ensuring it's *always* pinged + # prior to any cache operations. + - name: Ping main cache uses: actions/cache/restore@v4 + id: cache-ping with: path: ${{ inputs.scons-cache }} - key: ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-${{ github.ref }}-${{ github.sha }} + key: " " # Dummy key; we have to rely on the fallback value. + restore-keys: ${{ inputs.cache-name }}|${{ github.event.repository.default_branch }} + lookup-only: true - # We try to match an existing cache to restore from it. Each potential key is checked against - # all existing caches as a prefix. E.g. 'linux-template-minimal' would match any cache that - # starts with "linux-template-minimal", such as "linux-template-minimal-master-refs/heads/master-6588a4a29af1621086feac0117d5d4d37af957fd". - # - # We check these prefixes in this order: - # - # 1. The exact match, including the base branch, the commit reference, and the SHA hash of the commit. - # 2. A partial match for the same base branch and the same commit reference. - # 3. A partial match for the same base branch and the base branch commit reference. - # 4. A partial match for the same base branch only (not ideal, matches any PR with the same base branch). + # Fallback access isn't logged, so register an explicit cache-hit if found. + - name: Ping main cache (exact) + if: steps.cache-ping.outputs.cache-matched-key + uses: actions/cache/restore@v4 + with: + path: ${{ inputs.scons-cache }} + key: ${{ steps.cache-ping.outputs.cache-matched-key }} + lookup-only: true + # We try to match an existing cache to restore from it. Each potential key is checked against + # all existing caches as a prefix. E.g. 'linux-template-minimal' would match any cache that + # starts with "linux-template-minimal", such as + # "linux-template-minimal|master|6588a4a29af1621086feac0117d5d4d37af957fd". + # + # We check these prefixes in this order: + # 1. An exact match for the base branch, reference name, and SHA hash. + # 2. A partial match for the same cache name and reference name. + # 3. A partial match for the same cache name and default branch name. + - name: Restore SCons cache directory + uses: actions/cache/restore@v4 + with: + path: ${{ inputs.scons-cache }} + key: ${{ inputs.cache-name }}|${{ github.ref_name }}|${{ github.sha }} restore-keys: | - ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-${{ github.ref }} - ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-refs/heads/${{ env.GODOT_BASE_BRANCH }} - ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }} + ${{ inputs.cache-name }}|${{ github.ref_name }} + ${{ inputs.cache-name }}|${{ github.event.repository.default_branch }} diff --git a/.github/actions/godot-cache-save/action.yml b/.github/actions/godot-cache-save/action.yml index 42aa836406fc..6ec735a18f81 100644 --- a/.github/actions/godot-cache-save/action.yml +++ b/.github/actions/godot-cache-save/action.yml @@ -15,4 +15,4 @@ runs: uses: actions/cache/save@v4 with: path: ${{ inputs.scons-cache }} - key: ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-${{ github.ref }}-${{ github.sha }} + key: ${{ inputs.cache-name }}|${{ github.ref_name }}|${{ github.sha }} diff --git a/.github/workflows/android_builds.yml b/.github/workflows/android_builds.yml index bb4ee25f7c22..2021f7aa623a 100644 --- a/.github/workflows/android_builds.yml +++ b/.github/workflows/android_builds.yml @@ -4,8 +4,6 @@ on: # Global Settings env: - # Used for the cache key. Add version suffix to force clean build. - GODOT_BASE_BRANCH: master SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no module_text_server_fb_enabled=yes strict_checks=yes jobs: diff --git a/.github/workflows/ios_builds.yml b/.github/workflows/ios_builds.yml index f5a4f755dedd..3e79df4fcb9c 100644 --- a/.github/workflows/ios_builds.yml +++ b/.github/workflows/ios_builds.yml @@ -4,8 +4,6 @@ on: # Global Settings env: - # Used for the cache key. Add version suffix to force clean build. - GODOT_BASE_BRANCH: master SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no module_text_server_fb_enabled=yes strict_checks=yes jobs: diff --git a/.github/workflows/linux_builds.yml b/.github/workflows/linux_builds.yml index e978f9c8203d..0b43edc4b7bd 100644 --- a/.github/workflows/linux_builds.yml +++ b/.github/workflows/linux_builds.yml @@ -4,8 +4,6 @@ on: # Global Settings env: - # Used for the cache key. Add version suffix to force clean build. - GODOT_BASE_BRANCH: master SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes strict_checks=yes DOTNET_NOLOGO: true DOTNET_CLI_TELEMETRY_OPTOUT: true diff --git a/.github/workflows/macos_builds.yml b/.github/workflows/macos_builds.yml index 3923b918f49e..272639f77588 100644 --- a/.github/workflows/macos_builds.yml +++ b/.github/workflows/macos_builds.yml @@ -4,8 +4,6 @@ on: # Global Settings env: - # Used for the cache key. Add version suffix to force clean build. - GODOT_BASE_BRANCH: master SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes strict_checks=yes jobs: diff --git a/.github/workflows/web_builds.yml b/.github/workflows/web_builds.yml index 2f08d8c2f956..2a3451307d8f 100644 --- a/.github/workflows/web_builds.yml +++ b/.github/workflows/web_builds.yml @@ -4,8 +4,6 @@ on: # Global Settings env: - # Used for the cache key. Add version suffix to force clean build. - GODOT_BASE_BRANCH: master SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no use_closure_compiler=yes strict_checks=yes EM_VERSION: 3.1.64 diff --git a/.github/workflows/windows_builds.yml b/.github/workflows/windows_builds.yml index 8d5ff5ec38ec..6395ffb96e89 100644 --- a/.github/workflows/windows_builds.yml +++ b/.github/workflows/windows_builds.yml @@ -5,8 +5,6 @@ on: # Global Settings # SCONS_CACHE for windows must be set in the build environment env: - # Used for the cache key. Add version suffix to force clean build. - GODOT_BASE_BRANCH: master SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes d3d12=yes strict_checks=yes "angle_libs=${{ github.workspace }}/" SCONS_CACHE_MSVC_CONFIG: true