8

Sto cercando di utilizzare Jenkins su Cloudbees per automatizzare la distribuzione del mio software. Ho impostato il mio flusso di lavoro come segue.Come ripetere una fase in Jenkins Workflow

Jenkins Workflow

Ci possono essere momenti che voglio ridistribuire. (supponendo che lo stage abbia un parametro di input manuale). Come faccio a farlo nel flusso di lavoro? Ecco il mio script Groovy.

def src = 'https://git.repo.url/proj.git' 

stage 'Build' 
node { 
    env.JAVA_HOME="${tool name: 'Pre-Installed OpenJDK 8 (Latest) on [email protected] nodes', type: 'hudson.model.JDK'}" 
    sh 'javac -version' 
    git credentialsId: 'abcdef', url: src 
    sh 'ant -f build.xml proj.jar report' 
} 

stage 'Generate Release Version' 
input message: 'Create Tar and Push to S3', ok: 'Generate Release' 
node { 
    // TODO 
} 

stage 'QA Approved' 
input message: 'Enter a Tag Name to approve this build and tag in GIT', ok: 'Approve and Tag', parameters: [[$class: 'StringParameterDefinition', defaultValue: '', description: 'Eg: Sprint73', name: 'TAG_NAME']] 
node { 
    // TODO 
} 

stage 'DevOps - Ansible' 
input message: 'Release to Production', ok: 'Release' 
node { 
    // TODO 
} 

Ho provato ad utilizzare Job catena tramite costruire Pipeline invece di flusso di lavoro in modo che possa ripetere le fasi, ma questo è un'altra storia con troppi posti di lavoro.

+1

Questo problema dovrebbe essere risolto con il plug-in "checkpoint". Ma al momento questo non è ancora possibile nella versione OSS, ma il voto è attivo sul tracker dei problemi [JENKINS-33846] (https://issues.jenkins-ci.org/browse/JENKINS-33846). Sentiti libero di inviare il tuo voto! – Zigac

risposta

2

Supponendo che sia l'ultima fase (Ansible) da cui si desidera essere in grado di riavviarsi, è possibile posizionare uno checkpoint poco prima.

checkpoint 'about to deploy' 
stage 'DevOps - Ansible' 
input message: 'Release to Production', ok: 'Release' 
node { 
    // TODO 
} 

Se si desidera distribuire ad un target selezionabile, è possibile utilizzare input:

checkpoint 'about to deploy' 
stage 'DevOps - Ansible' 
def target = input message: 'Where to release?', 
    parameters: [[$class: 'StringParameterDefinition', name: 'target']] 
node { 
    // TODO 
} 

Lo scenario più complicato è che si desidera distribuire sempre ad un target standard la prima volta intorno, ma quando si riprende da un checkpoint si desidera chiedere all'utente un bersaglio alternativo. Per quello devi sapere quando stai riprendendo. Attualmente checkpoint non offre queste informazioni direttamente (CGP-1620 nelle CloudBees issue tracker interno), ma c'è una soluzione:

def origBuildNumber = env.BUILD_NUMBER 
checkpoint 'about to deploy' 
stage 'DevOps - Ansible' 
def target 
if (origBuildNumber == env.BUILD_NUMBER) { // original 
    target = 'production' 
} else { // resumed 
    target = input message: 'Where to release?', 
     parameters: [[$class: 'StringParameterDefinition', name: 'target']] 
} 
node { 
    // TODO 
} 
3

questo è possibile solo nella versione Enterprise di Jenkins. Come ha fatto notare @ jesse-glick, è disponibile il plug-in Checkpoint, vedere documentation.

Attualmente non esiste un piano per supportare questa funzione nella versione OSS secondo CloudBees. Vedere questo problema: JENKINS-33846