2016-07-04 44 views
7

Stiamo considerando l'utilizzo del plug-in Jenkins Pipeline per un progetto piuttosto complesso costituito da diverse consegne che devono essere create utilizzando strumenti diversi (su macchine diverse) prima di essere unite. Tuttavia, sembra essere abbastanza facile fare una compilazione completa con un singolo Jenkinsfile, e mi piace la scoperta automatica dei rami git che viene fornito con Pipeline.Esegui parti di una tubatura come lavoro separato

Tuttavia, a questo punto, abbiamo lavori per ciascuna delle consegne e utilizziamo un lavoro "meta" basato sul flusso di build per orchestrare i singoli lavori. La cosa bella di questo è che permette anche di avviare un solo lavoro individuale se sono state fatte solo piccole modifiche, solo per vedere se questa consegna è ancora compilata.

Per emulare questo, alcune idee è venuto in mente:

  • utilizzano diversi Jenkinsfile s per le consegne e load loro nella top-level Jenkinsfile; sembra che il lavoro Multibranch Pipeline non consenta di configurare lo Jenkinsfile da utilizzare (https://issues.jenkins-ci.org/browse/JENKINS-35415), tuttavia, la creazione dei lavori per le singole consegne è ancora aperta.
  • Fornire un'opzione di configurazione per il lavoro di "livello superiore" e avere if s per tutte le consegne nello Jenkinsfile per poter selezionare quale deve essere creato. Ciò tuttavia combinerebbe diversi tipi di build in una sola pipeline e, per lo meno, rovinerebbe la stima del tempo di costruzione.

Queste opzioni sono valide o ce n'è una migliore?

+1

Questa domanda è molto simile a http://stackoverflow.com/questions/38129745/jenkins-build-pipeline-restart-at-stage sebbene si tratti di riavvio. Tuttavia, le risposte a questa domanda trattengono anche questa domanda. – olenz

risposta

5

Che cosa si potrebbe fare è scrivere uno script pipelining che ha ha "se" -guards intorno alle singole tappe, come questo:

stage "s1" 
if (theStage in ["s1","all"]) { 
    sleep 2 
} 

stage "s2" 
if (theStage in ["s2", "all"]) { 
    sleep 2 
} 

stage "s3" 
if (theStage in ["s3", "all"]) { 
    sleep 2 
} 

allora si può fare un lavoro "principale" che utilizza questo script e esegue tutte le fasi contemporaneamente impostando il parametro "theStage" su "all". Questo lavoro raccoglierà le statistiche quando tutte le fasi vengono eseguite contemporaneamente e ti forniscono utili tempi di stima.

Inoltre, è possibile eseguire un lavoro di "esecuzione parziale" che utilizza questo script e che viene parametrizzato con lo stage che si desidera eseguire. La stima non sarà molto utile, però.

Nota che ho messo lo stage stesso nello script principale e ho inserito solo il codice di esecuzione nel condizionale, come suggerito da Martin Ba. Questo fa in modo che la visualizzazione del lavoro è più affidabile

+0

Questa * è * una buona idea, tuttavia: ["Stadi dinamici: in generale, se si desidera visualizzare stadi che cambiano dinamicamente, renderlo condizionale per eseguire il contenuto dello stage, non condizionale per includere lo stage"] (https: // wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin) –

+0

Buon consiglio. Lo aggiungerò alla mia risposta. – olenz

0

come espansione della risposta precedente, vorrei proporre una cosa del genere:

def stageIf(String name, Closure body) { 
if (params.firstStage <= name && params.lastStage >= name) { 
    stage(name, body) 
} else { 
    stage(name) { 
     echo "Stage skipped: $name" 
    } 
} 
} 

node('linux') { 
properties([ 
     parameters([ 
       choiceParam(
         name: 'firstStage', 
         choices: '1.Build\n' + 
           '2.Docker\n' + 
           '3.Deploy', 
         description: 'First stage to start', 
         defaultValue: '1.Build', 
       ), 
       choiceParam(
         name: 'lastStage', 
         choices: '3.Deploy\n' + 
           '2.Docker\n' + 
           '1.Build', 
         description: 'Last stage to start', 
         defaultValue: '3.Deploy', 
       ), 
     ]) 
]) 

stageIf('1.Build') { 
    // ... 
} 
stageIf('3.Deploy') { 
    // ... 
} 
} 

Non perfetto come vorrei, ma almeno il suo lavoro.