From c0cecd97903db13b7094bb71bc8cf643e3218bfe Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Thu, 13 Oct 2022 17:35:13 +0200 Subject: [PATCH 01/12] Delete 'images/FlowChartgCubeDeployer.png' --- images/FlowChartgCubeDeployer.png | Bin 58994 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/FlowChartgCubeDeployer.png diff --git a/images/FlowChartgCubeDeployer.png b/images/FlowChartgCubeDeployer.png deleted file mode 100644 index eeec902354b2c55b2423512312b8ba57c9b6d742..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58994 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 From eb8b09115bfb54f72b31d5205a8d7b5b589c80ca Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Mon, 17 Oct 2022 10:04:59 +0200 Subject: [PATCH 02/12] merge and removed spaces --- Jenkinsfile | 71 ++++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index cec8162..6089290 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,12 +19,12 @@ if ("${params.gCube_release_version}" || "${params.RELEASE_URL}"){ //locate the release file releaseURL = "https://code-repo.d4science.org/gCubeCI/gCubeReleases/raw/branch/master/open/gcube-${gCube_release_version}.yaml" }else{ - releaseURL = "${params.RELEASE_URL}" + releaseURL = "${params.RELEASE_URL}" } //load the release file text = releaseURL.toURL().getText() //parsing - yamlConfig = new Yaml().load(text) + yamlConfig = new Yaml().load(text) if (verbose) println yamlConfig.inspect() echo "Building gCube v. ${yamlConfig.gCube_release.Version}" @@ -55,33 +55,33 @@ pipeline { environment { AGENT_ROOT_FOLDER = "${agent_root_folder}" -// folder where all the pending deployment will be added +// folder where all the pending deployment will be added PENDING_DEPLOY_FOLDER="${agent_root_folder}/CD/" ANSIBLE_ROOT_FOLDER = "${agent_root_folder}/ansible-repos/ansible-playbooks/d4science-ghn-cluster/CD" PIPELINE_BUILD_NUMBER = "${env.BUILD_NUMBER}" -// deploy file related to the current pipeline job +// deploy file related to the current pipeline job DEPLOY_FILE = "${PENDING_DEPLOY_FOLDER}deploy.${PIPELINE_BUILD_NUMBER}.csv" BACKUP_FILE = "${PENDING_DEPLOY_FOLDER}deploy.${PIPELINE_BUILD_NUMBER}.bck" - // deploy folder that contains all the pending jobs associated to the current pipeline execution + // deploy folder that contains all the pending jobs associated to the current pipeline execution DEPLOY_FOLDER= "${WORKSPACE}/CD-${PIPELINE_BUILD_NUMBER}" - // artifacts coordinates + // artifacts coordinates TRIGGER_JOB= "${params.TRIGGER_JOB}" TRIGGER_VERSION= "${params.TRIGGER_VERSION}" TRIGGER_HOST="${params.TRIGGER_HOST}" - // enable the ContinuousDeployment if TRUE + // enable the ContinuousDeployment if TRUE TRIGGER_CD="${params.TRIGGER_CD}" - // Useful to identify the remote YAML file + // Useful to identify the remote YAML file GCUBE_RELEASE_NUMBER = "${params.gCube_release_version}" - //Category name of the components candidates to the remote deployment + //Category name of the components candidates to the remote deployment DEPLOY_CATEGORY="${env.DEPLOY_CATEGORY}" - //Job name of the release pipeline + //Job name of the release pipeline RELEASE_JOB='gCubeBuilder' - //URL to the YAML file. Used alternatively to RELEASE_JOB + //URL to the YAML file. Used alternatively to RELEASE_JOB RELEASE_URL= "${params.RELEASE_URL}" - // username of ReleaseManager. Used for limiting the preproduction deployments + // username of ReleaseManager. Used for limiting the preproduction deployments RELEASE_MANAGER_USER='roberto.cirillo' - // name of Smartgears distribution group, defined in the yaml file ( only for release deployments) - DISTRIBUTION_CATEGORY='Distribution' + // name of Smartgears distribution group, defined in the yaml file ( only for release deployments) + DISTRIBUTION_CATEGORY='Distribution' } parameters { @@ -132,11 +132,11 @@ pipeline { echo 'Cron build enabled. Deploy from system ongoing' script { echo "pipeline was triggered by ${params.TRIGGER_JOB}" - println("Going to deploy all the pending deployments") + println("Going to deploy all the pending deployments") def deployFolder="CD-${env.BUILD_NUMBER}"; - parseDeployPendingJobs(deployFolder); + parseDeployPendingJobs(deployFolder); } - + } } stage('Nothing to do ') { @@ -147,11 +147,10 @@ pipeline { environment name: 'IS_SCHEDULED', value: 'False' } } - } steps { echo 'Going to sleep' - sh ' exit 1; ' + sh ' exit 1; ' } } stage('New pending deploy ') { @@ -172,10 +171,10 @@ pipeline { echo "component ${TRIGGER_JOB} already added. Nothing to add." else echo "${TRIGGER_JOB},${TRIGGER_VERSION},${TRIGGER_HOST}" >> ${DEPLOY_FILE} - fi - ''' - // the following catch give always an error in order to return a feedback UNSTABLE to the final user since the deploy is still not performed. - // Not sure this is the best approach + fi + ''' + // the following catch give always an error in order to return a feedback UNSTABLE to the final user since the deploy is still not performed. + // Not sure this is the best approach catchError(buildResult: 'UNSTABLE', stageResult: 'UNSTABLE') { sh(""" exit 126; @@ -193,7 +192,7 @@ pipeline { triggeredBy 'BuildUpstreamCause' triggeredBy 'UpstreamCause' } - expression { params.TRIGGER_JOB != "${RELEASE_JOB}" } + expression { params.TRIGGER_JOB != "${RELEASE_JOB}" } } steps { script{ @@ -206,7 +205,7 @@ pipeline { } } - + } } stage('Deploy from gCubeRelease ') { @@ -214,10 +213,10 @@ pipeline { anyOf{ triggeredBy 'BuildUpstreamCause' triggeredBy 'UpstreamCause' - //added just for testing . To Remove. + //added just for testing . To Remove. triggeredBy cause: "UserIdCause", detail: "${RELEASE_MANAGER_USER}" } - // we should improve this conditional check + // we should improve this conditional check equals(actual: "${params.TRIGGER_JOB}", expected: "${RELEASE_JOB}") } steps { @@ -228,14 +227,14 @@ pipeline { }else { println ("CATEGORIES NOT FOUND ON YAML FILE. SKIP TO NEXT STAGE");} } } - } + } stage('Deploy manually ') { when{ allOf{ environment name: 'IS_SCHEDULED', value: 'False'; triggeredBy 'UserIdCause' } - expression { params.TRIGGER_JOB != "${RELEASE_JOB}" } + expression { params.TRIGGER_JOB != "${RELEASE_JOB}" } } steps { echo "Cron build disabled. Pipeline executed Manually. New deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing" @@ -278,7 +277,7 @@ pipeline { def deploy(String service, String version, String host){ def now = new Date(); println("Going to deploy the service "+service+" with version: "+version+" on target: "+host); - def statusCode = sh( script: "cd $ANSIBLE_ROOT_FOLDER;git pull;./deployService.sh $service $version $host;", returnStdout: true); + def statusCode = sh( script: "cd $DEPLOY_ROOT_FOLDER;./deployService.sh $service $version $host;", returnStdout: true); sh(""" echo " last exit code \$?"; """) @@ -330,12 +329,12 @@ def parseDeployPendingJobs( def deployFolder){ for (def record : records) { println("Processing record: "+record) serviceList += "${record.get(0)},${record.get(1)},${record.get(2)}"; - } + } sh "rm ${file.path}" } sh "rm -Rf ${deployFolder}" deployJobs(serviceList.unique()) - } + } } //Deploy jobs from an input list with the following elements: serviceName,serviceVersion,targetHost. Create a new stage for any job def deployJobs(def serviceList){ @@ -349,7 +348,7 @@ def deployJobs(def serviceList){ } } } - + } //Deploy only release components. All the component are passed as: componentName,componentVersion def deployReleaseJobs(def serviceList, String smartgears){ @@ -362,7 +361,7 @@ def deployReleaseJobs(def serviceList, String smartgears){ if (smartgears) deployRelease(service[0], service[ 1 ], smartgears); else - deployRelease(service[0], service[ 1 ], null); + deployRelease(service[0], service[ 1 ], null); } } } @@ -376,7 +375,7 @@ def deployRelease(def categoryList, def yaml){ if (categories.contains(group_name)){ for ( def category : categories){ if("${group_name}" == "$category"){ - if (category == "${DISTRIBUTION_CATEGORY}"){ + if (category == "${DISTRIBUTION_CATEGORY}"){ //searching smartgears-distribution version in Distribution component of defined inside the yaml file def sg= component_list?.collect{ if ("$it.name" == 'smartgears-distribution'){ return "$it.version"; }} smartgears=(sg !=null ) ? sg[0] : null @@ -388,5 +387,5 @@ def deployRelease(def categoryList, def yaml){ } } } - deployReleaseJobs(releaseList, smartgears); + deployReleaseJobs(releaseList, smartgears); } \ No newline at end of file From f48df8bc6a76f8f4a9e6a2cb64381ec1e90f8791 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Mon, 17 Oct 2022 10:36:27 +0200 Subject: [PATCH 03/12] add Environment variable section to README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 21a978e..c71c91e 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,11 @@ Jenkins Pipeline script to manage one or more gCube components deployment * Manually from Jenkins GUI ## Expected environment variables +The variables below must be specified as environment variables on the agent where the deployments will be executed: +* IS_SCHEDULED (True | False): if true all the deployment requests will be performed periodically as specified by cron +* ENVIRONMENT: ( DEV | PREPROD | PROD) Indicates the target environment where will be deployed all the artifacts +* DEPLOY_CATEGORY: (Related to release build) one or more Component group on yaml file where search the components to deploy +* CD: (Continuous Deployment: True | False) if True the remote deploy will be performed ## References * [Jenkins Pipeline](https://jenkins.io/doc/book/pipeline/) From 0c3d39c63dac2f0286df500ff5cceab6fbcd2565 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Mon, 17 Oct 2022 16:32:53 +0200 Subject: [PATCH 04/12] remove exit 1 from Nothing to do stage --- Jenkinsfile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6089290..9919c97 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -141,16 +141,14 @@ pipeline { } stage('Nothing to do ') { when{ - anyOf{ - allOf{ - triggeredBy 'TimerTrigger' - environment name: 'IS_SCHEDULED', value: 'False' - } + allOf{ + triggeredBy 'TimerTrigger' + environment name: 'IS_SCHEDULED', value: 'False' } } steps { echo 'Going to sleep' - sh ' exit 1; ' + sh ' exit 0; ' } } stage('New pending deploy ') { From 59c1d9741ad4644ce9964e4ec52cb79415ad5cc4 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Tue, 18 Oct 2022 10:49:34 +0200 Subject: [PATCH 05/12] set RELEASE_JOB name to Pipeline-gCubeBuilder --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 9919c97..403c8a7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -75,7 +75,7 @@ pipeline { //Category name of the components candidates to the remote deployment DEPLOY_CATEGORY="${env.DEPLOY_CATEGORY}" //Job name of the release pipeline - RELEASE_JOB='gCubeBuilder' + RELEASE_JOB='Pipeline-gCubeBuilder' //URL to the YAML file. Used alternatively to RELEASE_JOB RELEASE_URL= "${params.RELEASE_URL}" // username of ReleaseManager. Used for limiting the preproduction deployments From 8076da5291061cab79d1d777932f0b39a84173c7 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Tue, 18 Oct 2022 10:53:42 +0200 Subject: [PATCH 06/12] remove unused variable --- Jenkinsfile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 403c8a7..c490f00 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -99,10 +99,7 @@ pipeline { description: 'Set to false to avoid current deploy') string(name: 'gCube_release_version', defaultValue: '', - description: 'The number of the gCube release. Leave blank if executed outside gCube release.') - string(name: 'report_number', - defaultValue: '', - description: 'The build report number on Git to pull the notes. Leave blank if executed outside gCube release.') + description: 'The number of the current gCube release. Leave blank if executed outside gCube release.') string(name: 'RELEASE_URL', defaultValue: '', description: 'URL to the yaml file. Leave blank if executed outside gCube release.') From 83336959599adde24ec71a8c3fbee03811ed88b7 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Mon, 24 Oct 2022 14:41:28 +0200 Subject: [PATCH 07/12] replace DEPLOY_ROOT_FOLDER var with ANSIBLE_ROOT_FOLDER --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index c490f00..ef64a66 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -272,7 +272,7 @@ pipeline { def deploy(String service, String version, String host){ def now = new Date(); println("Going to deploy the service "+service+" with version: "+version+" on target: "+host); - def statusCode = sh( script: "cd $DEPLOY_ROOT_FOLDER;./deployService.sh $service $version $host;", returnStdout: true); + def statusCode = sh( script: "cd $ANSIBLE_ROOT_FOLDER;./deployService.sh $service $version $host;", returnStdout: true); sh(""" echo " last exit code \$?"; """) From 2d35aba7d5a3c2791ffd06a1046e9dfaff9b3238 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Tue, 13 Dec 2022 14:31:36 +0100 Subject: [PATCH 08/12] Update 'Jenkinsfile' fix ansiColor syntax --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index ef64a66..09007f3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -192,7 +192,7 @@ pipeline { steps { script{ echo "Cron build disabled. New deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing" - ansiColor("xterm") { + ansiColor('xterm') { catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { checkup("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); deploy("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); @@ -233,7 +233,7 @@ pipeline { } steps { echo "Cron build disabled. Pipeline executed Manually. New deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing" - ansiColor("xterm") { + ansiColor('xterm') { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { deploy("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); } From 2606032208f57c7c962d516a2065c247ac92452d Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Wed, 8 Mar 2023 17:18:18 +0100 Subject: [PATCH 09/12] deployJob stage: set to unstable if ansible fail --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 09007f3..0dd2faa 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -193,7 +193,7 @@ pipeline { script{ echo "Cron build disabled. New deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing" ansiColor('xterm') { - catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { + catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { checkup("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); deploy("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); } From 3f2fb836c05491aea36e27af5755832f51046b51 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Wed, 26 Apr 2023 15:25:14 +0200 Subject: [PATCH 10/12] add some comments --- Jenkinsfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0dd2faa..260cb93 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -144,7 +144,7 @@ pipeline { } } steps { - echo 'Going to sleep' + echo -e "\033[31;1;4mGoing to sleep\033[0m" sh ' exit 0; ' } } @@ -160,7 +160,7 @@ pipeline { } steps { sh ''' - echo "Cron build enabled. New deploy of ${TRIGGER_JOB} - ${TRIGGER_VERSION} will be added to the pending deploy file" + echo -e "Cron build enabled. \033[31;1;4mNew deploy of ${TRIGGER_JOB} - ${TRIGGER_VERSION} will be added to the pending deploy file\033[0m" touch $DEPLOY_FILE; if grep -q \"\${TRIGGER_JOB}\" \${DEPLOY_FILE}; then echo "component ${TRIGGER_JOB} already added. Nothing to add." @@ -191,7 +191,7 @@ pipeline { } steps { script{ - echo "Cron build disabled. New deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing" + echo -e "Cron build disabled. \033[31;1;4mNew deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing\033[0m" ansiColor('xterm') { catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { checkup("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); @@ -232,7 +232,7 @@ pipeline { expression { params.TRIGGER_JOB != "${RELEASE_JOB}" } } steps { - echo "Cron build disabled. Pipeline executed Manually. New deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing" + echo -e "Cron build disabled. Pipeline executed Manually. \033[31;1;4mNew deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing\033[0m" ansiColor('xterm') { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { deploy("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); From 5f9f635a618106efda95b473d4111e2b4ab11168 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Wed, 26 Apr 2023 15:29:59 +0200 Subject: [PATCH 11/12] fix echo --- Jenkinsfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 260cb93..b9b66a7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -144,7 +144,7 @@ pipeline { } } steps { - echo -e "\033[31;1;4mGoing to sleep\033[0m" + echo '\033[31;1;4mGoing to sleep\033[0m' sh ' exit 0; ' } } @@ -160,7 +160,7 @@ pipeline { } steps { sh ''' - echo -e "Cron build enabled. \033[31;1;4mNew deploy of ${TRIGGER_JOB} - ${TRIGGER_VERSION} will be added to the pending deploy file\033[0m" + echo 'Cron build enabled. \033[31;1;4mNew deploy of ${TRIGGER_JOB} - ${TRIGGER_VERSION} will be added to the pending deploy file\033[0m' touch $DEPLOY_FILE; if grep -q \"\${TRIGGER_JOB}\" \${DEPLOY_FILE}; then echo "component ${TRIGGER_JOB} already added. Nothing to add." @@ -191,7 +191,7 @@ pipeline { } steps { script{ - echo -e "Cron build disabled. \033[31;1;4mNew deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing\033[0m" + echo 'Cron build disabled. \033[31;1;4mNew deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing\033[0m' ansiColor('xterm') { catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { checkup("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); @@ -232,7 +232,7 @@ pipeline { expression { params.TRIGGER_JOB != "${RELEASE_JOB}" } } steps { - echo -e "Cron build disabled. Pipeline executed Manually. \033[31;1;4mNew deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing\033[0m" + echo 'Cron build disabled. Pipeline executed Manually. \033[31;1;4mNew deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing\033[0m' ansiColor('xterm') { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { deploy("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); From d2ccba5770d60a06d69d87465f66fe0ec21af9d0 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Wed, 26 Apr 2023 15:55:34 +0200 Subject: [PATCH 12/12] fix echo --- Jenkinsfile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b9b66a7..6fded55 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -126,7 +126,7 @@ pipeline { } } steps { - echo 'Cron build enabled. Deploy from system ongoing' + echo 'Cron build enabled. \033[31;1;4mDeploy from system ongoing\033[0m' script { echo "pipeline was triggered by ${params.TRIGGER_JOB}" println("Going to deploy all the pending deployments") @@ -160,7 +160,8 @@ pipeline { } steps { sh ''' - echo 'Cron build enabled. \033[31;1;4mNew deploy of ${TRIGGER_JOB} - ${TRIGGER_VERSION} will be added to the pending deploy file\033[0m' + echo '\033[31;1;4mNew pending deploy added to the queue/033[0m' + echo "Cron build enabled. Adding ${TRIGGER_JOB} - ${TRIGGER_VERSION} to the queue" touch $DEPLOY_FILE; if grep -q \"\${TRIGGER_JOB}\" \${DEPLOY_FILE}; then echo "component ${TRIGGER_JOB} already added. Nothing to add." @@ -191,7 +192,8 @@ pipeline { } steps { script{ - echo 'Cron build disabled. \033[31;1;4mNew deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing\033[0m' + echo '\033[31;1;4mNew upstream deploy ongoing\033[0m' + echo "Cron build disabled. Component: ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION}" ansiColor('xterm') { catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { checkup("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); @@ -232,13 +234,11 @@ pipeline { expression { params.TRIGGER_JOB != "${RELEASE_JOB}" } } steps { - echo 'Cron build disabled. Pipeline executed Manually. \033[31;1;4mNew deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing\033[0m' - ansiColor('xterm') { - catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { - deploy("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); - } + echo '\033[31;1;4mNew deploy ongoing manually triggered\033[0m' + echo "Cron build disabled. Pipeline executed Manually. New deploy of ${params.TRIGGER_JOB} - ${params.TRIGGER_VERSION} ongoing" + catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { + deploy("${params.TRIGGER_JOB}", "${params.TRIGGER_VERSION}", "${params.TRIGGER_HOST}"); } - } } }