Jenkins Workflow Scripting Out Build complesse

In questa seconda e ultima parte della serie, daremo un'occhiata al plugin del flusso di lavoro di Jenkins come soluzione per la creazione di pipeline Jenkins più complesse.

Ritireremo da dove partì la prima parte della serie. Nella prima parte, Jeff Reifman ti ha guidato nella creazione di un'istanza di Jenkins su Digital Ocean e nella creazione della tua prima build Jenkins. Se non l'hai ancora letto, ti suggerisco di farlo prima di continuare. Va bene, aspetterò. Posso essere molto paziente ...

... Tutto preso? Grande! Facciamolo.

Cos'è il flusso di lavoro di Jenkins?

Jenkins Workflow è un plugin per Jenkins. Una volta installato, diventa disponibile un nuovo tipo di oggetto: un "flusso di lavoro". I progetti del flusso di lavoro possono essere utilizzati per gli stessi scopi dei normali progetti "Freestyle" di Jenkins, ma hanno anche la capacità di orchestrare attività molto più grandi che possono estendersi su più progetti e persino creare e gestire più spazi di lavoro in un singolo flusso di lavoro. Inoltre, tutta questa gestione può essere organizzata in un singolo script, anziché distribuirsi in una serie di configurazioni, progetti e passaggi.

Il pre-flusso di lavoro

Prima di iniziare a creare flussi di lavoro, dobbiamo installare il plug-in di flusso di lavoro di Jenkins. Dalla Dashboard di Jenkins, fai clic su Gestisci Jenkins, poi Gestisci i plugin. Passare al A disposizione scheda e cerca "Flusso di lavoro".

Seleziona la casella per Plug-in flusso di lavoro, poi Installa senza riavviare.

Ora, ecco il trucco. Esistono diversi plugin denominati "Plugin flusso di lavoro", quindi dovrai ripetere più volte i passaggi precedenti. In alternativa, è anche possibile fare clic sulle caselle multiple o installare il plugin Aggregatore del flusso di lavoro.

Una volta che "Plug-in del flusso di lavoro" non compare più nell'elenco dei plug-in disponibili, quindi vai avanti e riavvia Jenkins andando a /ricomincia e facendo clic .

Un flusso semplice

Prendiamo i nostri piedi di lavoro bagnati. Prenderemo il progetto Jeff impostato nella prima parte e lo creeremo come un flusso di lavoro.

Per iniziare, dirigiti alla Dashboard di Jenkins e fai clic Nuovo oggetto. Denominare il nuovo oggetto "Test shell (flusso di lavoro)" e selezionare il Flusso di lavoro genere.

Clic ok per creare il nuovo progetto. Atterri sulla pagina di configurazione del progetto.

Noterai che le opzioni di configurazione differiscono dai progetti Jenkins standard. Non ci sono più opzioni per aggiungere un repository GitHub, costruire passi o azioni post-compilazione. Invece, c'è una nuova sezione chiamata Flusso di lavoro.

All'interno della sezione Flusso di lavoro c'è una casella di testo etichettata copione. È qui che definirai lo script del flusso di lavoro che verrà eseguito da Jenkins quando inizializza una build del progetto.

"Che tipo di sceneggiatura?" Chiedi. Ottima domanda Il plugin del flusso di lavoro di Jenkins utilizza un linguaggio chiamato Groovy per i suoi script. Groovy è un linguaggio di scripting versatile per JVM. Non ti preoccupare, non hai davvero bisogno di conoscere Groovy o Java per far funzionare le cose - il plugin Jenkins Workflow utilizza un piccolo DSL su Groovy, ed è molto facile combinare i comandi per costruire il flusso di lavoro del tuo progetto.

Vai avanti e aggiungi quanto segue alla casella dello script:

java node git 'https://github.com/redhotvengeance/hello-jenkins.git' sh 'uptime'

Quindi cosa sta succedendo qui?

