Improve build cache strategy
Ripped off from Quarkus.
Here's how it will work:
1. We create a cache entry on push only. Pull requests only restore it.
2. We create a new cache entry every day, prefixed with something like
2024-10-25.
3. When restoring the cache, we try the entry for the day first
(2024-10-25) and default to the one for the month (2024-10-*).
Critically, this means we will build each day's cache based on the
previous day's cache.
4. Atlas infra uses its own, separate cache entries.
Co-Authored-By: Guillaume Smet <guillaume.smet@gmail.com>
(cherry picked from commit 5eaaff2e63
)
This commit is contained in:
parent
d6a9c42c2d
commit
b8b7af92cd
|
@ -53,20 +53,50 @@ jobs:
|
||||||
with:
|
with:
|
||||||
distribution: 'graalvm'
|
distribution: 'graalvm'
|
||||||
java-version: '21'
|
java-version: '21'
|
||||||
- name: Get year/month for cache key
|
|
||||||
id: get-date
|
- name: Generate cache key
|
||||||
run: echo "yearmonth=$(/bin/date -u "+%Y-%m")" >> $GITHUB_OUTPUT
|
id: cache-key
|
||||||
shell: bash
|
run: |
|
||||||
- name: Cache Maven local repository
|
CURRENT_BRANCH="${{ github.repository != 'hibernate/hibernate-orm' && 'fork' || github.base_ref || github.ref_name }}"
|
||||||
uses: actions/cache@v4
|
CURRENT_MONTH=$(/bin/date -u "+%Y-%m")
|
||||||
|
CURRENT_DAY=$(/bin/date -u "+%d")
|
||||||
|
ROOT_CACHE_KEY="buildtool-cache-atlas"
|
||||||
|
echo "buildtool-monthly-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}" >> $GITHUB_OUTPUT
|
||||||
|
echo "buildtool-monthly-branch-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}-${CURRENT_BRANCH}" >> $GITHUB_OUTPUT
|
||||||
|
echo "buildtool-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}-${CURRENT_BRANCH}-${CURRENT_DAY}" >> $GITHUB_OUTPUT
|
||||||
|
- name: Cache Maven/Gradle Local Caches
|
||||||
id: cache-maven
|
id: cache-maven
|
||||||
|
uses: actions/cache@v4
|
||||||
|
# if it's not a pull request, we restore and save the cache
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.m2/repository
|
~/.m2/repository/
|
||||||
|
~/.m2/wrapper/
|
||||||
~/.gradle/caches/
|
~/.gradle/caches/
|
||||||
~/.gradle/wrapper/
|
~/.gradle/wrapper/
|
||||||
# refresh cache every month to avoid unlimited growth
|
# A new cache will be stored daily. After that first store of the day, cache save actions will fail because the cache is immutable but it's not a problem.
|
||||||
key: maven-localrepo-${{ steps.get-date.outputs.yearmonth }}
|
# The whole cache is dropped monthly to prevent unlimited growth.
|
||||||
|
# The cache is per branch but in case we don't find a branch for a given branch, we will get a cache from another branch.
|
||||||
|
key: ${{ steps.cache-key.outputs.buildtool-cache-key }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ steps.cache-key.outputs.buildtool-monthly-branch-cache-key }}-
|
||||||
|
${{ steps.cache-key.outputs.buildtool-monthly-cache-key }}-
|
||||||
|
- name: Restore Maven/Gradle Local Caches
|
||||||
|
uses: actions/cache/restore@v4
|
||||||
|
# if it a pull request, we restore the cache but we don't save it
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.m2/repository/
|
||||||
|
~/.m2/wrapper/
|
||||||
|
~/.gradle/caches/
|
||||||
|
~/.gradle/wrapper/
|
||||||
|
key: ${{ steps.cache-key.outputs.buildtool-cache-key }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ steps.cache-key.outputs.buildtool-monthly-branch-cache-key }}-
|
||||||
|
${{ steps.cache-key.outputs.buildtool-monthly-cache-key }}-
|
||||||
|
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
env:
|
env:
|
||||||
RDBMS: ${{ matrix.rdbms }}
|
RDBMS: ${{ matrix.rdbms }}
|
||||||
|
|
|
@ -62,20 +62,50 @@ jobs:
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: '11'
|
java-version: '11'
|
||||||
- name: Get year/month for cache key
|
|
||||||
id: get-date
|
- name: Generate cache key
|
||||||
run: echo "yearmonth=$(/bin/date -u "+%Y-%m")" >> $GITHUB_OUTPUT
|
id: cache-key
|
||||||
shell: bash
|
run: |
|
||||||
- name: Cache Maven local repository
|
CURRENT_BRANCH="${{ github.repository != 'hibernate/hibernate-orm' && 'fork' || github.base_ref || github.ref_name }}"
|
||||||
uses: actions/cache@v4
|
CURRENT_MONTH=$(/bin/date -u "+%Y-%m")
|
||||||
|
CURRENT_DAY=$(/bin/date -u "+%d")
|
||||||
|
ROOT_CACHE_KEY="buildtool-cache"
|
||||||
|
echo "buildtool-monthly-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}" >> $GITHUB_OUTPUT
|
||||||
|
echo "buildtool-monthly-branch-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}-${CURRENT_BRANCH}" >> $GITHUB_OUTPUT
|
||||||
|
echo "buildtool-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}-${CURRENT_BRANCH}-${CURRENT_DAY}" >> $GITHUB_OUTPUT
|
||||||
|
- name: Cache Maven/Gradle Local Caches
|
||||||
id: cache-maven
|
id: cache-maven
|
||||||
|
uses: actions/cache@v4
|
||||||
|
# if it's not a pull request, we restore and save the cache
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.m2/repository
|
~/.m2/repository/
|
||||||
|
~/.m2/wrapper/
|
||||||
~/.gradle/caches/
|
~/.gradle/caches/
|
||||||
~/.gradle/wrapper/
|
~/.gradle/wrapper/
|
||||||
# refresh cache every month to avoid unlimited growth
|
# A new cache will be stored daily. After that first store of the day, cache save actions will fail because the cache is immutable but it's not a problem.
|
||||||
key: maven-localrepo-${{ steps.get-date.outputs.yearmonth }}
|
# The whole cache is dropped monthly to prevent unlimited growth.
|
||||||
|
# The cache is per branch but in case we don't find a branch for a given branch, we will get a cache from another branch.
|
||||||
|
key: ${{ steps.cache-key.outputs.buildtool-cache-key }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ steps.cache-key.outputs.buildtool-monthly-branch-cache-key }}-
|
||||||
|
${{ steps.cache-key.outputs.buildtool-monthly-cache-key }}-
|
||||||
|
- name: Restore Maven/Gradle Local Caches
|
||||||
|
uses: actions/cache/restore@v4
|
||||||
|
# if it a pull request, we restore the cache but we don't save it
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.m2/repository/
|
||||||
|
~/.m2/wrapper/
|
||||||
|
~/.gradle/caches/
|
||||||
|
~/.gradle/wrapper/
|
||||||
|
key: ${{ steps.cache-key.outputs.buildtool-cache-key }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ steps.cache-key.outputs.buildtool-monthly-branch-cache-key }}-
|
||||||
|
${{ steps.cache-key.outputs.buildtool-monthly-cache-key }}-
|
||||||
|
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
env:
|
env:
|
||||||
RDBMS: ${{ matrix.rdbms }}
|
RDBMS: ${{ matrix.rdbms }}
|
||||||
|
|
Loading…
Reference in New Issue