Skip to content

Commit 20a39ed

Browse files
author
emre.akkaya
committed
feat: Support for multiple JAVA and SPRING_BOOT versions using a compatibility matrix
1 parent b6c1b25 commit 20a39ed

3 files changed

Lines changed: 76 additions & 18 deletions

File tree

.github/workflows/docker-image.yml

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,38 @@ on:
77
branches: [main]
88

99
env:
10-
JAVA_VERSION: "21"
1110
MAVEN_VERSION: "3.9.11"
1211
REGISTRY_IMAGE: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKERHUB_PROJECT_NAME }}
1312

1413
jobs:
1514
build-test-push:
16-
name: Build, Test, and Publish
15+
name: Build/Test/Publish (Java ${{ matrix.java-version }}, Boot ${{ matrix.spring-boot-version }})
1716
runs-on: ubuntu-latest
1817
permissions:
1918
contents: read
2019
packages: write
20+
strategy:
21+
fail-fast: false
22+
matrix:
23+
include:
24+
- java-version: "17"
25+
spring-boot-version: "4.0.0"
26+
spring-cloud-version: "2025.1.0"
27+
- java-version: "21"
28+
spring-boot-version: "4.0.0"
29+
spring-cloud-version: "2025.1.0"
30+
- java-version: "25"
31+
spring-boot-version: "4.0.0"
32+
spring-cloud-version: "2025.1.0"
33+
- java-version: "17"
34+
spring-boot-version: "3.5.8"
35+
spring-cloud-version: "2025.0.0"
36+
- java-version: "21"
37+
spring-boot-version: "3.5.8"
38+
spring-cloud-version: "2025.0.0"
39+
- java-version: "25"
40+
spring-boot-version: "3.5.8"
41+
spring-cloud-version: "2025.0.0"
2142

2243
steps:
2344
- name: Checkout source code
@@ -29,9 +50,25 @@ jobs:
2950
uses: actions/setup-java@v4
3051
with:
3152
distribution: temurin
32-
java-version: ${{ env.JAVA_VERSION }}
53+
java-version: ${{ matrix.java-version }}
3354
cache: maven
3455

56+
- name: Align Maven versions for matrix
57+
run: |
58+
mvn -B -ntp versions:update-parent \
59+
-DparentVersion="[${{ matrix.spring-boot-version }}]" \
60+
-DgenerateBackupPoms=false \
61+
-DallowSnapshots=false \
62+
-DforceVersion=true
63+
mvn -B -ntp versions:set-property \
64+
-Dproperty=spring-cloud.version \
65+
-DnewVersion=${{ matrix.spring-cloud-version }} \
66+
-DgenerateBackupPoms=false
67+
mvn -B -ntp versions:set-property \
68+
-Dproperty=java.version \
69+
-DnewVersion=${{ matrix.java-version }} \
70+
-DgenerateBackupPoms=false
71+
3572
- name: Run Maven tests
3673
run: mvn -B -ntp verify
3774

@@ -45,14 +82,18 @@ jobs:
4582
uses: actions/cache@v4
4683
with:
4784
path: /tmp/.buildx-cache
48-
key: ${{ runner.os }}-buildx-${{ github.sha }}
49-
restore-keys: ${{ runner.os }}-buildx-
85+
key: ${{ runner.os }}-buildx-java${{ matrix.java-version }}-boot${{ matrix.spring-boot-version }}-${{ github.sha }}
86+
restore-keys: |
87+
${{ runner.os }}-buildx-java${{ matrix.java-version }}-boot${{ matrix.spring-boot-version }}-
88+
${{ runner.os }}-buildx-
5089
5190
- name: Build test image
5291
run: |
5392
docker build \
54-
--build-arg JAVA_VERSION=${{ env.JAVA_VERSION }} \
93+
--build-arg JAVA_VERSION=${{ matrix.java-version }} \
5594
--build-arg MAVEN_VERSION=${{ env.MAVEN_VERSION }} \
95+
--build-arg SPRING_BOOT_VERSION=${{ matrix.spring-boot-version }} \
96+
--build-arg SPRING_CLOUD_VERSION=${{ matrix.spring-cloud-version }} \
5697
-t config-server:ci-test .
5798
5899
- name: Smoke test default Git backend
@@ -78,7 +119,7 @@ jobs:
78119
run: |
79120
set -euo pipefail
80121
native_dir="$(mktemp -d)"
81-
cat <<'EOF' > "$native_dir/application.yml"
122+
cat <<'EOF' > "$native_dir"/application.yml
82123
example:
83124
message: native-backend
84125
EOF
@@ -124,11 +165,13 @@ jobs:
124165
push: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
125166
platforms: linux/amd64,linux/arm64
126167
tags: |
127-
${{ env.REGISTRY_IMAGE }}:latest
128-
${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.short_sha }}
168+
${{ env.REGISTRY_IMAGE }}:java${{ matrix.java-version }}-boot${{ matrix.spring-boot-version }}
169+
${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.short_sha }}-java${{ matrix.java-version }}-boot${{ matrix.spring-boot-version }}
129170
build-args: |
130-
JAVA_VERSION=${{ env.JAVA_VERSION }}
171+
JAVA_VERSION=${{ matrix.java-version }}
131172
MAVEN_VERSION=${{ env.MAVEN_VERSION }}
173+
SPRING_BOOT_VERSION=${{ matrix.spring-boot-version }}
174+
SPRING_CLOUD_VERSION=${{ matrix.spring-cloud-version }}
132175
labels: |
133176
org.opencontainers.image.source=${{ github.repository }}
134177
org.opencontainers.image.revision=${{ github.sha }}

