You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2025/05/19 14:20:48 UTC
(logging-parent) 01/01: Replace Maven Cache with Mimír
This is an automated email from the ASF dual-hosted git repository.
pkarwasz pushed a commit to branch feat/setup-mimir
in repository https://gitbox.apache.org/repos/asf/logging-parent.git
commit 190f2e19bb5ab8ca8000aa6214c1c285f4691731
Author: Piotr P. Karwasz <pk...@apache.org>
AuthorDate: Mon May 19 16:20:04 2025 +0200
Replace Maven Cache with Mimír
This pull request replaces the use of the Maven local repository cache with [Mimír](https://maveniverse.eu/docs/mimir/), a specialized, immutable cache for remote Maven repositories.
### Description
The Maven local repository serves multiple purposes:
- Mirrors immutable releases from Maven Central
- Caches snapshot artifacts
- Acts as a local staging area for builds
Because of these overlapping responsibilities, the local repository often becomes polluted with temporary artifacts, making it unreliable for consistent, reproducible builds. Additionally, it is not safe to share across workflows.
One major issue caused by sharing the local Maven repository is the occurrence of false negatives in the `verify-reproducibility-reusable` check (see #388).
### Benefits of Using Mimír
Mimír provides a cleaner and more reliable caching approach:
- **Immutable by design**: Only caches artifacts from remote Maven repositories, which do not change.
- **Workflow-friendly**: Enables a single shared cache across workflows without risk of contamination from snapshots or local artifacts.
This change improves build reproducibility, reduces cache-related issues, and simplifies cache management.
---
.github/workflows/build-reusable.yaml | 30 +++++++++++++++++++++-
.github/workflows/codeql-analysis-reusable.yaml | 30 +++++++++++++++++++++-
.github/workflows/deploy-release-reusable.yaml | 30 +++++++++++++++++++++-
.github/workflows/deploy-site-reusable.yaml | 30 +++++++++++++++++++++-
.github/workflows/deploy-snapshot-reusable.yaml | 30 +++++++++++++++++++++-
.github/workflows/merge-dependabot-reusable.yaml | 30 +++++++++++++++++++++-
.../workflows/verify-reproducibility-reusable.yaml | 30 +++++++++++++++++++++-
.gitignore | 1 +
pom.xml | 17 ++++++++++++
9 files changed, 221 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/build-reusable.yaml b/.github/workflows/build-reusable.yaml
index cc42178..b9a138b 100644
--- a/.github/workflows/build-reusable.yaml
+++ b/.github/workflows/build-reusable.yaml
@@ -89,7 +89,35 @@ jobs:
with:
distribution: zulu
java-version: ${{ inputs.java-version }}
- cache: maven
+
+ #
+ # Sets up Mimír (https://maveniverse.eu/docs/mimir/) to cache artifacts from remote repositories
+ #
+ # Unlike the local Maven repository, Mimír cannot be used to stage locally generated artifacts or snapshots.
+ # Therefore, it can be reused between builds, even on different architectures.
+ # Since the size of the cache increases in time, as we download new dependency versions, we reset the cache
+ # once a month.
+ #
+ # WARNING: Currently it is not possible to reuse GitHub workflow steps, therefore, these two steps must be
+ # copied to multiple workflows.
+ # All copies should be synchronized with the original: build-reusable.yaml
+ #
+ - name: Set up Mimír configuration
+ shell: bash
+ run: |
+ # Compute the key cache
+ echo MIMIR_KEY="mimir-cache-$(date +'%Y-%m')" >> $GITHUB_ENV
+ # Mimir currently does not support relative paths, so we need to compute the absolute path of `mimir`.
+ echo MAVEN_OPTS="-Dmimir.daemon.passOnBasedir=true -Dmimir.basedir=$GITHUB_WORKSPACE/.mimir" >> $GITHUB_ENV
+
+ - name: Set up Mimír cache
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # 4.2.3
+ with:
+ # Mimir contains an exact copy of part of Maven Central.
+ # Therefore, we only need to clean it from time to time to remove old versions.
+ key: ${{ env.MIMIR_KEY }}
+ path: .mimir/local
+ enableCrossOsArchive: true
- name: Set up Develocity
if: inputs.develocity-enabled
diff --git a/.github/workflows/codeql-analysis-reusable.yaml b/.github/workflows/codeql-analysis-reusable.yaml
index 2317b25..c58dc49 100644
--- a/.github/workflows/codeql-analysis-reusable.yaml
+++ b/.github/workflows/codeql-analysis-reusable.yaml
@@ -53,7 +53,35 @@ jobs:
with:
distribution: zulu
java-version: ${{ inputs.java-version }}
- cache: maven
+
+ #
+ # Sets up Mimír (https://maveniverse.eu/docs/mimir/) to cache artifacts from remote repositories
+ #
+ # Unlike the local Maven repository, Mimír cannot be used to stage locally generated artifacts or snapshots.
+ # Therefore, it can be reused between builds, even on different architectures.
+ # Since the size of the cache increases in time, as we download new dependency versions, we reset the cache
+ # once a month.
+ #
+ # WARNING: Currently it is not possible to reuse GitHub workflow steps, therefore, these two steps must be
+ # copied to multiple workflows.
+ # All copies should be synchronized with the original: build-reusable.yaml
+ #
+ - name: Set up Mimír configuration
+ shell: bash
+ run: |
+ # Compute the key cache
+ echo MIMIR_KEY="mimir-cache-$(date +'%Y-%m')" >> $GITHUB_ENV
+ # Mimir currently does not support relative paths, so we need to compute the absolute path of `mimir`.
+ echo MAVEN_OPTS="-Dmimir.daemon.passOnBasedir=true -Dmimir.basedir=$GITHUB_WORKSPACE/.mimir" >> $GITHUB_ENV
+
+ - name: Set up Mimír cache
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # 4.2.3
+ with:
+ # Mimir contains an exact copy of part of Maven Central.
+ # Therefore, we only need to clean it from time to time to remove old versions.
+ key: ${{ env.MIMIR_KEY }}
+ path: .mimir/local
+ enableCrossOsArchive: true
- name: Build with Maven
shell: bash
diff --git a/.github/workflows/deploy-release-reusable.yaml b/.github/workflows/deploy-release-reusable.yaml
index 98215e9..c677821 100644
--- a/.github/workflows/deploy-release-reusable.yaml
+++ b/.github/workflows/deploy-release-reusable.yaml
@@ -68,12 +68,40 @@ jobs:
with:
distribution: zulu
java-version: ${{ inputs.java-version }}
- cache: maven
server-id: apache.releases.https
server-username: NEXUS_USERNAME
server-password: NEXUS_PASSWORD
gpg-private-key: ${{ secrets.GPG_SECRET_KEY }}
+ #
+ # Sets up Mimír (https://maveniverse.eu/docs/mimir/) to cache artifacts from remote repositories
+ #
+ # Unlike the local Maven repository, Mimír cannot be used to stage locally generated artifacts or snapshots.
+ # Therefore, it can be reused between builds, even on different architectures.
+ # Since the size of the cache increases in time, as we download new dependency versions, we reset the cache
+ # once a month.
+ #
+ # WARNING: Currently it is not possible to reuse GitHub workflow steps, therefore, these two steps must be
+ # copied to multiple workflows.
+ # All copies should be synchronized with the original: build-reusable.yaml
+ #
+ - name: Set up Mimír configuration
+ shell: bash
+ run: |
+ # Compute the key cache
+ echo MIMIR_KEY="mimir-cache-$(date +'%Y-%m')" >> $GITHUB_ENV
+ # Mimir currently does not support relative paths, so we need to compute the absolute path of `mimir`.
+ echo MAVEN_OPTS="-Dmimir.daemon.passOnBasedir=true -Dmimir.basedir=$GITHUB_WORKSPACE/.mimir" >> $GITHUB_ENV
+
+ - name: Set up Mimír cache
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # 4.2.3
+ with:
+ # Mimir contains an exact copy of part of Maven Central.
+ # Therefore, we only need to clean it from time to time to remove old versions.
+ key: ${{ env.MIMIR_KEY }}
+ path: .mimir/local
+ enableCrossOsArchive: true
+
- name: Set up Git user
shell: bash
run: |
diff --git a/.github/workflows/deploy-site-reusable.yaml b/.github/workflows/deploy-site-reusable.yaml
index 2464864..6a727ab 100644
--- a/.github/workflows/deploy-site-reusable.yaml
+++ b/.github/workflows/deploy-site-reusable.yaml
@@ -61,9 +61,37 @@ jobs:
with:
distribution: zulu
java-version: ${{ inputs.java-version }}
- cache: maven
gpg-private-key: ${{ secrets.GPG_SECRET_KEY }}
+ #
+ # Sets up Mimír (https://maveniverse.eu/docs/mimir/) to cache artifacts from remote repositories
+ #
+ # Unlike the local Maven repository, Mimír cannot be used to stage locally generated artifacts or snapshots.
+ # Therefore, it can be reused between builds, even on different architectures.
+ # Since the size of the cache increases in time, as we download new dependency versions, we reset the cache
+ # once a month.
+ #
+ # WARNING: Currently it is not possible to reuse GitHub workflow steps, therefore, these two steps must be
+ # copied to multiple workflows.
+ # All copies should be synchronized with the original: build-reusable.yaml
+ #
+ - name: Set up Mimír configuration
+ shell: bash
+ run: |
+ # Compute the key cache
+ echo MIMIR_KEY="mimir-cache-$(date +'%Y-%m')" >> $GITHUB_ENV
+ # Mimir currently does not support relative paths, so we need to compute the absolute path of `mimir`.
+ echo MAVEN_OPTS="-Dmimir.daemon.passOnBasedir=true -Dmimir.basedir=$GITHUB_WORKSPACE/.mimir" >> $GITHUB_ENV
+
+ - name: Set up Mimír cache
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # 4.2.3
+ with:
+ # Mimir contains an exact copy of part of Maven Central.
+ # Therefore, we only need to clean it from time to time to remove old versions.
+ key: ${{ env.MIMIR_KEY }}
+ path: .mimir/local
+ enableCrossOsArchive: true
+
- name: Build the project
shell: bash
if: inputs.install-required
diff --git a/.github/workflows/deploy-snapshot-reusable.yaml b/.github/workflows/deploy-snapshot-reusable.yaml
index c1b1c3d..c9dfafb 100644
--- a/.github/workflows/deploy-snapshot-reusable.yaml
+++ b/.github/workflows/deploy-snapshot-reusable.yaml
@@ -51,11 +51,39 @@ jobs:
with:
distribution: zulu
java-version: ${{ inputs.java-version }}
- cache: maven
server-id: apache.snapshots.https
server-username: NEXUS_USERNAME
server-password: NEXUS_PASSWORD
+ #
+ # Sets up Mimír (https://maveniverse.eu/docs/mimir/) to cache artifacts from remote repositories
+ #
+ # Unlike the local Maven repository, Mimír cannot be used to stage locally generated artifacts or snapshots.
+ # Therefore, it can be reused between builds, even on different architectures.
+ # Since the size of the cache increases in time, as we download new dependency versions, we reset the cache
+ # once a month.
+ #
+ # WARNING: Currently it is not possible to reuse GitHub workflow steps, therefore, these two steps must be
+ # copied to multiple workflows.
+ # All copies should be synchronized with the original: build-reusable.yaml
+ #
+ - name: Set up Mimír configuration
+ shell: bash
+ run: |
+ # Compute the key cache
+ echo MIMIR_KEY="mimir-cache-$(date +'%Y-%m')" >> $GITHUB_ENV
+ # Mimir currently does not support relative paths, so we need to compute the absolute path of `mimir`.
+ echo MAVEN_OPTS="-Dmimir.daemon.passOnBasedir=true -Dmimir.basedir=$GITHUB_WORKSPACE/.mimir" >> $GITHUB_ENV
+
+ - name: Set up Mimír cache
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # 4.2.3
+ with:
+ # Mimir contains an exact copy of part of Maven Central.
+ # Therefore, we only need to clean it from time to time to remove old versions.
+ key: ${{ env.MIMIR_KEY }}
+ path: .mimir/local
+ enableCrossOsArchive: true
+
- name: Export version
id: version
shell: bash
diff --git a/.github/workflows/merge-dependabot-reusable.yaml b/.github/workflows/merge-dependabot-reusable.yaml
index 7bf058a..92ce31d 100644
--- a/.github/workflows/merge-dependabot-reusable.yaml
+++ b/.github/workflows/merge-dependabot-reusable.yaml
@@ -78,12 +78,40 @@ jobs:
with:
distribution: zulu
java-version: ${{ inputs.java-version }}
- cache: maven
server-id: apache.releases.https
server-username: NEXUS_USERNAME
server-password: NEXUS_PASSWORD
gpg-private-key: ${{ secrets.GPG_SECRET_KEY }}
+ #
+ # Sets up Mimír (https://maveniverse.eu/docs/mimir/) to cache artifacts from remote repositories
+ #
+ # Unlike the local Maven repository, Mimír cannot be used to stage locally generated artifacts or snapshots.
+ # Therefore, it can be reused between builds, even on different architectures.
+ # Since the size of the cache increases in time, as we download new dependency versions, we reset the cache
+ # once a month.
+ #
+ # WARNING: Currently it is not possible to reuse GitHub workflow steps, therefore, these two steps must be
+ # copied to multiple workflows.
+ # All copies should be synchronized with the original: build-reusable.yaml
+ #
+ - name: Set up Mimír configuration
+ shell: bash
+ run: |
+ # Compute the key cache
+ echo MIMIR_KEY="mimir-cache-$(date +'%Y-%m')" >> $GITHUB_ENV
+ # Mimir currently does not support relative paths, so we need to compute the absolute path of `mimir`.
+ echo MAVEN_OPTS="-Dmimir.daemon.passOnBasedir=true -Dmimir.basedir=$GITHUB_WORKSPACE/.mimir" >> $GITHUB_ENV
+
+ - name: Set up Mimír cache
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # 4.2.3
+ with:
+ # Mimir contains an exact copy of part of Maven Central.
+ # Therefore, we only need to clean it from time to time to remove old versions.
+ key: ${{ env.MIMIR_KEY }}
+ path: .mimir/local
+ enableCrossOsArchive: true
+
- name: Find the release version major
shell: bash
run: |
diff --git a/.github/workflows/verify-reproducibility-reusable.yaml b/.github/workflows/verify-reproducibility-reusable.yaml
index 33a4013..59cfb3f 100644
--- a/.github/workflows/verify-reproducibility-reusable.yaml
+++ b/.github/workflows/verify-reproducibility-reusable.yaml
@@ -61,7 +61,35 @@ jobs:
with:
distribution: zulu
java-version: ${{ inputs.java-version }}
- cache: maven
+
+ #
+ # Sets up Mimír (https://maveniverse.eu/docs/mimir/) to cache artifacts from remote repositories
+ #
+ # Unlike the local Maven repository, Mimír cannot be used to stage locally generated artifacts or snapshots.
+ # Therefore, it can be reused between builds, even on different architectures.
+ # Since the size of the cache increases in time, as we download new dependency versions, we reset the cache
+ # once a month.
+ #
+ # WARNING: Currently it is not possible to reuse GitHub workflow steps, therefore, these two steps must be
+ # copied to multiple workflows.
+ # All copies should be synchronized with the original: build-reusable.yaml
+ #
+ - name: Set up Mimír configuration
+ shell: bash
+ run: |
+ # Compute the key cache
+ echo MIMIR_KEY="mimir-cache-$(date +'%Y-%m')" >> $GITHUB_ENV
+ # Mimir currently does not support relative paths, so we need to compute the absolute path of `mimir`.
+ echo MAVEN_OPTS="-Dmimir.daemon.passOnBasedir=true -Dmimir.basedir=$GITHUB_WORKSPACE/.mimir" >> $GITHUB_ENV
+
+ - name: Set up Mimír cache
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # 4.2.3
+ with:
+ # Mimir contains an exact copy of part of Maven Central.
+ # Therefore, we only need to clean it from time to time to remove old versions.
+ key: ${{ env.MIMIR_KEY }}
+ path: .mimir/local
+ enableCrossOsArchive: true
# `clean verify artifact:compare` is required to generate the build reproducibility report.
# For details, see: https://maven.apache.org/guides/mini/guide-reproducible-builds.html#how-to-test-my-maven-build-reproducibility
diff --git a/.gitignore b/.gitignore
index 712b37b..b08e3ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
# Maven
target/
.flattened-pom.xml
+/.mimir/
/.mvn/extensions.xml
/.mvn/wrapper/maven-wrapper.jar
# IDEA
diff --git a/pom.xml b/pom.xml
index f8036c7..ab71e7d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -227,6 +227,7 @@
<jacoco-maven-plugin.version>0.8.13</jacoco-maven-plugin.version>
<log4j-changelog-maven-plugin.version>0.9.0</log4j-changelog-maven-plugin.version>
<maven-artifact-plugin.version>3.6.0</maven-artifact-plugin.version>
+ <mimir.version>0.7.4</mimir.version>
<restrict-imports-enforcer-rule.version>2.6.1</restrict-imports-enforcer-rule.version>
<spotbugs-maven-plugin.version>4.9.3.0</spotbugs-maven-plugin.version>
<spotless-maven-plugin.version>2.44.4</spotless-maven-plugin.version>
@@ -362,6 +363,12 @@
<version>${maven-artifact-plugin.version}</version>
</plugin>
+ <plugin>
+ <groupId>eu.maveniverse.maven.mimir</groupId>
+ <artifactId>extension</artifactId>
+ <version>${mimir.version}</version>
+ </plugin>
+
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
@@ -956,6 +963,16 @@
</executions>
</plugin>
+ <!--
+ ~ Use Mimir as Maven cache:
+ ~ See: https://maveniverse.eu/docs/mimir/
+ -->
+ <plugin>
+ <groupId>eu.maveniverse.maven.mimir</groupId>
+ <artifactId>extension</artifactId>
+ <extensions>true</extensions>
+ </plugin>
+
</plugins>
</build>