From 9eaaf1c565f1ee5da68e9468bd133f76fcf85b00 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 26 Jul 2022 10:31:11 +0200 Subject: [PATCH] Add Jenkins config Closes gh-719 --- Jenkinsfile | 116 ++++++++++++++++++++++++++++++ ci/openjdk17-vault/Dockerfile | 24 +++++++ ci/pipeline.properties | 17 +++++ pom.xml | 67 ++++++++++++++++- settings.xml | 29 ++++++++ spring-vault-dependencies/pom.xml | 67 ++++++++++++++++- 6 files changed, 318 insertions(+), 2 deletions(-) create mode 100644 Jenkinsfile create mode 100644 ci/openjdk17-vault/Dockerfile create mode 100644 ci/pipeline.properties create mode 100644 settings.xml diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..80444a1d --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,116 @@ +def p = [:] +node { + checkout scm + p = readProperties interpolate: true, file: 'ci/pipeline.properties' +} + +pipeline { + agent none + + triggers { + pollSCM 'H/10 * * * *' + } + + options { + disableConcurrentBuilds() + buildDiscarder(logRotator(numToKeepStr: '14')) + } + + stages { + stage("Docker images") { + parallel { + stage('Publish JDK 17 + Vault Docker image') { + when { + anyOf { + changeset "ci/openjdk17-vault/Dockerfile" + changeset "src/test/bash/install_vault.sh" + changeset "ci/pipeline.properties" + } + } + agent { label 'data' } + options { timeout(time: 20, unit: 'MINUTES') } + + steps { + script { + def image = docker.build("springci/spring-vault-openjdk17-vault:${p['java.main.tag']}-${p['docker.vault.version']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg VAULT=${p['docker.vault.version']} -f ci/openjdk17-vault/Dockerfile .") + docker.withRegistry(p['docker.registry'], p['docker.credentials']) { + image.push() + } + } + } + } + } + } + + stage("test: baseline (Java 17)") { + when { + beforeAgent(true) + anyOf { + branch(pattern: "main|(\\d\\.\\d\\.x)", comparator: "REGEXP") + not { triggeredBy 'UpstreamCause' } + } + } + agent { + label 'data' + } + options { timeout(time: 30, unit: 'MINUTES') } + environment { + ARTIFACTORY = credentials("${p['artifactory.credentials']}") + } + steps { + script { + docker.image("harbor-repo.vmware.com/dockerhub-proxy-cache/springci/spring-vault-openjdk17-vault:${p['java.main.tag']}-${p['docker.vault.version']}").inside(p['docker.java.inside.basic']) { + sh 'src/test/bash/create_certificates.sh' + sh '/opt/vault/vault server -config=$(pwd)/src/test/bash/vault.conf &' + sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml clean dependency:list verify -Dsort -U -B' + } + } + } + } + + stage('Release to artifactory') { + when { + beforeAgent(true) + anyOf { + branch(pattern: "main|(\\d\\.\\d\\.x)", comparator: "REGEXP") + not { triggeredBy 'UpstreamCause' } + } + } + agent { + label 'data' + } + options { timeout(time: 20, unit: 'MINUTES') } + + environment { + ARTIFACTORY = credentials("${p['artifactory.credentials']}") + } + + steps { + script { + docker.image("harbor-repo.vmware.com/dockerhub-proxy-cache/springci/spring-vault-openjdk17-vault:${p['java.main.tag']}-${p['docker.vault.version']}").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} " + + "-Dartifactory.password=${ARTIFACTORY_PSW} " + + "-Dartifactory.staging-repository=libs-snapshot-local " + + "-Dartifactory.build-name=spring-vault " + + "-Dartifactory.build-number=${BUILD_NUMBER} " + + '-Dmaven.test.skip=true clean deploy -U -B' + } + } + } + } + } + + post { + changed { + script { + emailext( + subject: "[${currentBuild.fullDisplayName}] ${currentBuild.currentResult}", + mimeType: 'text/html', + recipientProviders: [[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']], + body: "${currentBuild.fullDisplayName} is reported as ${currentBuild.currentResult}") + } + } + } +} diff --git a/ci/openjdk17-vault/Dockerfile b/ci/openjdk17-vault/Dockerfile new file mode 100644 index 00000000..9b6cfaa8 --- /dev/null +++ b/ci/openjdk17-vault/Dockerfile @@ -0,0 +1,24 @@ +ARG BASE +FROM ${BASE} +# Any ARG statements before FROM are cleared. + +ENV TZ=Etc/UTC +ENV DEBIAN_FRONTEND=noninteractive + +# Copy Vault's install file into the container + +COPY ./src/test/bash/install_vault.sh /opt + +ARG VAULT + +RUN set -eux && \ + sed -i -e 's/archive.ubuntu.com/mirror.one.com/g' /etc/apt/sources.list && \ + sed -i -e 's/security.ubuntu.com/mirror.one.com/g' /etc/apt/sources.list && \ + sed -i -e 's/http/https/g' /etc/apt/sources.list && \ + apt-get update && apt-get install -y apt-transport-https apt-utils gnupg2 wget unzip && \ + echo ${TZ} > /etc/timezone && \ + rm -rf /var/lib/apt/lists/* + +RUN set -eux && \ + cd /opt && \ + /opt/install_vault.sh -v ${VAULT} diff --git a/ci/pipeline.properties b/ci/pipeline.properties new file mode 100644 index 00000000..3dda7465 --- /dev/null +++ b/ci/pipeline.properties @@ -0,0 +1,17 @@ +# Java versions +java.main.tag=17.0.3_7-jdk + +# Docker container images - standard +docker.java.main.image=harbor-repo.vmware.com/dockerhub-proxy-cache/library/eclipse-temurin:${java.main.tag} + +# Supported versions of MongoDB +docker.vault.version=1.11.1 + +# 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 diff --git a/pom.xml b/pom.xml index eab27a06..5c099cba 100644 --- a/pom.xml +++ b/pom.xml @@ -599,7 +599,7 @@ - repo.spring.io + spring-libs-milestone Spring Milestone Repository https://repo.spring.io/libs-milestone-local @@ -784,6 +784,71 @@ + + + + artifactory + + + + spring-libs-snapshot + Spring Snapshot Repository + https://repo.spring.io/libs-snapshot-local + + + + + + + + + + + + org.jfrog.buildinfo + artifactory-maven-plugin + 3.4.0 + + + build-info + + publish + + + + false + + + {{artifactory.server}} + {{artifactory.username}} + {{artifactory.password}} + {{artifactory.staging-repository}} + {{artifactory.staging-repository}} + + + {{artifactory.build-name}} + {{artifactory.build-number}} + {{BUILD_URL}} + + + + + + + + + + + + + org.jfrog.buildinfo + artifactory-maven-plugin + + + + + + diff --git a/settings.xml b/settings.xml new file mode 100644 index 00000000..b3227cc1 --- /dev/null +++ b/settings.xml @@ -0,0 +1,29 @@ + + + + + spring-plugins-release + ${env.ARTIFACTORY_USR} + ${env.ARTIFACTORY_PSW} + + + spring-libs-snapshot + ${env.ARTIFACTORY_USR} + ${env.ARTIFACTORY_PSW} + + + spring-libs-milestone + ${env.ARTIFACTORY_USR} + ${env.ARTIFACTORY_PSW} + + + spring-libs-release + ${env.ARTIFACTORY_USR} + ${env.ARTIFACTORY_PSW} + + + + \ No newline at end of file diff --git a/spring-vault-dependencies/pom.xml b/spring-vault-dependencies/pom.xml index e9e6fc99..5c58d415 100644 --- a/spring-vault-dependencies/pom.xml +++ b/spring-vault-dependencies/pom.xml @@ -227,7 +227,7 @@ - repo.spring.io + spring-libs-milestone Spring Milestone Repository https://repo.spring.io/libs-milestone-local @@ -283,6 +283,71 @@ + + + + artifactory + + + + spring-libs-snapshot + Spring Snapshot Repository + https://repo.spring.io/libs-snapshot-local + + + + + + + + + + + + org.jfrog.buildinfo + artifactory-maven-plugin + 3.4.0 + + + build-info + + publish + + + + false + + + {{artifactory.server}} + {{artifactory.username}} + {{artifactory.password}} + {{artifactory.staging-repository}} + {{artifactory.staging-repository}} + + + {{artifactory.build-name}} + {{artifactory.build-number}} + {{BUILD_URL}} + + + + + + + + + + + + + org.jfrog.buildinfo + artifactory-maven-plugin + + + + + +