Ist es möglich, Jobs zwischen 2 verschiedenen Jenkins auszutauschen? Ich suche nach einer Möglichkeit, Jobs zu exportieren / importieren.
Ist es möglich, Jobs zwischen 2 verschiedenen Jenkins auszutauschen? Ich suche nach einer Möglichkeit, Jobs zu exportieren / importieren.
Antworten:
Jenkins hat ein ziemlich gutes Wiki, obwohl es schwer zu lesen ist, wenn Sie neu in der CI-Software sind ...
Sie bieten eine einfache Lösung zum Verschieben von Jobs zwischen Servern
Der Trick war wahrscheinlich die Notwendigkeit, die Konfiguration von der Jenkins-Konfigurationsseite neu zu laden.
Update 2020.03.10
Die JenkinsCI-Landschaft hat sich stark verändert ... Ich benutze Job DSL jetzt schon eine Weile. Wir haben einen SEED-Job, der den Rest der Jobs generiert.
Dies hilft uns, den Jenkins-Server bei Bedarf neu zu erstellen oder zu verschieben :) Sie können diese Dateien auch versionieren, um die Wartbarkeit zu verbessern!
Wahrscheinlich ist die Verwendung der Jenkins-Befehlszeile eine weitere Option, siehe https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
So können Sie tun
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
Es funktioniert gut für mich und ich bin es gewohnt, in meinem Versionskontrollsystem zu speichern
Ein Einzeiler:
$ curl -s http://OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http://NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-
Mit Authentifizierung:
$ 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 @-
Wenn bei Crumb CSRF aktiv ist ( siehe Details hier ):
Holen Sie sich Krümel mit:
$ 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)')
Krümel auftragen mit -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
Link in Ihrem Browser gehen können, um die config.xml
Datei abzurufen .
--data-binary
statt -d
im curl
Befehl, weil -d
möglicherweise das Leerzeichen in Ihren Skripten durcheinander bringt.
Es gibt ein Plugin namens Job Import Plugin , das genau das ist, wonach Sie suchen. Ich habe es benutzt. Es gibt Probleme beim Importieren von Projekten von einem Server, der keinen anonymen Zugriff zulässt.
Der Vollständigkeit halber: Wenn Sie über Befehlszeilenzugriff auf beide verfügen, können Sie das bereits von Khez erwähnte Verfahren zum Verschieben, Kopieren und Umbenennen von Jenkins-Jobs ausführen .
Gehen Sie zur Startseite Ihres Jenkins-Servers und klicken Sie unten auf der Seite auf REST-API:
Job erstellen
Um einen neuen Job zu erstellen, config.xml
senden Sie ihn mit dem Abfrageparameter an diese URL name=JOBNAME
. Sie müssen einen Content-Type: application/xml
Header senden . Sie erhalten 200
Statuscode, wenn die Erstellung erfolgreich ist, oder 4xx/5xx
Code, wenn dies fehlschlägt. config.xml
ist das Format, in dem Jenkins das Projekt im Dateisystem speichert, sodass Sie Beispiele dafür im Jenkins-Ausgangsverzeichnis oder durch Abrufen der XML-Konfiguration vorhandener Jobs anzeigen können /job/JOBNAME/config.xml
.
In meiner Jenkins-Instanz (Version 1.548) befindet sich die Konfigurationsdatei unter:
/var/lib/jenkins/jobs/-the-project-name-/config.xml
Im Besitz von Jenkins Benutzer und Jenkins Gruppe mit 644 Berechtigungen. Das Kopieren der Datei von und nach hier sollte funktionieren. Ich habe nicht versucht, es direkt zu ändern, habe aber die Konfiguration von dieser Stelle aus gesichert, falls das Projekt erneut eingerichtet werden muss.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Das Job-Import-Plugin ist hier die einfache Möglichkeit, Jobs aus einer anderen Jenkins-Instanz zu importieren. Sie müssen nur die URL der Quell-Jenkins-Instanz angeben. Die Remote Jenkins-URL kann eine der folgenden Arten von URLs annehmen:
http://$JENKINS
- Holen Sie sich alle Jobs auf Remote-Instanz
http://$JENKINS/job/$JOBNAME
- einen einzigen Job bekommen
http://$JENKINS/view/$VIEWNAME
- alle Jobs in einer bestimmten Ansicht erhalten
Dank der Antwort von Larry Cai konnte ich ein Skript erstellen, um alle meine Jenkins-Jobs zu sichern. Ich habe einen Job erstellt, der jede Woche ausgeführt wird. Falls jemand es nützlich findet, hier ist es:
#!/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 einem Webbrowser besuchen Sie:
http://[jenkinshost]/job/[jobname]/config.xml
Speichern Sie die Datei einfach auf Ihrer Festplatte.
Jenkins exportiert Jobs in ein Verzeichnis
#! /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
Jobs importieren
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
Für diejenigen von uns in der Windows-Welt, die möglicherweise Bash zur Verfügung haben oder nicht, ist hier mein PowerShell-Port des Ansatzes von Katu und Larry Cai . Hoffe es hilft jemandem.
##### 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"
Es ist sehr einfach, einfach den Namen des Plugins herunterzuladen
Geben Sie die URL Ihres Remote Jenkins-Servers ein und die Jobs werden automatisch importiert
Einfaches PHP-Skript hat bei mir funktioniert.
Export:
// 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);
}
Importieren:
<?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);
}
Dies funktioniert nicht für vorhandene Jobs, es gibt jedoch Jenkins Job Builder .
Dies ermöglicht es, Jobdefinitionen in Yaml-Dateien und in einem Git-Repo zu speichern, das sehr portabel ist.
Der einfachste Weg mit direktem Zugriff auf den Computer besteht darin, den Jobordner von den ersten Jenkins in einen anderen zu kopieren (Sie können Arbeitsbereiche - workspace
Ordner ausschließen), da die gesamte Jobkonfiguration in der XML-Datei auf der Festplatte gespeichert ist.
Dann sollte in den neuen Jenkins nur reload configuration
in den globalen Einstellungen (Administratorzugriff ist erforderlich) ausreichen, wenn nicht, müssen Sie das Jenkins-Tool neu starten.
Eine andere Möglichkeit kann darin bestehen, die oben genannten Plugins zu verwenden.
bearbeiten: - falls Sie wahrscheinlich auch modules
Ordner ausschließen können
Manuelles Importieren von Jobs: Alternative Methode
Laden Sie die Jobs auf Git hoch (Versionskontrolle) Laden Sie grundsätzlich die Datei config.xml des Jobs hoch.
Wenn Linux-Server:
cd /var/lib/jenkins/jobs/<Job name>
Download the config.xml from Git
Starten Sie die Jenkins neu
Als Webbenutzer können Sie exportieren, indem Sie zum Jobkonfigurationsverlauf gehen und dann XML exportieren.
Ich bin in der Situation, keinen Zugriff auf den Computer zu haben, auf dem Jenkins ausgeführt wird, und wollte als Backup exportieren.
Was den Import der XML als Webbenutzer betrifft, würde ich gerne noch wissen.