generated from gCubeCI/Pipeline-Docker-Template
variables refactoring; add new methods related to the release deployment
tasks;
This commit is contained in:
parent
d1a687f021
commit
43a402ab16
|
@ -10,20 +10,20 @@
|
||||||
|
|
||||||
def agent_root_folder = '/var/lib/jenkins'
|
def agent_root_folder = '/var/lib/jenkins'
|
||||||
|
|
||||||
if ("${params.report_number}"){
|
if ("${params.gCube_release_version}"){
|
||||||
// load the build report's content if present
|
//locate the release file
|
||||||
def text
|
String releaseURL = "https://code-repo.d4science.org/gCubeCI/gCubeReleases/raw/branch/master/open/gcube-${gCube_release_version}.yaml"
|
||||||
String reportURL = "https://code-repo.d4science.org/gCubeCI/gCubeReleases/raw/branch/master/open/${gCube_release_version}/build_commits.${params.report_number}.csv"
|
//load the release file
|
||||||
if (reportURL){
|
def text = releaseURL.toURL().getText()
|
||||||
println "Pulling the report from Git at ${reportURL}"
|
//parsing
|
||||||
text = reportURL.toURL().getText()
|
def jsonConfig = new Yaml().load(text)
|
||||||
// parse the report and extract the data
|
if (verbose)
|
||||||
def components = parseBuildCommits(text)
|
println jsonConfig.inspect()
|
||||||
assert 0 < components.size(): "No component found in build_commits.${report_number}.csv"
|
assert jsonConfig.gCube_release.Version == params.gCube_release_version: "Release versions do not match!"
|
||||||
for (component in components) {
|
echo "Building gCube v. ${jsonConfig.gCube_release.Version}"
|
||||||
// here we need to filter on keywords matching component's section
|
if (verbose) {
|
||||||
println " $component"
|
echo "Found components:"
|
||||||
}
|
jsonConfig.gCube_release.Components.each { println it.key }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,18 +52,27 @@ pipeline {
|
||||||
|
|
||||||
environment {
|
environment {
|
||||||
AGENT_ROOT_FOLDER = "${agent_root_folder}"
|
AGENT_ROOT_FOLDER = "${agent_root_folder}"
|
||||||
|
// folder where all the pending deployment will be added
|
||||||
PENDING_DEPLOY_FOLDER="${agent_root_folder}/CD/"
|
PENDING_DEPLOY_FOLDER="${agent_root_folder}/CD/"
|
||||||
CD_ROOT_FOLDER = "${agent_root_folder}/ansible-repos/ansible-playbooks/d4science-ghn-cluster/CD"
|
ANSIBLE_ROOT_FOLDER = "${agent_root_folder}/ansible-repos/ansible-playbooks/d4science-ghn-cluster/CD"
|
||||||
PIPELINE_BUILD_NUMBER = "${env.BUILD_NUMBER}"
|
PIPELINE_BUILD_NUMBER = "${env.BUILD_NUMBER}"
|
||||||
|
// deploy file related to the current pipeline job
|
||||||
DEPLOY_FILE = "${PENDING_DEPLOY_FOLDER}deploy.${PIPELINE_BUILD_NUMBER}.csv"
|
DEPLOY_FILE = "${PENDING_DEPLOY_FOLDER}deploy.${PIPELINE_BUILD_NUMBER}.csv"
|
||||||
BACKUP_FILE = "${PENDING_DEPLOY_FOLDER}deploy.${PIPELINE_BUILD_NUMBER}.bck"
|
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= "${WORKSPACE}/CD-${PIPELINE_BUILD_NUMBER}"
|
DEPLOY_FOLDER= "${WORKSPACE}/CD-${PIPELINE_BUILD_NUMBER}"
|
||||||
|
// artifacts coordinates
|
||||||
TRIGGER_JOB= "${params.TRIGGER_JOB}"
|
TRIGGER_JOB= "${params.TRIGGER_JOB}"
|
||||||
TRIGGER_VERSION= "${params.TRIGGER_VERSION}"
|
TRIGGER_VERSION= "${params.TRIGGER_VERSION}"
|
||||||
TRIGGER_HOST="${params.TRIGGER_HOST}"
|
TRIGGER_HOST="${params.TRIGGER_HOST}"
|
||||||
|
// enable the ContinuousDeployment if TRUE
|
||||||
TRIGGER_CD="${params.TRIGGER_CD}"
|
TRIGGER_CD="${params.TRIGGER_CD}"
|
||||||
|
// Useful to identify the remote YAML file
|
||||||
GCUBE_RELEASE_NUMBER = "${params.gCube_release_version}"
|
GCUBE_RELEASE_NUMBER = "${params.gCube_release_version}"
|
||||||
REPORT_NUMBER = "${params.report_number}"
|
//Category name of the components candidates to the remote deployment
|
||||||
|
DEPLOY_CATEGORY="${env.DEPLOY_CATEGORY}"
|
||||||
|
//Job name of the release pipeline
|
||||||
|
RELEASE_JOB='gCubeBuilder'
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,21 +119,27 @@ pipeline {
|
||||||
anyOf{
|
anyOf{
|
||||||
allOf{
|
allOf{
|
||||||
triggeredBy 'TimerTrigger'
|
triggeredBy 'TimerTrigger'
|
||||||
// maybe we can add a new condition in order to consider the manual execution of this pipeline
|
|
||||||
environment name: 'IS_SCHEDULED_TEST', value: 'True'
|
environment name: 'IS_SCHEDULED_TEST', value: 'True'
|
||||||
}
|
}
|
||||||
// in this case the pipeline is triggered by the gCubeBuilder pipeline
|
|
||||||
equals(actual: "${params.TRIGGER_JOB}", expected: 'gCubeBuilder')
|
equals(actual: "${params.TRIGGER_JOB}", expected: 'gCubeBuilder')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
echo 'Cron build enabled. Deploy from system ongoing'
|
echo 'Cron build enabled. Deploy from system ongoing'
|
||||||
script {
|
script {
|
||||||
echo "pipeline triggered by ${params.TRIGGER_JOB}"
|
echo "pipeline was triggered by ${params.TRIGGER_JOB}"
|
||||||
if("${params.TRIGGER_JOB}" == "gCubeBuilder"){
|
if("${params.TRIGGER_JOB}" == "${RELEASE_JOB}"){
|
||||||
// do something
|
println("Going to deploy the Release components")
|
||||||
println("The Job is gCubeBuilder")
|
def releaseList = []
|
||||||
}else{
|
jsonConfig.gCube_release.Components.each { group_name, component_list ->
|
||||||
|
if("${group_name}" == "${DEPLOY_CATEGORY}"){
|
||||||
|
println("found ${it.name} with version: ${it.version}");
|
||||||
|
releaseList += "${it.name},${it.version}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
deployJobs(releaseList);
|
||||||
|
}else{
|
||||||
|
println("Going to deploy all the pending deployments")
|
||||||
def deployFolder="CD-${env.BUILD_NUMBER}";
|
def deployFolder="CD-${env.BUILD_NUMBER}";
|
||||||
parseDeployPendingJobs(deployFolder);
|
parseDeployPendingJobs(deployFolder);
|
||||||
}
|
}
|
||||||
|
@ -143,7 +158,8 @@ pipeline {
|
||||||
|
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
echo 'Do Nothing: cron build disabled'
|
echo 'Going to sleep'
|
||||||
|
sh ' exit 1; '
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('New pending deploy ') {
|
stage('New pending deploy ') {
|
||||||
|
@ -157,7 +173,7 @@ pipeline {
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
sh '''
|
sh '''
|
||||||
echo "Cron build enabled. New deploy of ${TRIGGER_JOB} - ${TRIGGER_VERSION} will be added to the deploy file"
|
echo "Cron build enabled. New deploy of ${TRIGGER_JOB} - ${TRIGGER_VERSION} will be added to the pending deploy file"
|
||||||
touch $DEPLOY_FILE;
|
touch $DEPLOY_FILE;
|
||||||
if grep -q \"\${TRIGGER_JOB}\" \${DEPLOY_FILE}; then
|
if grep -q \"\${TRIGGER_JOB}\" \${DEPLOY_FILE}; then
|
||||||
echo "component ${TRIGGER_JOB} already added. Nothing to add."
|
echo "component ${TRIGGER_JOB} already added. Nothing to add."
|
||||||
|
@ -245,7 +261,7 @@ pipeline {
|
||||||
def deploy(String service, String version, String host){
|
def deploy(String service, String version, String host){
|
||||||
def now = new Date();
|
def now = new Date();
|
||||||
println("Going to deploy the service "+service+" with version: "+version+" on target: "+host);
|
println("Going to deploy the service "+service+" with version: "+version+" on target: "+host);
|
||||||
def statusCode = sh( script: "cd $CD_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("""
|
sh("""
|
||||||
echo " last exit code \$?";
|
echo " last exit code \$?";
|
||||||
""")
|
""")
|
||||||
|
@ -263,6 +279,30 @@ def checkup(String service, String version, String host){
|
||||||
""")
|
""")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//launch ansible deploy
|
||||||
|
def deployRelease(String service, String version){
|
||||||
|
def now = new Date();
|
||||||
|
println("Going to deploy the service "+service+" with version: "+version+" on preproduction ");
|
||||||
|
def statusCode = sh( script: "cd $ANSIBLE_ROOT_FOLDER;./deployPreprodService.sh $service $version ;", returnStdout: true);
|
||||||
|
sh("""
|
||||||
|
echo " last exit code \$?";
|
||||||
|
""")
|
||||||
|
println("Deploy ended with status: "+statusCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Implement a new method in order to check the input parameters
|
||||||
|
def checkupRelease(String service, String version){
|
||||||
|
sh("""
|
||||||
|
case "$version" in
|
||||||
|
**SNAPSHOT) echo "version contains SNAPSHOT" ; exit 1;;
|
||||||
|
**latest) echo "version contains latest" ;;
|
||||||
|
* ) echo "version without SNAPSHOT. EXIT WITHOUT DEPLOY "; exit 1;;
|
||||||
|
esac
|
||||||
|
""")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//parse all csv files found in the local folder and deploy the components defined inside
|
//parse all csv files found in the local folder and deploy the components defined inside
|
||||||
def deployPendingJobs( def deployFolder){
|
def deployPendingJobs( def deployFolder){
|
||||||
println ("searching files in folder ${deployFolder}");
|
println ("searching files in folder ${deployFolder}");
|
||||||
|
@ -322,15 +362,43 @@ def deployJobs(def serviceList){
|
||||||
for (def record : serviceList) {
|
for (def record : serviceList) {
|
||||||
println("Processing record: "+record)
|
println("Processing record: "+record)
|
||||||
service=record.split(",");
|
service=record.split(",");
|
||||||
stage(service[0]){
|
//check on target host
|
||||||
|
if(service[ 2 ]){
|
||||||
|
stage(service[0]){
|
||||||
catchError(buildResult: 'UNSTABLE', stageResult: 'UNSTABLE') {
|
catchError(buildResult: 'UNSTABLE', stageResult: 'UNSTABLE') {
|
||||||
checkup(service[0], service[ 1 ], service[2]);
|
checkup(service[0], service[ 1 ], service[2]);
|
||||||
deploy(service[0], service[ 1 ], service[2]);
|
deploy(service[0], service[ 1 ], service[2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
//this is a release build
|
||||||
|
stage(service[0]){
|
||||||
|
catchError(buildResult: 'UNSTABLE', stageResult: 'UNSTABLE') {
|
||||||
|
checkupRelease(service[0], service[ 1 ], service[2]);
|
||||||
|
deployRelease(service[0], service[ 1 ], service[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def parseBuildComponents( def text){
|
||||||
|
def components = []
|
||||||
|
"${text}".splitEachLine(',') { columns ->
|
||||||
|
if (columns[0].startsWith('#') || columns[0].startsWith('GroupID'))
|
||||||
|
return
|
||||||
|
components.add([
|
||||||
|
name : columns[1],
|
||||||
|
version : columns[2],
|
||||||
|
gitRepo : columns[3],
|
||||||
|
commitID: columns[4]
|
||||||
|
]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return components
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue