From f62feac42185c8d35e5359cb129152b6b50fdd79 Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Tue, 25 Jan 2022 11:28:53 -0600 Subject: [PATCH] Externalize build properties. By reading a properties file from an external location, it is possible to inject a consistent set of properties from Spring Data Build. This also supports repeatable builds. Closes #3949. --- Jenkinsfile | 103 +++++++++--------- ci/openjdk11-mongodb-4.4/Dockerfile | 7 +- .../Dockerfile | 7 +- ci/openjdk8-mongodb-4.0/Dockerfile | 7 +- ci/openjdk8-mongodb-4.4/Dockerfile | 13 ++- ci/openjdk8-mongodb-5.0/Dockerfile | 7 +- ci/pipeline.properties | 24 ++++ 7 files changed, 101 insertions(+), 67 deletions(-) rename ci/{openjdk16-mongodb-4.4 => openjdk17-mongodb-4.4}/Dockerfile (73%) create mode 100644 ci/pipeline.properties diff --git a/Jenkinsfile b/Jenkinsfile index 5a422ab49..81b5fead7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,3 +1,9 @@ +def p = [:] +node { + checkout scm + p = readProperties interpolate: true, file: 'ci/pipeline.properties' +} + pipeline { agent none @@ -14,64 +20,76 @@ pipeline { stages { stage("Docker images") { parallel { - stage('Publish JDK 8 + MongoDB 5.0') { + stage('Publish JDK (main) + MongoDB 4.0') { when { - changeset "ci/openjdk8-mongodb-5.0/**" + anyOf { + changeset "ci/openjdk8-mongodb-4.0/**" + changeset "ci/pipeline.properties" + } } agent { label 'data' } options { timeout(time: 30, unit: 'MINUTES') } steps { script { - def image = docker.build("springci/spring-data-openjdk8-with-mongodb-5.0.0", "ci/openjdk8-mongodb-5.0/") - docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - image.push() - } + def image = docker.build("springci/spring-data-with-mongodb-4.0:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.4.0.version']} ci/openjdk8-mongodb-4.0/") + docker.withRegistry('', 'hub.docker.com-springbuildmaster') { + image.push() } } } - stage('Publish JDK 8 + MongoDB 4.0') { + } + stage('Publish JDK (main) + MongoDB 4.4') { when { - changeset "ci/openjdk8-mongodb-4.0/**" + anyOf { + changeset "ci/openjdk8-mongodb-4.4/**" + changeset "ci/pipeline.properties" + } } agent { label 'data' } options { timeout(time: 30, unit: 'MINUTES') } steps { script { - def image = docker.build("springci/spring-data-openjdk8-with-mongodb-4.0.23", "ci/openjdk8-mongodb-4.0/") + def image = docker.build("springci/spring-data-with-mongodb-4.4:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.4.4.version']} ci/openjdk8-mongodb-4.4/") docker.withRegistry('', 'hub.docker.com-springbuildmaster') { image.push() } } } } - stage('Publish JDK 8 + MongoDB 4.4') { + stage('Publish JDK (main) + MongoDB 5.0') { when { - changeset "ci/openjdk8-mongodb-4.4/**" + anyOf { + changeset "ci/openjdk8-mongodb-5.0/**" + changeset "ci/pipeline.properties" + } } agent { label 'data' } options { timeout(time: 30, unit: 'MINUTES') } steps { script { - def image = docker.build("springci/spring-data-openjdk8-with-mongodb-4.4.4", "ci/openjdk8-mongodb-4.4/") - docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - image.push() - } - } - } - } - stage('Publish JDK 16 + MongoDB 4.4') { + def image = docker.build("springci/spring-data-with-mongodb-5.0:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.5.0.version']} ci/openjdk8-mongodb-5.0/") + docker.withRegistry('', 'hub.docker.com-springbuildmaster') { + image.push() + } + } + } + } + stage('Publish JDK (LTS) + MongoDB 4.4') { when { - changeset "ci/openjdk16-mongodb-4.4/**" + anyOf { + changeset "ci/openjdk17-mongodb-4.4/**" + changeset "ci/pipeline.properties" + } } agent { label 'data' } options { timeout(time: 30, unit: 'MINUTES') } steps { script { - def image = docker.build("springci/spring-data-openjdk16-with-mongodb-4.4.4", "ci/openjdk16-mongodb-4.4/") + def image = docker.build("springci/spring-data-with-mongodb-4.4:${p['java.lts.tag']}", "--build-arg BASE=${p['docker.java.lts.image']} --build-arg MONGODB=${p['docker.mongodb.4.4.version']} ci/openjdk16-mongodb-4.4/") docker.withRegistry('', 'hub.docker.com-springbuildmaster') { image.push() } @@ -81,7 +99,7 @@ pipeline { } } - stage("test: baseline (jdk8)") { + stage("test: baseline (main)") { when { beforeAgent(true) anyOf { @@ -99,7 +117,7 @@ pipeline { steps { script { docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('springci/spring-data-openjdk8-with-mongodb-4.0.23:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.image("springci/spring-data-with-mongodb-4.0:${p['java.main.tag']}").inside(p['docker.java.inside.basic']) { sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log' sh 'mongod --setParameter transactionLifetimeLimitSeconds=90 --setParameter maxTransactionLockRequestTimeoutMillis=10000 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' sh 'sleep 10' @@ -121,31 +139,7 @@ pipeline { } } parallel { - stage("test: mongodb 4.0 (jdk8)") { - agent { - label 'data' - } - options { timeout(time: 30, unit: 'MINUTES') } - environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') - } - steps { - script { - docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('springci/spring-data-openjdk8-with-mongodb-4.0.23:latest').inside('-v $HOME:/tmp/jenkins-home') { - sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log' - sh 'mongod --setParameter transactionLifetimeLimitSeconds=90 --setParameter maxTransactionLockRequestTimeoutMillis=10000 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' - sh 'sleep 10' - sh 'mongo --eval "rs.initiate({_id: \'rs0\', members:[{_id: 0, host: \'127.0.0.1:27017\'}]});"' - sh 'sleep 15' - sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml clean dependency:list test -Duser.name=jenkins -Dsort -U -B' - } - } - } - } - } - - stage("test: mongodb 4.4 (jdk8)") { + stage("test: mongodb 4.4 (main)") { agent { label 'data' } @@ -156,7 +150,7 @@ pipeline { steps { script { docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('springci/spring-data-openjdk8-with-mongodb-4.4.4:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.image("springci/spring-data-with-mongodb-4.4:${p['java.main.tag']}").inside(p['docker.java.inside.basic']) { sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log' sh 'mongod --setParameter transactionLifetimeLimitSeconds=90 --setParameter maxTransactionLockRequestTimeoutMillis=10000 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' sh 'sleep 10' @@ -169,7 +163,7 @@ pipeline { } } - stage("test: mongodb 5.0 (jdk8)") { + stage("test: mongodb 5.0 (main)") { agent { label 'data' } @@ -180,7 +174,7 @@ pipeline { steps { script { docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('springci/spring-data-openjdk8-with-mongodb-5.0.0:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.image("springci/spring-data-with-mongodb-5.0:${p['java.main.tag']}").inside(p['docker.java.inside.basic']) { sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log' sh 'mongod --setParameter transactionLifetimeLimitSeconds=90 --setParameter maxTransactionLockRequestTimeoutMillis=10000 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' sh 'sleep 10' @@ -193,7 +187,7 @@ pipeline { } } - stage("test: baseline (jdk16)") { + stage("test: baseline (LTS)") { agent { label 'data' } @@ -204,7 +198,8 @@ pipeline { steps { script { docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('springci/spring-data-openjdk16-with-mongodb-4.4.4:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.image("springci/spring-data-with-mongodb-4.4:${p['java.lts.tag']}").inside(p['docker.java.inside.basic']) { + alwaysPull true sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log' sh 'mongod --setParameter transactionLifetimeLimitSeconds=90 --setParameter maxTransactionLockRequestTimeoutMillis=10000 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' sh 'sleep 10' @@ -239,7 +234,7 @@ pipeline { steps { script { docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('adoptopenjdk/openjdk8:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) { sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -v' sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml -Pci,artifactory ' + '-Dartifactory.server=https://repo.spring.io ' + diff --git a/ci/openjdk11-mongodb-4.4/Dockerfile b/ci/openjdk11-mongodb-4.4/Dockerfile index 7de227c4d..abacb005e 100644 --- a/ci/openjdk11-mongodb-4.4/Dockerfile +++ b/ci/openjdk11-mongodb-4.4/Dockerfile @@ -1,4 +1,7 @@ -FROM adoptopenjdk/openjdk11:latest +ARG BASE +FROM ${BASE} +# Any ARG statements before FROM are cleared. +ARG MONGODB ENV TZ=Etc/UTC ENV DEBIAN_FRONTEND=noninteractive @@ -13,6 +16,6 @@ RUN set -eux; \ echo ${TZ} > /etc/timezone; RUN apt-get update ; \ - apt-get install -y mongodb-org=4.4.4 mongodb-org-server=4.4.4 mongodb-org-shell=4.4.4 mongodb-org-mongos=4.4.4 mongodb-org-tools=4.4.4 ; \ + apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} ; \ apt-get clean; \ rm -rf /var/lib/apt/lists/*; diff --git a/ci/openjdk16-mongodb-4.4/Dockerfile b/ci/openjdk17-mongodb-4.4/Dockerfile similarity index 73% rename from ci/openjdk16-mongodb-4.4/Dockerfile rename to ci/openjdk17-mongodb-4.4/Dockerfile index 5f49272c4..abacb005e 100644 --- a/ci/openjdk16-mongodb-4.4/Dockerfile +++ b/ci/openjdk17-mongodb-4.4/Dockerfile @@ -1,4 +1,7 @@ -FROM adoptopenjdk/openjdk16:latest +ARG BASE +FROM ${BASE} +# Any ARG statements before FROM are cleared. +ARG MONGODB ENV TZ=Etc/UTC ENV DEBIAN_FRONTEND=noninteractive @@ -13,6 +16,6 @@ RUN set -eux; \ echo ${TZ} > /etc/timezone; RUN apt-get update ; \ - apt-get install -y mongodb-org=4.4.4 mongodb-org-server=4.4.4 mongodb-org-shell=4.4.4 mongodb-org-mongos=4.4.4 mongodb-org-tools=4.4.4 ; \ + apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} ; \ apt-get clean; \ rm -rf /var/lib/apt/lists/*; diff --git a/ci/openjdk8-mongodb-4.0/Dockerfile b/ci/openjdk8-mongodb-4.0/Dockerfile index bb75ccfc1..99586b796 100644 --- a/ci/openjdk8-mongodb-4.0/Dockerfile +++ b/ci/openjdk8-mongodb-4.0/Dockerfile @@ -1,4 +1,7 @@ -FROM adoptopenjdk/openjdk8:latest +ARG BASE +FROM ${BASE} +# Any ARG statements before FROM are cleared. +ARG MONGODB ENV TZ=Etc/UTC ENV DEBIAN_FRONTEND=noninteractive @@ -13,6 +16,6 @@ RUN RUN set -eux; \ echo ${TZ} > /etc/timezone; RUN apt-get update ; \ - apt-get install -y mongodb-org=4.0.23 mongodb-org-server=4.0.23 mongodb-org-shell=4.0.23 mongodb-org-mongos=4.0.23 mongodb-org-tools=4.0.23 ; \ + apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} ; \ apt-get clean; \ rm -rf /var/lib/apt/lists/*; diff --git a/ci/openjdk8-mongodb-4.4/Dockerfile b/ci/openjdk8-mongodb-4.4/Dockerfile index f9a814533..87e212dbf 100644 --- a/ci/openjdk8-mongodb-4.4/Dockerfile +++ b/ci/openjdk8-mongodb-4.4/Dockerfile @@ -1,4 +1,7 @@ -FROM adoptopenjdk/openjdk8:latest +ARG BASE +FROM ${BASE} +# Any ARG statements before FROM are cleared. +ARG MONGODB ENV TZ=Etc/UTC ENV DEBIAN_FRONTEND=noninteractive @@ -14,7 +17,7 @@ RUN set -eux; \ RUN apt-get update ; \ ln -T /bin/true /usr/bin/systemctl ; \ - apt-get install -y mongodb-org=4.4.4 mongodb-org-server=4.4.4 mongodb-org-shell=4.4.4 mongodb-org-mongos=4.4.4 mongodb-org-tools=4.4.4 ; \ - rm /usr/bin/systemctl ; \ - apt-get clean; \ - rm -rf /var/lib/apt/lists/*; + apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} ; \ + rm /usr/bin/systemctl ; \ + apt-get clean ; \ + rm -rf /var/lib/apt/lists/* ; diff --git a/ci/openjdk8-mongodb-5.0/Dockerfile b/ci/openjdk8-mongodb-5.0/Dockerfile index 53509efd0..127d2693b 100644 --- a/ci/openjdk8-mongodb-5.0/Dockerfile +++ b/ci/openjdk8-mongodb-5.0/Dockerfile @@ -1,4 +1,7 @@ -FROM adoptopenjdk/openjdk8:latest +ARG BASE +FROM ${BASE} +# Any ARG statements before FROM are cleared. +ARG MONGODB ENV TZ=Etc/UTC ENV DEBIAN_FRONTEND=noninteractive @@ -15,6 +18,6 @@ RUN set -eux; \ echo ${TZ} > /etc/timezone; RUN apt-get update; \ - apt-get install -y mongodb-org=5.0.3 mongodb-org-server=5.0.3 mongodb-org-shell=5.0.3 mongodb-org-mongos=5.0.3 mongodb-org-tools=5.0.3; \ + apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} ; \ apt-get clean; \ rm -rf /var/lib/apt/lists/*; diff --git a/ci/pipeline.properties b/ci/pipeline.properties new file mode 100644 index 000000000..5d91102d2 --- /dev/null +++ b/ci/pipeline.properties @@ -0,0 +1,24 @@ +# Java versions +java.main.tag=8u312-b07-jdk +java.next.tag=11.0.13_8-jdk +java.lts.tag=17.0.1_12-jdk + +# Docker container images - standard +docker.java.main.image=eclipse-temurin:${java.main.tag} +docker.java.next.image=eclipse-temurin:${java.next.tag} +docker.java.lts.image=eclipse-temurin:${java.lts.tag} + +# Supported versions of MongoDB +docker.mongodb.4.0.version=4.0.23 +docker.mongodb.4.4.version=4.4.4 +docker.mongodb.5.0.version=5.0.3 + +# Supported versions of Redis +docker.redis.6.version=6.2.4 + +# Supported versions of Cassandra +docker.cassandra.3.version=3.11.10 + +# Docker environment settings +docker.java.inside.basic=-v $HOME:/tmp/jenkins-home +docker.java.inside.docker=-u root -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v $HOME:/tmp/jenkins-home