Risposte:
Non è possibile eseguire lo script Pipeline localmente, poiché il suo scopo è lo script Jenkins. (Questo è uno dei motivi per cui è meglio mantenere il Jenkinsfile
codice breve e limitato al codice che tratta effettivamente le funzionalità di Jenkins; la tua logica di compilazione effettiva dovrebbe essere gestita con processi esterni o strumenti di compilazione che invochi tramite una riga sh
obat
passaggio.)
Se vuoi testare una modifica per Jenkinsfile
vivere ma senza impegnarla , usa la funzione Replay aggiunta in 1.14
JENKINS-33925 tiene traccia del desiderato per un framework di test automatizzato.
Ho una soluzione che funziona bene per me. Consiste in un jenkins locale in esecuzione nella finestra mobile e in un hook git web per attivare la pipeline nei jenkins locali ad ogni commit. Non è più necessario eseguire il push nel repository github o bitbucket per testare la pipeline.
Questo è stato testato solo in un ambiente Linux.
È abbastanza semplice farlo funzionare anche se questa istruzione è un po 'lunga. La maggior parte dei passaggi ci sono.
Crea un file chiamato Dockerfile al posto della tua scelta. Lo sto inserendo e /opt/docker/jenkins/Dockerfile
riempilo con questo:
FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins
Costruisci l'immagine local_jenkins
Questo dovrai farlo solo una volta o dopo aver aggiunto qualcosa al Dockerfile.
$ docker build -t local_jenkins /opt/docker/jenkins/
Avvia e riavvia local_jenkins
Di tanto in tanto vuoi avviare e riavviare jenkins facilmente. Ad esempio dopo un riavvio del computer. Per questo ho creato un alias che ho inserito .bash_aliases
nella mia cartella home.
$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases # To make it work
Assicurati che la /opt/docker/jenkins/jenkins_home
cartella esista e che tu abbia i diritti di lettura e scrittura dell'utente.
Per avviare o riavviare jenkins basta digitare:
$ localjenkinsrestart
Tutto ciò che fai nei tuoi jenkins locali verrà archiviato nella cartella / opt / docker / jenkins / jenkins_home e conservato tra i riavvii.
Crea una chiave di accesso ssh nella finestra mobile jenkins
Questa è una parte molto importante perché funzioni. Per prima cosa iniziamo il container docker e creiamo una shell bash su di esso:
$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash
Ora sei entrato nel contenitore della finestra mobile, come puoi vedere da qualcosa del genere jenkins@e7b23bad10aa:/$
nel tuo terminale. L'hash dopo @ sarà sicuramente diverso.
Crea la chiave
jenkins@e7b23bad10aa:/$ ssh-keygen
Premi Invio su tutte le domande fino a quando non ricevi nuovamente il messaggio
Copia la chiave sul tuo computer. Dal contenitore docker il tuo computer è 172.17.0.1 dovresti chiederti.
jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1
user = il tuo nome utente e 172.17.0.1 è l'indirizzo IP del tuo computer all'interno del contenitore della finestra mobile.
A questo punto dovrai digitare la password.
Ora proviamo a completare il ciclo inviando un messaggio al computer dall'interno della finestra mobile.
jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1
Questa volta non dovresti aver bisogno di inserire la tua password. Se lo fai, qualcosa è andato storto e devi riprovare.
Ora sarai nella cartella home del tuo computer. Prova ls
a dare un'occhiata.
Non fermarti qui perché abbiamo una catena di shell ssh da cui dobbiamo uscire.
$ exit
jenkins@e7b23bad10aa:/$ exit
Destra! Ora siamo tornati e pronti per continuare.
Installa il tuo Jenkins
Troverai il tuo Jenkins locale nel tuo browser all'indirizzo http: // localhost: 8787 .
La prima volta che punti il tuo browser verso il tuo Jenkins locale sarai accolto con una procedura guidata di installazione. I valori predefiniti vanno bene, ma assicurati di installare il plug-in della pipeline durante l'installazione.
Imposta i tuoi jenkins
È molto importante attivare la sicurezza basata su matrice su http: // localhost: 8787 / configureSecurity e concederti tutti i diritti aggiungendoti alla matrice e spuntando tutte le caselle. (C'è un'icona di tutte le caselle all'estrema destra)
Jenkins’ own user database
come reame di sicurezzaMatrix-based security
nella sezione AutorizzazioneUser/group to add:
e fai clic su[ Add ]
pulsantePrevent Cross Site Request Forgery exploits
sia deselezionata. (Dal momento che questo Jenkins è raggiungibile solo dal tuo computer, questo non è un grosso problema)[ Save ]
e disconnettersi da Jenkins e accedere nuovamente solo per assicurarsi che funzioni.
In caso contrario, è necessario ricominciare da capo e svuotare la /opt/docker/jenkins/jenkins_home
cartella prima di riavviareAggiungi l'utente git
Dobbiamo consentire al nostro hook git di accedere al nostro Jenkins locale con diritti minimi. Basta vedere e costruire posti di lavoro è sufficiente. Pertanto creiamo un utente chiamato git
con passwordlogin
.
Dirigere il browser su http: // localhost: 8787 / securityRealm / addUser e aggiungere git
come nome utente e login
come password. Clicca su [ Create User ]
.
Aggiungi i diritti all'utente git
Vai alla pagina http: // localhost: 8787 / configureSecurity nel tuo browser. Aggiungi l'utente git alla matrice:
git
nel campo User/group to add:
e fai clic su[ Add ]
Ora è il momento di selezionare le caselle per i diritti minimi per l'utente git. Sono necessari solo questi:
Assicurarsi che il Prevent Cross Site Request Forgery exploits
casella di controllo sia deselezionata e fai clic su[ Save ]
Partiamo dal presupposto che abbiamo il nome utente user
e il nostro progetto abilitato git con Jenkinsfile
in esso viene chiamato project
e si trova in/home/user/projects/project
Nel tuo http: // localhost: 8787 Jenkins aggiunge un nuovo progetto di pipeline. L'ho chiamato hookpipeline come riferimento.
New Item
nel menu Jenkinshookpipeline
[ OK ]
Poll SCM
nella sezione Trigger della build. Lascia vuoto il programma.Pipeline script from SCM
Repository URL
campo inserireuser@172.17.0.1:projects/project/.git
Script Path
campo inserireJenkinsfile
Vai alla /home/user/projects/project/.git/hooks
cartella e crea un file chiamato post-commit
che contiene questo:
#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'
curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"
Rendi eseguibile questo file:
$ chmod +x /home/user/projects/project/.git/hooks/post-commit
Testare l'hook post-commit:
$ /home/user/projects/project/.git/hooks/post-commit
Controlla in Jenkins se il tuo progetto hookpipeline è stato attivato.
Apporta infine alcune modifiche arbitrarie al tuo progetto, aggiungi le modifiche e fai un commit. Questo ora attiverà la pipeline nel tuo Jenkins locale.
Giorni felici!
docker build -t local_jenkins /opt/docker/jenkins/Dockerfile
con docker build -t local_jenkins /opt/docker/jenkins
quanto Docker lamentato "in grado di preparare contesto: contesto deve essere una directory".
$ docker inspect jenkins | grep Gateway
ssh user@docker.for.mac.localhost
invece di utilizzare l'indirizzo IP. Assicurati anche di aver abilitato la funzione Accesso remoto dal menu Preferenze di sistema macOs -> Cartella condivisa
TL; DR
Versione lunga I
test della pipeline Jenkins diventano sempre più una seccatura. A differenza del classico approccio di configurazione del lavoro dichiarativo in cui l'utente era limitato a ciò che l'interfaccia utente esponeva la nuova pipeline Jenkins è un linguaggio di programmazione completo per il processo di costruzione in cui si mescola la parte dichiarativa con il proprio codice. Come bravi sviluppatori vogliamo fare anche alcuni test unitari per questo tipo di codice.
Ci sono tre passaggi da seguire durante lo sviluppo di Jenkins Pipelines. Il passaggio 1. dovrebbe coprire l'80% dei casi d'uso.
Esempi
il pipelineUnit repo GitHub contiene alcuni esempi Spock su come utilizzare Jenkins Pipeline Unità quadro test
Jenkins ha una funzione 'Replay', che consente di riprodurre rapidamente un lavoro senza aggiornare le fonti:
Al momento della stesura (fine luglio 2017) con il plug-in Blue Ocean è possibile verificare la sintassi di una pipeline dichiarativa direttamente nell'editor della pipeline visiva . L'editor funziona dall'interfaccia utente di Blue Ocean quando si fa clic su "configura" solo per i progetti github (questo è un problema noto e stanno lavorando per farlo funzionare anche su git ecc.).
Ma, come spiegato in questa domanda , puoi aprire l'editor sfogliando:
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
Quindi fare clic al centro della pagina e premere Ctrl+S
, questo aprirà un'area di testo in cui è possibile incollare uno script dichiarativo della pipeline. Quando fai clic su Aggiorna , se c'è un errore di sintassi, l'editor ti farà sapere dove si trova l'errore di sintassi. Come in questo screenshot:
Se non si verifica alcun errore di sintassi, l'area di testo verrà chiusa e la pagina visualizzerà la pipeline. Non preoccuparti, non salverà nulla (se si tratta di un progetto github, commetterebbe il cambio di file Jenkins).
Sono nuovo di Jenkins e questo è abbastanza utile, senza questo ho dovuto impegnare un file Jenkins molte volte, fino a quando non funziona (molto fastidioso!). Spero che questo ti aiuti. Saluti.
Un po 'tardi alla festa, ma è per questo che ho scritto jenny
, una piccola reimplementazione di alcuni passaggi fondamentali di Jenkinsfile. ( https://github.com/bmustiata/jenny )
Per quanto ne so questo plugin Pipeline è il "Motore" della nuova meccanica di Jenkinsfile, quindi sono abbastanza sicuro che potresti usarlo per testare localmente i tuoi script.
Non sono sicuro che ci siano ulteriori passaggi necessari quando lo copi in un file Jenkins, tuttavia la sintassi ecc. Dovrebbe essere esattamente la stessa.
Modifica: trovato il riferimento sul "motore", controlla questa descrizione della funzione, ultimo paragrafo, prima voce.
Nella mia configurazione di sviluppo - mancando un editor Groovy appropriato - gran parte dei problemi di Jenkinsfile provengono da semplici errori di sintassi . Per affrontare questo problema, puoi convalidare il file Jenkins sulla tua istanza Jenkins (in esecuzione su $JENKINS_HTTP_URL
):
curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate
Il comando sopra è una versione leggermente modificata da https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line
A parte la funzione Replay che altri hanno già menzionato (idem sulla sua utilità!), Ho trovato utile anche quanto segue:
Inserisci la tua chiave SSH nel tuo profilo Jenkins, quindi usa la linter dichiarativa come segue:
ssh jenkins.hostname.here declarative-linter < Jenkinsfile
Questo farà un'analisi statica sul tuo Jenkinsfile. Nell'editor di tua scelta, definisci una scorciatoia da tastiera che esegue automaticamente quel comando. In Visual Studio Code, che è quello che uso, vai su Attività> Configura attività, quindi usa il seguente JSON per creare un comando Convalida Jenkinsfile :
{
"version": "2.0.0",
"tasks": [
{
"label": "Validate Jenkinsfile",
"type": "shell",
"command": "ssh jenkins.hostname declarative-linter < ${file}"
}
]
}
sto usando Replay in futuro, per fare qualche aggiornamento ed eseguire rapidamente.
Con alcune limitazioni e per le pipeline con script utilizzo questa soluzione:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
def execute() {
... main job code here ...
}
execute()