From 2bf268f14f3a067d33c4bbc3ebd0dbb99f6ca429 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 7 Feb 2022 08:43:09 +0100 Subject: [PATCH] Externalize build properties. Closes #2103. --- CI.adoc | 43 ------------------- Jenkinsfile | 93 +++++++++++------------------------------- ci/pipeline.properties | 29 +++++++++++++ 3 files changed, 53 insertions(+), 112 deletions(-) delete mode 100644 CI.adoc create mode 100644 ci/pipeline.properties diff --git a/CI.adoc b/CI.adoc deleted file mode 100644 index 23745ffa5..000000000 --- a/CI.adoc +++ /dev/null @@ -1,43 +0,0 @@ -= Continuous Integration - -image:https://jenkins.spring.io/buildStatus/icon?job=spring-data-rest%2Fmaster&subject=Moore%20(master)[link=https://jenkins.spring.io/view/SpringData/job/spring-data-rest/] -image:https://jenkins.spring.io/buildStatus/icon?job=spring-data-rest%2F3.1.x&subject=Lovelace%20(3.1.x)[link=https://jenkins.spring.io/view/SpringData/job/spring-data-rest/] -image:https://jenkins.spring.io/buildStatus/icon?job=spring-data-rest%2F2.6.x&subject=Ingalls%20(2.6.x)[link=https://jenkins.spring.io/view/SpringData/job/spring-data-rest/] - -== Running CI tasks locally - -Since this pipeline is purely Docker-based, it's easy to: - -* Debug what went wrong on your local machine. -* Test out a a tweak to your `test.sh` script before sending it out. -* Experiment against a new image before submitting your pull request. - -All of these use cases are great reasons to essentially run what the CI server does on your local machine. - -IMPORTANT: To do this you must have Docker installed on your machine. - -1. `docker run -it --mount type=bind,source="$(pwd)",target=/spring-data-rest-github adoptopenjdk/openjdk8:latest /bin/bash` -+ -This will launch the Docker image and mount your source code at `spring-data-rest-github`. -+ -2. `cd spring-data-rest-github` -+ -Next, run your tests from inside the container: -+ -3. `./mvnw clean dependency:list test -Dsort` (or whatever profile you need to test out) - -Since the container is binding to your source, you can make edits from your IDE and continue to run build jobs. - -If you test building the artifact, do this: - -1. `docker run -it --mount type=bind,source="$(pwd)",target=/spring-data-rest-github adoptopenjdk/openjdk8:latest /bin/bash` -+ -This will launch the Docker image and mount your source code at `spring-data-rest-github`. -+ -2. `cd spring-data-rest-github` -+ -Next, try to package everything up from inside the container: -+ -3. `./mvnw -Pci,snapshot -Dmaven.test.skip=true clean package` - -NOTE: Docker containers can eat up disk space fast! From time to time, run `docker system prune` to clean out old images. diff --git a/Jenkinsfile b/Jenkinsfile index 6072e0884..aa3f5180f 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 @@ -12,7 +18,7 @@ pipeline { } stages { - stage("test: baseline (jdk8)") { + stage("test: baseline (main)") { when { anyOf { branch '3.5.x' @@ -24,12 +30,12 @@ pipeline { } options { timeout(time: 30, unit: 'MINUTES') } environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { script { - docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('springci/spring-data-openjdk8-with-mongodb-4.2.0:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.withRegistry(p['docker.registry'], p['docker.credentials']) { + 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 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' sh 'sleep 10' @@ -50,18 +56,18 @@ pipeline { } } parallel { - stage("test: baseline (jdk11)") { + stage("test: baseline (jdk15") { agent { label 'data' } options { timeout(time: 30, unit: 'MINUTES') } environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { script { - docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('springci/spring-data-openjdk11-with-mongodb-4.2.0:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.withRegistry(p['docker.registry'], p['docker.credentials']) { + docker.image("springci/spring-data-with-mongodb-4.4:${p['java.15.tag']}").inside(p['docker.java.inside.basic']) { sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log' sh 'mongod --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' sh 'sleep 10' @@ -73,41 +79,18 @@ pipeline { } } } - stage("test: baseline (jdk15)") { + stage("test: spring53-next (main)") { agent { label 'data' } options { timeout(time: 30, unit: 'MINUTES') } environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { script { - docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('springci/spring-data-openjdk15-with-mongodb-4.2.0:latest').inside('-v $HOME:/tmp/jenkins-home') { - sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log' - sh 'mongod --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 -Dsort -U -B -Pit,java11' - } - } - } - } - } - stage("test: spring53-next (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.2.0:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.withRegistry(p['docker.registry'], p['docker.credentials']) { + 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 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' sh 'sleep 10' @@ -125,12 +108,12 @@ pipeline { } options { timeout(time: 30, unit: 'MINUTES') } environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { script { - docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('springci/spring-data-openjdk15-with-mongodb-4.2.0:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.withRegistry(p['docker.registry'], p['docker.credentials']) { + docker.image("springci/spring-data-with-mongodb-4.4:${p['java.15.tag']}").inside(p['docker.java.inside.basic']) { sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log' sh 'mongod --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' sh 'sleep 10' @@ -158,13 +141,13 @@ pipeline { options { timeout(time: 20, unit: 'MINUTES') } environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { script { - docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('adoptopenjdk/openjdk8:latest').inside('-v $HOME:/tmp/jenkins-home') { + docker.withRegistry(p['docker.registry'], p['docker.credentials']) { + 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 -s settings.xml -Pci,artifactory ' + '-Dartifactory.server=https://repo.spring.io ' + "-Dartifactory.username=${ARTIFACTORY_USR} " + @@ -178,34 +161,6 @@ pipeline { } } } - stage('Publish documentation') { - when { - branch '3.5.x' - } - agent { - label 'data' - } - options { timeout(time: 20, unit: 'MINUTES') } - - environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') - } - - steps { - script { - docker.withRegistry('', 'hub.docker.com-springbuildmaster') { - docker.image('adoptopenjdk/openjdk8:latest').inside('-v $HOME:/tmp/jenkins-home') { - sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml -Pci,distribute ' + - '-Dartifactory.server=https://repo.spring.io ' + - "-Dartifactory.username=${ARTIFACTORY_USR} " + - "-Dartifactory.password=${ARTIFACTORY_PSW} " + - "-Dartifactory.distribution-repository=temp-private-local " + - '-Dmaven.test.skip=true clean deploy -U -B' - } - } - } - } - } } post { diff --git a/ci/pipeline.properties b/ci/pipeline.properties new file mode 100644 index 000000000..3682b555b --- /dev/null +++ b/ci/pipeline.properties @@ -0,0 +1,29 @@ +# Java versions +java.main.tag=8u312-b07-jdk +java.11.tag=11.0.13_8-jdk +java.15.tag=15.0.2_7-jdk-hotspot + +# Docker container images - standard +docker.java.main.image=eclipse-temurin:${java.main.tag} +docker.java.11.image=eclipse-temurin:${java.11.tag} +docker.java.15.image=adoptopenjdk:${java.15.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 + +# Credentials +docker.registry= +docker.credentials=hub.docker.com-springbuildmaster +artifactory.credentials=02bd1690-b54f-4c9f-819d-a77cb7a9822c