Esporta / importa lavori in Jenkins


268

È possibile scambiare posti di lavoro tra 2 diversi Jenkins? Sto cercando un modo per esportare / importare lavori.


2
Non direttamente una risposta alla tua domanda, ma alcune best practice: prova a scrivere la configurazione del tuo lavoro con Jenkins Pipeline DSL e rendila parte dei repository dei tuoi progetti. In questo modo, i lavori sono facilmente trasportabili da un server Jenkins all'altro. Vedi github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs

Alcuni consigli sopra a stackoverflow.com/questions/38585734/... così
Ben Creasy

Risposte:


154

Jenkins ha una wiki piuttosto buona, anche se difficile da leggere quando sei nuovo nel software CI ...

Offrono una soluzione semplice per lo spostamento di lavori tra server

Il trucco probabilmente era la necessità di ricaricare la configurazione dalla pagina di configurazione di Jenkins.

Aggiornamento 2020.03.10

Il panorama JenkinsCI è cambiato molto ... Uso Job DSL da un po 'di tempo. Abbiamo un lavoro SEED che genera il resto dei lavori.

Questo ci aiuta a ricreare o spostare per il server Jenkins ogni volta che è necessario :) Puoi anche versioni di quei file per una manutenibilità ancora maggiore!


22
Quindi hai bisogno di accedere al sistema in cui è installato jenkins? Quindi questa non è una risposta per gli utenti normali.
Wouter Schut,

Confermato, è necessario ricaricare Jenkins dopo aver applicato ciò che dice il documento.
Miguel Ortiz,

180

Probabilmente usare la riga di comando di jenkins è un'altra opzione, vedi https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: crea un nuovo lavoro leggendo stdin come file XML di configurazione.
  • get-job: scarica l'XML della definizione del lavoro su stdout

Quindi puoi farlo

java -jar jenkins-cli.jar -s http://server get-job myjob > myjob.xml
java -jar jenkins-cli.jar -s http://server create-job newmyjob < myjob.xml

Funziona bene per me e sono abituato a memorizzare nel mio sistema di controllo versione


3
Perché ciò funzioni, java sul tuo vecchio server, nuovo server e macchina locale deve avere la stessa versione. Altrimenti, sorgono strani problemi di flusso / versione. Anche le tue porte jnlp devono essere aperte.
MaratC

Il percorso completo per il client CLI è JENKINS_HOME / war / WEB-INF / jenkins-cli.jar dove JENKINS_HOME è la posizione di JENKINS_HOME
Rob Kielty,

1
Questo metodo ha problemi con la nuda e commerciale nuda nell'XML, ad esempio quando hai e nel codice Groovy.
Rob Kielty,

le e commerciali non codificate nell'XML esportato possono verificarsi nel codice Groovy che supporta i parametri del plug-in di scelta attiva (non scelta); presenterò la soluzione se posso.
Rob Kielty,

1
@information_interchange esattamente come proposto nella mia risposta di seguito.
MaratC,

151

Una fodera:

$ curl -s http://OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http://NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-

Con autenticazione:

$ curl -s http:///<USER>:<API_TOKEN>@OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http:///<USER>:<API_TOKEN>@NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-

Con Crumb, se CSRF è attivo ( vedere i dettagli qui ):

Sbriciolate con:

