È possibile scambiare posti di lavoro tra 2 diversi Jenkins? Sto cercando un modo per esportare / importare lavori.
È possibile scambiare posti di lavoro tra 2 diversi Jenkins? Sto cercando un modo per esportare / importare lavori.
Risposte:
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!
Probabilmente usare la riga di comando di jenkins è un'altra opzione, vedi https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
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
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 @-
http://OLD_JENKINS/job/JOBNAME/config.xml
collegamento nel browser per acquisire il config.xml
file.
--data-binary
invece che -d
nel curl
comando, perché -d
potrebbe incasinare lo spazio bianco negli script.
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 .
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.xml
in questo URL con il parametro query name=JOBNAME
. Devi inviare Content-Type: application/xml
un'intestazione. Otterrai il 200
codice di stato se la creazione ha esito positivo o il 4xx/5xx
codice 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
.
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.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
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
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
In una visita del browser Web:
http://[jenkinshost]/job/[jobname]/config.xml
Basta salvare il file sul disco.
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
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"
È molto semplice scaricare il nome del plug-in
Immettere l'URL del server Remote Jenkins per importare automaticamente i lavori
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);
}
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.
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 - workspace
cartella), poiché l'intera configurazione del lavoro è memorizzata nel file xml sul disco.
Quindi nei nuovi jenkins solo reload configuration
le 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 modules
cartelle
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
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.