gCubeBuilder/Jenkinsfile

288 lines
13 KiB
Groovy
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!groovy
import org.yaml.snakeyaml.Yaml
// set the build options according to the Type of build
def (options, maven_local_repo_path, maven_settings_file) = ['', '', '']
def maven_jdk = 'OpenJDK 8'
def agent_root_folder = '/var/lib/jenkins/.m2'
if (params.Type == 'SNAPSHOT-DRY-RUN') {
echo "Configure Maven for SNAPSHOT-DRY-RUN artifacts"
options = ''
maven_local_repo_path = "local-snapshots"
maven_settings_file = "jenkins-snapshots-dry-run-settings.xml"
}
if (params.Type == 'SNAPSHOT') {
echo "Configure Maven for SNAPSHOT artifacts"
options = ''
maven_local_repo_path = "local-snapshots"
maven_settings_file = "jenkins-snapshots-settings.xml"
}
if (params.Type == 'RELEASE-DRY-RUN') {
echo "Configure Maven for RELEASE-DRY-RUN artifacts"
options = ''
maven_local_repo_path = "local-releases"
maven_settings_file = "jenkins-releases-dry-run-settings.xml"
}
if (params.Type == 'STAGING') {
echo "Configure Maven for STAGING artifacts"
options = ''
maven_local_repo_path = "local-staging"
maven_settings_file = "jenkins-staging-settings.xml"
}
if (params.Type == 'RELEASE') {
echo "Configure Maven for RELEASE artifacts"
options = ''
maven_local_repo_path = "local-releases"
maven_settings_file = "jenkins-releases-settings.xml"
}
echo "Use settings file at ${maven_settings_file}"
echo "Use local repo at ${maven_local_repo_path}"
echo "Release number: ${params.gCube_release_version}"
echo "Clean up gcube local artifacts? ${params.cleanup_gcube_artifacts}"
echo "Clean up all local artifacts? ${params.cleanup_local_repo}"
//locate the release file
String releaseURL = "https://code-repo.d4science.org/gCubeCI/gCubeRelease/raw/branch/master/releases/gcube-${gCube_release_version}.yaml"
println "Querying ${releaseURL}"
//load the release file
def text = releaseURL.toURL().getText()
//parsing
def jsonConfig = new Yaml().load(text)
println jsonConfig.inspect()
assert jsonConfig.gCube_release.Version == params.gCube_release_version: "Release versions do not match!"
echo "Building gCube v. ${jsonConfig.gCube_release.Version}"
echo "Found components:"
jsonConfig.gCube_release.Components.each { println it.key }
pipeline {
// see https://jenkins.io/doc/book/pipeline/syntax/#agent
agent {
label 'CD'
}
// see https://jenkins.io/doc/book/pipeline/syntax/#environment
environment {
JOB_OPTIONS = "${options}"
//make the JVM start a bit faster with basic just-in-time compilation of the code only (-XX:*)
//make maven running in a multi-thread fashion (16 threads, 2 threads on each Core)
MAVEN_OPTS="-Dmaven.artifact.threads=16 -T 2C -XX:+TieredCompilation -XX:TieredStopAtLevel=1 "
AGENT_ROOT_FOLDER = "${agent_root_folder}"
MAVEN_SETTINGS_FILE = "${maven_settings_file}"
MAVEN_LOCAL_REPO = "${agent_root_folder}/${maven_local_repo_path}"
CLEANUP_GCUBE_REPO = "${params.cleanup_gcube_artifacts}"
REMOVE_LOCAL_REPO = "${params.cleanup_local_repo}"
GCUBE_RELEASE_NUMBER = "${params.gCube_release_version}"
PIPELINE_BUILD_NUMBER = "${env.BUILD_NUMBER}"
}
// see https://jenkins.io/doc/book/pipeline/syntax/#parameters
parameters {
choice(name: 'Type',
choices: ['SNAPSHOT-DRY-RUN', 'SNAPSHOT', 'STAGING', 'RELEASE-DRY-RUN', 'RELEASE'],
description: 'The type of artifacts the build is expected to generate')
string(name: 'gCube_release_version',
defaultValue: 'x.y.z',
description: 'The number of the gCube release to build. Sample values: 4.14, 4.15, etc.')
booleanParam(name: 'cleanup_gcube_artifacts',
defaultValue: true,
description: 'Wipe out the gcube artifacts from the local maven repository before the builds?')
booleanParam(name: 'cleanup_local_repo',
defaultValue: true,
description: 'Wipe out the local maven repository before the builds?')
}
//see https://jenkins.io/doc/book/pipeline/syntax/#stages
stages {
stage('clean up before starting') {
steps {
sh '''
echo "REMOVE_LOCAL_REPO: ${REMOVE_LOCAL_REPO}"
echo "CLEANUP_GCUBE_REPO: ${CLEANUP_GCUBE_REPO}"
if [ "$CLEANUP_GCUBE_REPO" = "true" ]; then
echo "Remove gCube artifacts from local repository"
rm -rf $MAVEN_LOCAL_REPO/org/gcube
fi
if [ "$REMOVE_LOCAL_REPO" = "true" ]; then
echo "Create a fresh local repository"
rm -rf $MAVEN_LOCAL_REPO
mkdir -p $MAVEN_LOCAL_REPO
fi
mv "${AGENT_ROOT_FOLDER}/settings.xml" "${AGENT_ROOT_FOLDER}/settings.${PIPELINE_BUILD_NUMBER}"
cp "${AGENT_ROOT_FOLDER}/${MAVEN_SETTINGS_FILE}" "${AGENT_ROOT_FOLDER}/settings.xml"
echo "Done with local repository and settings"
echo "#Build ${PIPELINE_BUILD_NUMBER}" > ${AGENT_ROOT_FOLDER}/build_commits.csv
echo "#Release ${GCUBE_RELEASE_NUMBER}" > ${AGENT_ROOT_FOLDER}/build_commits.csv
date=`date`
echo "#StartTime ${date}" >> ${AGENT_ROOT_FOLDER}/build_commits.csv
echo -e "Component,Version,URL,Build Number" >> ${AGENT_ROOT_FOLDER}/build_commits.csv
'''
}
}
// the maven-parent needs to be built (once) at each execution
stage('build maven-parent') {
steps {
echo build(job: 'maven-parent', wait: true,
parameters: [[$class: 'StringParameterValue', name: 'gcube_settings', value: "${maven_settings_file}"],
[$class: 'StringParameterValue', name: 'local_repo', value: "${maven_local_repo_path}"],
[$class: 'LabelParameterValue', name: 'exec_label', label: "CD", nodeEligibility: [$class: 'AllNodeEligibility']]
]).result
echo "Done with maven-parent"
}
}
stage('build NoDeps components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.NoDeps?.collect { "${it.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with NoDeps components"
}
}
stage('build Core components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.Core?.collect { "${it.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Core components"
}
}
stage('build CoreAuth components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.CoreAuth?.collect { "${it.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with CoreAuth components"
}
}
stage('build CoreSmartGears components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.CoreSmartGears?.collect { "${it.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with CoreSmartGears components"
}
}
stage('build Common components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.Common?.collect { "${it.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Common components"
}
}
stage('build PortalCore components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.PortalCore?.collect { "${it.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Portal-Core components"
}
}
stage('build Enabling components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.Enabling?.collect { "${it.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Enabling components"
}
}
stage('build ClientLibraries components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.ClientLibraries?.collect { "${it?.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with ClientLibraries components"
}
}
stage('build Libraries components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.Libraries?.collect { "${it?.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Libraries components"
}
}
stage('build Plugins components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.Plugins?.collect { "${it?.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Plugins components"
}
}
stage('build Services components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.Services?.collect { "${it?.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Services components"
}
}
stage('build Widgets components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.Widgets?.collect { "${it?.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Widgets components"
}
}
stage('build Portlets components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.Portlets?.collect { "${it?.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Portlets components"
}
}
stage('build Distribution components') {
steps {
buildComponents items: jsonConfig.gCube_release.Components.Distribution?.collect { "${it?.name}" },
"${maven_settings_file}", "${maven_local_repo_path}"
echo "Done with Distribution components"
}
}
}
// post-build actions
post {
always {
script {
sh '''
mv "${AGENT_ROOT_FOLDER}/settings.${PIPELINE_BUILD_NUMBER}" "${AGENT_ROOT_FOLDER}/settings.xml"
mv ${AGENT_ROOT_FOLDER}/build_commits.csv ${AGENT_ROOT_FOLDER}/../build_commits.${PIPELINE_BUILD_NUMBER}.csv
'''
}
echo 'The default maven settings have been restored'
}
success {
echo 'The pipeline worked!'
emailext attachmentsPattern: "${AGENT_ROOT_FOLDER}/../build_commits.${PIPELINE_BUILD_NUMBER}.csv", to: 'jenkinsbuilds@d4science.org',
subject: "[Jenkins build D4S] build ${currentBuild.fullDisplayName} worked",
body: "Build time: ${currentBuild.durationString}. See ${env.BUILD_URL}"
}
failure {
echo 'The pipeline has failed'
mail to: 'jenkinsbuilds@d4science.org',
subject: "[Jenkins build D4S] build ${currentBuild.fullDisplayName} failed",
body: "Something is wrong with ${env.BUILD_URL}"
}
}
}
def buildComponents(args, maven_settings_file, maven_local_repo_path) {
if (args.items) {
parallel args.items?.collectEntries { name ->
["${name}": {
if (name && !"NONE".equalsIgnoreCase(name))
build(job: name,
parameters: [[$class: 'StringParameterValue', name: 'gcube_settings', value: "${maven_settings_file}"],
[$class: 'StringParameterValue', name: 'local_repo', value: "${maven_local_repo_path}"],
[$class: 'LabelParameterValue', name: 'exec_label', label: "CD", nodeEligibility: [$class: 'AllNodeEligibility']]
])
}
]
}
}
}