$ CRUMB_OLD=$(curl -s 'http://<USER>:<API_TOKEN>@OLD_JENKINS/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
$ CRUMB_NEW=$(curl -s 'http://<USER>:<API_TOKEN>@NEW_JENKINS/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')

Applicare la briciola con -H CRUMB:

$ curl -s -H $CRUMB_OLD http:///<USER>:<API_TOKEN>@OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST -H $CRUMB_NEW 'http:///<USER>:<API_TOKEN>@NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-

1
Hai bisogno di token di autenticazione per funzionare, ma acciaio ottimo lavoro!
Viroide,

7
curl -s http: // <USER>: <API_TOEKN> @ OLD_JENKINS / job / JOBNAME / config.xml | curl -X POST 'http: // <USER>: <API_TOEKN> @ NEW_JENKINS / createItem? name = JOBNAME' - intestazione "Content-Type: application / xml" -d @ - <br/> Ottieni chiave API utente da : JENKIS_URL / user / <USER> / configure > Token API> Mostra token API
Suhas Gaikwad,

1
Solo un contributo aggiuntivo su questo. Quando si invia al server di destinazione è probabile che venga visualizzato un codice di errore HTTP 403 Problema durante l'accesso / createItem. Motivo: nessuna briciola valida è stata inclusa nella richiesta. Dovrai generare un token di protezione CSRF per il server Jenkins di destinazione. Seguite i consigli del @Kenorb da questa discussione: stackoverflow.com/questions/38137760/...
Mig82

2
Non è nemmeno necessario utilizzare i comandi di arricciatura, in quanto è sufficiente accedere al http://OLD_JENKINS/job/JOBNAME/config.xmlcollegamento nel browser per acquisire il config.xmlfile.
entpnerd

1
È necessario --data-binaryinvece che -dnel curlcomando, perché -dpotrebbe incasinare lo spazio bianco negli script.
Gabor Csardi,

24

C'è un plugin chiamato Job Import Plugin che potrebbe essere quello che stai cercando. L'ho usato Ha problemi con l'importazione di progetti da un server che non consente l'accesso anonimo.

Per completezza: se si dispone dell'accesso alla riga di comando ad entrambi, è possibile eseguire la procedura già menzionata da Khez per lo spostamento, la copia e la ridenominazione di lavori Jenkins .


Non credo che attualmente si muova altro che la configurazione.
jwernerny,

14

Vai alla prima pagina del tuo server Jenkins, fai clic sull'API REST nella parte inferiore della pagina:

Crea lavoro

Per creare un nuovo lavoro, pubblicare config.xmlin questo URL con il parametro query name=JOBNAME. Devi inviare Content-Type: application/xmlun'intestazione. Otterrai il 200codice di stato se la creazione ha esito positivo o il 4xx/5xxcodice se non riesce. config.xmlè il formato utilizzato da Jenkins per archiviare il progetto nel file system, in modo da poterne vedere esempi nella directory home di Jenkins o recuperando la configurazione XML dei lavori esistenti /job/JOBNAME/config.xml.


13

Nella mia istanza di Jenkins (versione 1.548) il file di configurazione è in:

/var/lib/jenkins/jobs/-the-project-name-/config.xml

Di proprietà dell'utente jenkins e del gruppo jenkins con 644 autorizzazioni. La copia del file da e verso qui dovrebbe funzionare. Non ho provato a cambiarlo direttamente, ma ho eseguito il backup della configurazione da questo punto nel caso in cui il progetto debba essere impostato nuovamente.


1
in WindowsC:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Sasha Bond,

8

Il plug-in di importazione lavoro è il modo semplice qui per importare lavori da un'altra istanza di Jenkins. Devo solo fornire l'URL dell'istanza Jenkins di origine. L'URL Jenkins remoto può accettare uno dei seguenti tipi di URL:

  • http://$JENKINS - ottenere tutti i lavori su istanza remota

  • http://$JENKINS/job/$JOBNAME - trova un singolo lavoro

  • http://$JENKINS/view/$VIEWNAME - ottenere tutti i lavori in una vista particolare


6

Grazie alla risposta di Larry Cai sono riuscito a creare uno script per eseguire il backup di tutti i miei lavori Jenkins. Ho creato un lavoro che lo esegue ogni settimana. Nel caso in cui qualcuno lo trovi utile, eccolo qui:

#!/bin/bash
#IFS for jobs with spaces.
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for i in $(java -jar /run/jenkins/war/WEB-INF/jenkins-cli.jar -s http://server:8080/ list-jobs); 
do 
  java -jar /run/jenkins/war/WEB-INF/jenkins-cli.jar -s http://server:8080/ get-job ${i} > ${i}.xml;
done
IFS=$SAVEIFS
mkdir deploy
tar cvfj "jenkins-jobs.tar.bz2" ./*.xml


4

Jenkins esporta i lavori in una directory

 #! /bin/bash
    SAVEIFS=$IFS
    IFS=$(echo -en "\n\b")
    declare -i j=0
    for i in $(java -jar jenkins-cli.jar -s http://server:8080/jenkins list-jobs  --username **** --password ***);
    do
    let "j++";
    echo $j;
    if [ $j -gt 283 ] // If you have more jobs do it in chunks as it will terminate in the middle of the process. So Resume your job from where it ends.
     then
    java -jar jenkins-cli.jar -s http://lxvbmcbma:8080/jenkins get-job --username **** --password **** ${i} > ${i}.xml;
    echo "done";
    fi
    done

Importa lavori

for f in *.xml;
do
echo "Processing ${f%.*} file.."; //truncate the .xml extention and load the xml file for job creation
java -jar jenkins-cli.jar -s http://server:8080/jenkins create-job ${f%.*}  < $f
done

2

Per quelli di noi nel mondo Windows che potrebbero avere o meno Bash disponibile, ecco il mio approccio PowerShell di Katu e l' approccio di Larry Cai . Spero che aiuti qualcuno.

##### Config vars #####
$serverUri = 'http://localhost:8080/' # URI of your Jenkins server
$jenkinsCli = 'C:\Program Files (x86)\Jenkins\war\WEB-INF\jenkins-cli.jar' # Path to jenkins-cli.jar on your machine
$destFolder = 'C:\Jenkins Backup\' # Output folder (will be created if it doesn't exist)
$destFile = 'jenkins-jobs.zip' # Output filename (will be overwritten if it exists)
########################

$work = Join-Path ([System.IO.Path]::GetTempPath()) ([System.IO.Path]::GetRandomFileName())
New-Item -ItemType Directory -Force -Path $work | Out-Null # Suppress output noise
echo "Created a temp working folder: $work"

$jobs = (java -jar $jenkinsCli -s $serverUri list-jobs)
echo "Found $($jobs.Length) existing jobs: [$jobs]"

foreach ($j in $jobs)
{
    $outfile = Join-Path $work "$j.xml"
    java -jar $jenkinsCli -s $serverUri get-job $j | Out-File $outfile
}
echo "Saved $($jobs.Length) jobs to temp XML files"

New-Item -ItemType Directory -Force -Path $destFolder | Out-Null # Suppress output noise
echo "Found (or created) $destFolder folder"

$destPath = Join-Path $destFolder $destFile
Get-ChildItem $work -Filter *.xml | 
    Write-Zip -Level 9 -OutputPath $destPath -FlattenPaths |
    Out-Null # Suppress output noise
echo "Copied $($jobs.Length) jobs to $destPath"

Remove-Item $work -Recurse -Force
echo "Removed temp working folder"

2

È molto semplice scaricare il nome del plug-in

Plugin di importazione lavoro

Immettere l'URL del server Remote Jenkins per importare automaticamente i lavori


1
Questo potrebbe funzionare per alcuni, ma non per me. Funziona solo se la nuova istanza di Jenkins ha accesso diretto alla vecchia istanza di Jenkins. I miei erano su due reti diverse.
Justin Domnitz,

1

Lo script php semplice ha funzionato per me.

Esportare:

// add all job codes in the array
$jobs = array("job1", "job2", "job3");

foreach ($jobs as $value)
{
    fwrite(STDOUT, $value. " \n") or die("Unable to open file!");
    $path = "http://server1:8080/jenkins/job/".$value."/config.xml";
    $myfile = fopen($value.".xml", "w");
    fwrite($myfile, file_get_contents($path));
    fclose($myfile);
}

Importare:

<?php

// add all job codes in the array
$jobs = array("job1", "job2", "job3");

foreach ($arr as $value)
{
    fwrite(STDOUT, $value. " \n") or die("Unable to open file!");
    $cmd = "java -jar jenkins-cli.jar -s http://server2:8080/jenkins/ create-job ".$value." < ".$value.".xml";
    echo exec($cmd);
}

1

Questo non funziona per i lavori esistenti, tuttavia esiste il generatore di lavori Jenkins .

Ciò consente di mantenere le definizioni dei lavori nei file yaml e in un repository git che è molto portabile.


1

Il modo più semplice, con accesso diretto alla macchina è copiare la cartella del lavoro dai primi jenkins in un altro (è possibile escludere aree di lavoro - workspacecartella), poiché l'intera configurazione del lavoro è memorizzata nel file xml sul disco.

Quindi nei nuovi jenkins solo reload configurationle impostazioni globali (è richiesto l'accesso dell'amministratore), in caso contrario, sarà necessario riavviare lo strumento Jenkins.

Un altro modo può essere quello di utilizzare i plugin menzionati sopra questo post.

modifica: - nel caso in cui tu possa probabilmente anche escludere le modulescartelle


0

Importazione manuale di lavori: modo alternativo

Carica i lavori su Git (controllo versione) In pratica carica config.xml del lavoro.

Se server Linux:

cd /var/lib/jenkins/jobs/<Job name> 
Download the config.xml from Git

Riavvia Jenkins


0

Come utente Web, è possibile esportare andando su Cronologia configurazione lavoro, quindi esportando XML.

Sono nella situazione di non avere accesso alla macchina su cui Jenkins è in esecuzione e voleva esportare come backup.

Per quanto riguarda l'importazione dell'xml come utente Web, mi piacerebbe comunque saperlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.