gCubeBuilder/Jenkinsfile

230 lines
9.3 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'
//def agent_label = 'pipeline-agent-garr' //'pipeline-agent'
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 RELEASE-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 = "${agent_root_folder}/local-releases"
//maven_settings_file = "jenkins-releases-settings.xml"
echo "This will fail. RELEASES are currently disabled until further testing."
}
echo "Use settings file at ${maven_settings_file}"
echo "Use local repo at ${maven_local_repo_path}"
echo "Release number: ${params.gCube_release_version}"
//locate where this release is
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}"
MAVEN_LOCAL_REPO = "${agent_root_folder}/${maven_local_repo_path}"
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.')
}
//see https://jenkins.io/doc/book/pipeline/syntax/#stages
stages {
stage('clean up before starting') {
steps {
sh '''
echo "Create a fresh local repository"
rm -rf $MAVEN_LOCAL_REPO
mkdir -p $MAVEN_LOCAL_REPO
// default the selected maven settings
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"
'''
}
}
// 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 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 {
steps {
// restore the default maven settings
mv "${agent_root_folder}/settings.${PIPELINE_BUILD_NUMBER}" "${agent_root_folder}/settings.xml"
echo 'The default maven settings have been restored'
}
}
success {
echo 'The pipeline worked!'
}
failure {
echo 'The pipeline has failed'
}
}
}
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']]
])
}
]
}
}
}