Dockerfile

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,35 @@
22

33
ARG JAVA_VERSION=21
44
ARG MAVEN_VERSION=3.9.11
5+
ARG SPRING_BOOT_VERSION=4.0.0
6+
ARG SPRING_CLOUD_VERSION=2025.1.0
57

68
FROM maven:${MAVEN_VERSION}-eclipse-temurin-${JAVA_VERSION} AS build
79
ARG JAVA_VERSION
10+
ARG SPRING_BOOT_VERSION
11+
ARG SPRING_CLOUD_VERSION
812
WORKDIR /workspace/app
913

1014
# Resolve dependencies first to leverage Docker layer caching
1115
COPY pom.xml .
12-
RUN mvn versions:set-property \
16+
RUN mvn -B -ntp versions:update-parent \
17+
-DparentVersion="[${SPRING_BOOT_VERSION}]" \
18+
-DgenerateBackupPoms=false \
19+
-DallowSnapshots=false \
20+
-DforceVersion=true
21+
RUN mvn -B -ntp versions:set-property \
22+
-Dproperty=spring-cloud.version \
23+
-DnewVersion=${SPRING_CLOUD_VERSION} \
24+
-DgenerateBackupPoms=false
25+
RUN mvn -B -ntp versions:set-property \
1326
-Dproperty=java.version \
1427
-DnewVersion=${JAVA_VERSION} \
1528
-DgenerateBackupPoms=false
16-
RUN mvn dependency:go-offline
29+
RUN mvn -B -ntp dependency:go-offline
1730

1831
# Build the Spring Cloud Config Server fat jar
1932
COPY src ./src
20-
RUN mvn package -DskipTests
33+
RUN mvn -B -ntp package -DskipTests
2134

2235
FROM eclipse-temurin:${JAVA_VERSION} AS jre-build
2336
ARG JAVA_VERSION

README.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,33 +11,35 @@ An unofficial, minimal Spring Cloud Config Server packaged as a Docker image. Th
1111

1212
```bash
1313
# Run with defaults (Git backend pointing to the sample repo)
14-
docker run --rm -p 8888:8888 emrekgn/spring-cloud-config-server:latest
14+
docker run --rm -p 8888:8888 emrekgn/spring-cloud-config-server:java21-boot4.0.0
1515

1616
# Override Git repository and branch/tag
1717
docker run --rm -p 8888:8888 \
1818
-e CONFIG_GIT_URI=https://github.com/your-org/your-configs \
1919
-e CONFIG_GIT_DEFAULT_LABEL=prod \
20-
emrekgn/spring-cloud-config-server:latest
20+
emrekgn/spring-cloud-config-server:java21-boot4.0.0
2121

2222
# Change server port and activate extra profiles
2323
docker run --rm -p 9090:9090 \
2424
-e SERVER_PORT=9090 \
2525
-e SPRING_PROFILES_ACTIVE=native,git \
26-
emrekgn/spring-cloud-config-server:latest
26+
emrekgn/spring-cloud-config-server:java21-boot4.0.0
2727

2828
# Mount an external application.yml into the container
2929
docker run --rm -p 8888:8888 \
3030
-v "$(pwd)/config/application.yml:/opt/config-server/config/application.yml:ro" \
31-
emrekgn/spring-cloud-config-server:latest
31+
emrekgn/spring-cloud-config-server:java21-boot4.0.0
3232

3333
# Use native (filesystem) backend instead of Git
3434
docker run --rm -p 8888:8888 \
3535
-e SPRING_PROFILES_ACTIVE=native \
3636
-e SPRING_CLOUD_CONFIG_SERVER_NATIVE_SEARCH_LOCATIONS=file:/opt/config-server/native \
3737
-v "$(pwd)/native-config:/opt/config-server/native:ro" \
38-
emrekgn/spring-cloud-config-server:latest
38+
emrekgn/spring-cloud-config-server:java17-boot3.5.8
3939
```
4040

41+
Docker Hub tags follow the pattern `java<JAVA_VERSION>-boot<SPRING_BOOT_VERSION>` (for example `java21-boot4.0.0` or `java17-boot3.5.8`). Choose the combo that matches the runtime you need; each one is built, tested, smoke-checked, and pushed by the workflow described below.
42+
4143
## Build
4244

4345
The Dockerfile accepts build arguments so you can tweak the Temurin JRE version used to build and package the server. `JAVA_VERSION` defaults to `21` (supported values: `17`, `21`, `25`).

0 commit comments

Comments
 (0)