Prima di tutto, apriamo a nodo bloccare. I nodi sono dove le azioni del flusso di lavoro si verificano. Quando assegni a nodo, viene creato un nuovo spazio di lavoro (un contesto / cartella). Tutto il codice all'interno del nodo il blocco viene eseguito all'interno di quell'area di lavoro. Questo aiuta a garantire che le fasi di costruzione non si contaminino a vicenda.

Successivamente, eseguiamo un comando Git con git 'https://github.com/redhotvengeance/hello-jenkins.git'. Questo comando clona il repository Git nel nostro spazio di lavoro.

Infine, diciamo a Workflow di eseguire il uptime comando di shell con sh 'uptime'.

Clic Salvare, e verrai indirizzato alla pagina di destinazione del progetto. Nel menu a sinistra c'è un pulsante con l'etichetta Costruisci ora. Fare clic per avviare una build.

Una volta completata la compilazione, fai clic su build # 1 trovato nel Costruisci la storia sezione. Quindi fare clic Uscita console nel menu a sinistra.

Qui possiamo vedere tutto ciò che è stato registrato mentre è stata eseguita la build. Ha iniziato allocando un nodo nell'area di lavoro "Test test (flusso di lavoro)". Quindi ha recuperato il repository Git. Infine, ha eseguito il uptime script di shell, che ha stampato le statistiche di uptime del server.

E questo è tutto! Ora abbiamo ricreato gli stessi passaggi del normale setup del progetto Jenkins nella prima parte, tranne questa volta come un flusso di lavoro. Ora usiamo questi stessi concetti per fare qualcosa di un po 'più complesso.

Fallo finchè non lo fai

Prima di poter creare il nostro complesso flusso di lavoro, abbiamo bisogno del lavoro che ci attraverserà. Progetti falsi per il salvataggio!

Dato che stiamo già usando Groovy per scrivere il nostro flusso di lavoro, usiamo Gradle per i nostri progetti fasulli. Gradle è un sistema di compilazione che usa Groovy (sorprendente, lo so!). Per usare Gradle, dovremo installarlo sul nostro server. SSH nel server (controlla la parte di Jeff se è necessario aggiornare la memoria) ed esegui:

shell sudo apt-get install gradle

Ecco, siamo a posto.

Utilizzeremo due repository nel nostro nuovo flusso di lavoro. Il primo è il costruttore. Il nostro progetto di builder è molto semplice: contiene uno script di build Gradle con il seguente codice:

compito groovy createBuild << new File("built.txt").write("You cannot pass.\n")

Quindi cosa sta succedendo qui? Gradle funziona eseguendo "tasks" e lo script di build Gradle definisce queste attività. Abbiamo definito un'attività chiamata createBuild, e quello che fa è creare un file di testo chiamato built.txt con il contenuto:

Non puoi passare.

Questo è tutto. (Bene, io fatto dì che era semplice!)

Il secondo repo Git è il nostro packager. Il packager ha anche uno script di build Gradle, ma è un po 'più complesso:

groovy task createPackage << String packageText = "I am a servant of the Secret Fire, wielder of the flame of Anor. You cannot pass. The dark fire will not avail you, flame of Udûn. Go back to the Shadow!" String builtText = new File('built.txt').text new File("package.txt").write(packageText + "\n\n" + builtText)

Il createPackage compito crea anche un file di testo (chiamato package.txt), ma prevede di utilizzare il contenuto da built.txt, che non esiste nel repository packager. Se built.txt esisteva nel repository, il generato package.txt conterrebbe:

Sono un servitore del Fuoco segreto, difensore della fiamma di Anor. Non puoi passare. Il fuoco oscuro non ti servirà, fiamma di Udûn. Torna all'ombra!

Non puoi passare.

Se built.txt manca, il nostro createPackage l'attività genererà un errore.

Quindi ogni volta che costruiamo il nostro packager, dobbiamo prima eseguire il nostro builder e realizzare il risultato built.txt disponibile per il packager in modo che possa creare package.txt.

E questo è esattamente ciò che dovremmo fare per creare un flusso di lavoro Jenkins!

