Keine direkte Antwort auf Ihre Frage, sondern eine bewährte Methode: Versuchen Sie, Ihre Jobkonfiguration mit dem Jenkins Pipeline DSL zu schreiben und sie in die Repositorys Ihrer Projekte aufzunehmen. Auf diese Weise können die Jobs problemlos von einem Jenkins-Server auf den anderen übertragen werden. Siehe github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
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!
Damit dies funktioniert, muss Java auf Ihrem alten Server, neuen Server und lokalen Computer dieselbe Version haben. Andernfalls treten seltsame Stream- / Versionsprobleme auf. Ihre jnlp-Ports müssen ebenfalls geöffnet sein.
MaratC
Der vollständige Pfad zum CLI-Client lautet JENKINS_HOME / war / WEB-INF / jenkins-cli.jar, wobei JENKINS_HOME der Speicherort von JENKINS_HOME ist
Rob Kielty
1
Diese Methode hat Probleme mit nackten kaufmännischen Und-Zeichen im XML, z. B. wenn Sie & im Groovy-Code haben.
Rob Kielty
Nicht codierte kaufmännische Und-Zeichen im exportierten XML können in Groovy-Code vorkommen, der die Parameter des Active Choice Plugins (Uno-Choice) unterstützt. Ich werde eine Lösung präsentieren, wenn ich kann.
Rob Kielty
1
@information_interchange genau wie in meiner Antwort unten vorgeschlagen.
Nur ein zusätzlicher Beitrag dazu. Beim POSTEN auf den Zielserver wird wahrscheinlich ein Fehlercode HTTP 403 angezeigt. Problem beim Zugriff auf / createItem. Grund: Die Anfrage enthielt keine gültige Krume. Sie müssen ein CSRF-Schutztoken für den Ziel-Jenkins-Server generieren. Folgen Sie den Ratschlägen von @Kenorb aus diesem Thread: stackoverflow.com/questions/38137760/…
Mig82
2
Sie müssen nicht einmal Curl-Befehle verwenden, da Sie einfach zum http://OLD_JENKINS/job/JOBNAME/config.xmlLink in Ihrem Browser gehen können, um die config.xmlDatei abzurufen .
Entpnerd
1
Sie müssen --data-binarystatt -dim curlBefehl, weil -dmöglicherweise das Leerzeichen in Ihren Skripten durcheinander bringt.
Gabor Csardi
24
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.
Ich glaube nicht, dass es derzeit etwas anderes als die Konfiguration bewegt.
Jwernerny
14
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.xmlsenden Sie ihn mit dem Abfrageparameter an diese URL name=JOBNAME. Sie müssen einen Content-Type: application/xmlHeader senden . Sie erhalten 200Statuscode, wenn die Erstellung erfolgreich ist, oder 4xx/5xxCode, wenn dies fehlschlägt. config.xmlist 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.
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.
in WindowsC:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Sasha Bond
8
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
#! /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-ItemTypeDirectory-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-ItemTypeDirectory-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-Level9-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"
Dies könnte für einige funktionieren, aber nicht für mich. Dies funktioniert nur, wenn die neue Jenkins-Instanz direkten Zugriff auf die alte Jenkins-Instanz hat. Meine waren in zwei verschiedenen Netzwerken.
Justin Domnitz
1
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);
}
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 - workspaceOrdner ausschließen), da die gesamte Jobkonfiguration in der XML-Datei auf der Festplatte gespeichert ist.
Dann sollte in den neuen Jenkins nur reload configurationin 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 modulesOrdner ausschließen können
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!
quelle
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
Es funktioniert gut für mich und ich bin es gewohnt, in meinem Versionskontrollsystem zu speichern
quelle
Ein Einzeiler:
Mit Authentifizierung:
Wenn bei Crumb CSRF aktiv ist ( siehe Details hier ):
Holen Sie sich Krümel mit:
Krümel auftragen mit
-H CRUMB
:quelle
http://OLD_JENKINS/job/JOBNAME/config.xml
Link in Ihrem Browser gehen können, um dieconfig.xml
Datei abzurufen .--data-binary
statt-d
imcurl
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 .
quelle
Gehen Sie zur Startseite Ihres Jenkins-Servers und klicken Sie unten auf der Seite auf REST-API:
Um einen neuen Job zu erstellen,
config.xml
senden Sie ihn mit dem Abfrageparameter an diese URLname=JOBNAME
. Sie müssen einenContent-Type: application/xml
Header senden . Sie erhalten200
Statuscode, wenn die Erstellung erfolgreich ist, oder4xx/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
.quelle
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.
quelle
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-Instanzhttp://$JENKINS/job/$JOBNAME
- einen einzigen Job bekommenhttp://$JENKINS/view/$VIEWNAME
- alle Jobs in einer bestimmten Ansicht erhaltenquelle
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:
quelle
In einem Webbrowser besuchen Sie:
Speichern Sie die Datei einfach auf Ihrer Festplatte.
quelle
Jenkins exportiert Jobs in ein Verzeichnis
Jobs importieren
quelle
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.
quelle
Es ist sehr einfach, einfach den Namen des Plugins herunterzuladen
Job Import Plugin
Geben Sie die URL Ihres Remote Jenkins-Servers ein und die Jobs werden automatisch importiert
quelle
Einfaches PHP-Skript hat bei mir funktioniert.
Export:
Importieren:
quelle
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.
quelle
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önnenquelle
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:
Starten Sie die Jenkins neu
quelle
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.
quelle