Switch to the new Jenkins Declarative Pipeline syntax.

Use Docker containers to run the stages & steps of the Jenkins CI build.

Use Bash shell scripts to encapsulae the Gradle commands.
This commit is contained in:
John Blum
2021-04-09 12:58:58 -07:00
parent 694752f910
commit 5f4c758b59
7 changed files with 174 additions and 81 deletions

186
Jenkinsfile vendored
View File

@@ -1,103 +1,127 @@
properties([
buildDiscarder(logRotator(numToKeepStr: '10')),
pipelineTriggers([
pipeline {
options {
buildDiscarder(logRotator(numToKeepStr: '15'))
disableConcurrentBuilds()
}
triggers {
cron('@daily')
]),
])
}
def SUCCESS = hudson.model.Result.SUCCESS.toString()
currentBuild.result = SUCCESS
stages {
try {
parallel check: {
stage('Check') {
timeout(time: 10, unit: 'MINUTES') {
node('linux') {
checkout scm
try {
withEnv(["JAVA_HOME=${tool 'jdk8'}"]) {
sh './gradlew clean check --no-daemon --refresh-dependencies --stacktrace'
stage('Build') {
environment {
DOCKER_HUB = credentials('hub.docker.com-springbuildmaster')
}
options {
timeout(time: 15, unit: "MINUTES")
}
steps {
script {
docker.withRegistry('', 'hub.docker.com-springbuildmaster') {
docker.image('adoptopenjdk/openjdk8:latest').inside('-u root -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /tmp:/tmp') {
sh "echo 'Setup build environment...'"
sh "ci/setup.sh"
// Cleanup any prior build system resources
try {
sh "echo 'Clean up GemFire/Geode files & build artifacts...'"
sh "ci/cleanupGemFiles.sh"
sh "ci/cleanupArtifacts.sh"
}
catch (ignore) { }
// Run the SBDG project Gradle build using JDK 8 inside Docker
try {
sh "echo 'Building SBDG...'"
sh "ci/check.sh"
}
catch (e) {
currentBuild.result = "FAILED: build"
throw e
}
finally {
junit '**/build/test-results/*/*.xml'
}
}
}
catch (e) {
currentBuild.result = 'FAILED: check'
throw e
}
finally {
junit '**/build/test-results/*/*.xml'
}
}
}
}
}
if (currentBuild.result == 'SUCCESS') {
parallel artifacts: {
stage('Deploy Artifacts') {
node('linux') {
checkout scm
try {
withCredentials([file(credentialsId: 'spring-signing-secring.gpg', variable: 'SIGNING_KEYRING_FILE')]) {
withCredentials([string(credentialsId: 'spring-gpg-passphrase', variable: 'SIGNING_PASSWORD')]) {
withCredentials([usernamePassword(credentialsId: 'oss-token', passwordVariable: 'OSSRH_PASSWORD', usernameVariable: 'OSSRH_USERNAME')]) {
withCredentials([usernamePassword(credentialsId: '02bd1690-b54f-4c9f-819d-a77cb7a9822c', usernameVariable: 'ARTIFACTORY_USERNAME', passwordVariable: 'ARTIFACTORY_PASSWORD')]) {
withEnv(["JAVA_HOME=${tool 'jdk8'}"]) {
sh './gradlew deployArtifacts finalizeDeployArtifacts --no-daemon --refresh-dependencies --stacktrace -Psigning.secretKeyRingFile=$SIGNING_KEYRING_FILE -Psigning.keyId=$SPRING_SIGNING_KEYID -Psigning.password=$SIGNING_PASSWORD -PossrhUsername=$OSSRH_USERNAME -PossrhPassword=$OSSRH_PASSWORD -PartifactoryUsername=$ARTIFACTORY_USERNAME -PartifactoryPassword=$ARTIFACTORY_PASSWORD'
stage ('Deploy Docs') {
steps {
script {
docker.withRegistry('', 'hub.docker.com-springbuildmaster') {
docker.image('adoptopenjdk/openjdk8:latest').inside("--name ${env.HOSTNAME}Two -u root -v /tmp:/tmp") {
withCredentials([file(credentialsId: 'docs.spring.io-jenkins_private_ssh_key', variable: 'DEPLOY_SSH_KEY')]) {
try {
sh "ci/deployDocs.sh"
}
catch (e) {
currentBuild.result = "FAILED: deploy docs"
throw e
}
}
}
}
}
}
}
stage ('Deploy Artifacts') {
steps {
script {
docker.withRegistry('', 'hub.docker.com-springbuildmaster') {
docker.image('adoptopenjdk/openjdk8:latest').inside("--name ${env.HOSTNAME}One -u root -v /tmp:/tmp") {
withCredentials([file(credentialsId: 'spring-signing-secring.gpg', variable: 'SIGNING_KEYRING_FILE')]) {
withCredentials([string(credentialsId: 'spring-gpg-passphrase', variable: 'SIGNING_PASSWORD')]) {
withCredentials([usernamePassword(credentialsId: 'oss-token', passwordVariable: 'OSSRH_PASSWORD', usernameVariable: 'OSSRH_USERNAME')]) {
withCredentials([usernamePassword(credentialsId: '02bd1690-b54f-4c9f-819d-a77cb7a9822c', usernameVariable: 'ARTIFACTORY_USERNAME', passwordVariable: 'ARTIFACTORY_PASSWORD')]) {
try {
sh "ci/deployArtifacts.sh"
}
catch (e) {
currentBuild.result = "FAILED: deploy artifacts"
throw e
}
}
}
}
}
}
}
catch (e) {
currentBuild.result = 'FAILED: artifacts'
throw e
}
}
}
},
docs: {
stage('Deploy Docs') {
node('linux') {
checkout scm
try {
withCredentials([file(credentialsId: 'docs.spring.io-jenkins_private_ssh_key', variable: 'DEPLOY_SSH_KEY')]) {
withEnv(["JAVA_HOME=${tool 'jdk8'}"]) {
sh './gradlew deployDocs --no-daemon --refresh-dependencies --stacktrace -PdeployDocsSshKeyPath=$DEPLOY_SSH_KEY -PdeployDocsSshUsername=$SPRING_DOCS_USERNAME'
}
}
}
catch (e) {
currentBuild.result = 'FAILED: docs'
throw e
}
}
}
post {
changed {
script {
def BUILD_SUCCESS = hudson.model.Result.SUCCESS.toString()
def buildStatus = currentBuild.result
def buildNotSuccess = !BUILD_SUCCESS.equals(buildStatus)
def previousBuildStatus = currentBuild.previousBuild?.result
def previousBuildNotSuccess = !BUILD_SUCCESS.equals(previousBuildStatus)
if (buildNotSuccess || previousBuildNotSuccess) {
def RECIPIENTS = [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']]
def subject = "${buildStatus}: Build ${env.JOB_NAME} ${env.BUILD_NUMBER} status is now ${buildStatus}"
def details = "The build status changed to ${buildStatus}. For details see ${env.BUILD_URL}"
emailext(subject: subject, body: details, recipientProviders: RECIPIENTS, to: "$GEODE_TEAM_EMAILS")
slackSend(color: (currentBuild.currentResult == 'SUCCESS') ? 'good' : 'danger',
channel: '#spring-data-dev',
message: "${currentBuild.fullDisplayName} - `${currentBuild.currentResult}`\n${env.BUILD_URL}")
}
}
}
}
}
finally {
def buildStatus = currentBuild.result
def buildNotSuccess = !SUCCESS.equals(buildStatus)
def lastBuildNotSuccess = !SUCCESS.equals(currentBuild.previousBuild?.result)
if (buildNotSuccess || lastBuildNotSuccess) {
stage('Notify') {
node {
final def RECIPIENTS = [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']]
def subject = "${buildStatus}: Build ${env.JOB_NAME} ${env.BUILD_NUMBER} status is now ${buildStatus}"
def details = "The build status changed to ${buildStatus}. For details see ${env.BUILD_URL}"
emailext(
subject: subject,
body: details,
recipientProviders: RECIPIENTS,
to: "$GEODE_TEAM_EMAILS"
)
}
}
}
}

6
ci/check.sh Normal file
View File

@@ -0,0 +1,6 @@
#!/bin/bash -x
set -eou pipefail
GRADLE_OPTS="-Duser.name=jenkins -Djava.io.tmpdir=/tmp -Dgradle.user.home=/tmp/geode/build-gradle-cache" \
./gradlew clean check --no-daemon --refresh-dependencies --stacktrace

5
ci/cleanupArtifacts.sh Normal file
View File

@@ -0,0 +1,5 @@
#!/bin/bash -x
rm -Rf ./.gradle
rm -Rf ./.m2
exit 0

9
ci/cleanupGemFiles.sh Normal file
View File

@@ -0,0 +1,9 @@
#!/bin/bash -x
rm -Rf `find . -name "BACKUPDEFAULT*"`
rm -Rf `find . -name "ConfigDiskDir*"`
rm -Rf `find . -name "locator*" | grep -v "src" | grep -v "locator-application"`
rm -Rf `find . -name "newDB"`
rm -Rf `find . -name "server" | grep -v "src"`
rm -Rf `find . -name "*.log"`
exit 0

20
ci/deployArtifacts.sh Normal file
View File

@@ -0,0 +1,20 @@
#!/bin/bash -x
set -eou pipefail
echo "Deploying artifacts on host [$HOSTNAME]"
# User ID 1001 is "jenkins"
# Group ID 1001 is "jenkins"
# Syntax: `chown -R userId:groupId .`
chown -R 1001:1001 .
GRADLE_OPTS="-Duser.name=jenkins -Djava.io.tmpdir=/tmp -Dgradle.user.home=/tmp/geode/artifacts-gradle-cache" \
./gradlew deployArtifacts finalizeDeployArtifacts --no-build-cache --no-configuration-cache --no-daemon --stacktrace \
-PartifactoryUsername=$ARTIFACTORY_USERNAME \
-PartifactoryPassword=$ARTIFACTORY_PASSWORD \
-PossrhUsername=$OSSRH_USERNAME \
-PossrhPassword=$OSSRH_PASSWORD \
-Psigning.keyId=$SPRING_SIGNING_KEYID \
-Psigning.password=$SIGNING_PASSWORD \
-Psigning.secretKeyRingFile=$SIGNING_KEYRING_FILE

15
ci/deployDocs.sh Normal file
View File

@@ -0,0 +1,15 @@
#!/bin/bash -x
set -eou pipefail
echo "Deploying docs on host [$HOSTNAME]"
# User ID 1001 is "jenkins"
# Group ID 1001 is "jenkins"
# Syntax: `chown -R userId:groupId .`
chown -R 1001:1001 .
GRADLE_OPTS="-Duser.name=jenkins -Djava.io.tmpdir=/tmp -Dgradle.user.home=/tmp/geode/docs-gradle-cache" \
./gradlew deployDocs --no-daemon --stacktrace \
-PdeployDocsSshKeyPath=$DEPLOY_SSH_KEY \
-PdeployDocsSshUsername=$SPRING_DOCS_USERNAME

14
ci/setup.sh Normal file
View File

@@ -0,0 +1,14 @@
#!/bin/bash -x
# User ID 1001 is "jenkins"
# Group ID 1001 is "jenkins"
# Syntax: `chown -R userId:groupId .`
echo "Logged in as user [$USER] with home directory [$HOME] in the current working directory [$PWD]"
chown -R 1001:1001 .
mkdir -p /tmp/geode/artifacts-gradle-cache
mkdir -p /tmp/geode/build-gradle-cache
mkdir -p /tmp/geode/docs-gradle-cache
echo "Logging into Docker..."
docker login --username ${DOCKER_HUB_USR} --password ${DOCKER_HUB_PSW}
exit 0