Lascia che il lavoro scorra attraverso di te

Dirigetevi verso la Dashboard Jenkins, cliccate Nuovo oggetto, chiamalo "Assembler", seleziona Flusso di lavoro, e fare clic ok.

Iniziamo lo scripting. Per prima cosa, apriremo a nodo blocco, proprio come prima:

"nodo java

"

Quindi, cloniamo il nostro repository di builder:

nodo java git 'https://github.com/redhotvengeance/jenkins-workflow-build.git'

Ora abbiamo bisogno di eseguire il nostro script di build Gradle per generare il built.txt file:

nodo java git 'https://github.com/redhotvengeance/jenkins-workflow-build.git' sh 'gradle createBuild'

Infine, assicuriamoci che tutto funzioni come ci aspettiamo. Aggiungeremo un gatto per stampare il contenuto del built.txt file:

java node git 'https://github.com/redhotvengeance/jenkins-workflow-build.git' sh 'gradle createBuild' sh 'cat ./built.txt'

Clic Salvare, e quindi avviare una build. Una volta fatto, dai un'occhiata al Uscita console.

Eccellente! Stiamo clonando con successo il repository, eseguendo il createBuild compito, e hanno confermato che il contenuto di built.txt è Non puoi passare.. Ora sul packager.

Proprio come con il costruttore, abbiamo bisogno di clonare il nostro repository packager. Aggiungiamo il codice packager:

"java node git 'https://github.com/redhotvengeance/jenkins-workflow-build.git' sh 'gradle createBuild' sh 'cat ./built.txt'

node git 'https://github.com/redhotvengeance/jenkins-workflow-package.git' sh 'gradle createPackage' sh 'cat ./package.txt' "

Dal momento che non abbiamo creato esplicitamente un nuovo spazio di lavoro, il createPackage l'attività verrà eseguita nello stesso spazio di lavoro di createBuild compito, nel senso che il built.txt file che il packager si aspetta sarà disponibile.

Vai avanti e Salvare e Costruisci ora, e quindi visualizzare il Uscita console.

Tutto è andato come previsto - il nostro costruttore è stato clonato e gestito, e il nostro packager è stato clonato e gestito. E se guardiamo l'output, eccolo! Il Balrog di Morgoth è stato completamente Gandalf'd.

Fantastico, ma non è così ...

Artificioso? Sicuramente.

Ma un concetto complesso è in realtà solo un insieme di semplici concetti messi insieme. In superficie, abbiamo riunito il discorso di Gandalf sul ponte di Khazad-dûm. In realtà, abbiamo preso l'output di un progetto e l'abbiamo inserito nell'output di un altro progetto.

Cosa succede se al posto del dialogo di Gandalf, i risultati della build fossero eseguibili da codebase separati che tutti devono essere assemblati insieme per il software che spedite? Dovresti utilizzare lo stesso flusso di lavoro che abbiamo creato qui: clonazione, creazione, copia e imballaggio. Con il plugin per il flusso di lavoro di Jenkins, sono bastate poche righe di Groovy. E come bonus, tutto è contenuto in un singolo copione!

Ci sono anche altri strumenti disponibili per aiutare a gestire e visualizzare un flusso di lavoro di Jenkins. CloudBees offre una funzionalità di visualizzazione Stage del flusso di lavoro sulla piattaforma Jenkins aziendale.

Questo graffia solo la superficie di ciò che può essere fatto con il plugin Jenkins Workflow. Assicurati di controllare i link correlati qui sotto per saperne di più.

Buona fortuna per far fluire il tuo lavoro!

Link correlati

  • Sito Web Jenkins
  • Pagina del plug-in del flusso di lavoro di Jenkins
  • Pagina GitHub Plugin flusso di lavoro Jenkins
  • Esercitazione sui plugin per il flusso di lavoro di Jenkins
  • Documenti del plugin per il flusso di lavoro di CloudBees Jenkins
  • Plug-in Jenkins Workflow Plugin Video