Exportieren / Importieren von Jobs in Jenkins

267

Ist es möglich, Jobs zwischen 2 verschiedenen Jenkins auszutauschen? Ich suche nach einer Möglichkeit, Jobs zu exportieren / importieren.

Damluar
quelle
2
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
Michael Lihs
Einige Ratschläge über bei stackoverflow.com/questions/38585734/... auch
Ben Creasy

Antworten:

154

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!

Khez
quelle
22
Sie benötigen also Zugriff auf das System, auf dem Jenkins installiert ist? Dies ist also keine Antwort für normale Benutzer.
Wouter Schut
Bestätigt, müssen Sie Jenkins neu laden, nachdem Sie die Angaben im Dokument angewendet haben.
Miguel Ortiz
180

Wahrscheinlich ist die Verwendung der Jenkins-Befehlszeile eine weitere Option, siehe https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: Erstellt einen neuen Job, indem stdin als Konfigurations-XML-Datei gelesen wird.
  • get-job: Gibt das Jobdefinitions-XML auf stdout aus

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

Larry Cai
quelle
3
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.
MaratC
151

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 @-
MaratC
quelle
1
Benötigen Sie Authentifizierungstoken, um zu funktionieren, aber Stahl großartige Arbeit!
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' --header "Inhaltstyp: application / xml" -d @ - <br/> Benutzer-API-Schlüssel von abrufen : JENKIS_URL / Benutzer / <BENUTZER> / configure > API-Token> API-Token
anzeigen
1
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.

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 .

jwernerny
quelle
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.

user1050755
quelle
13

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.

jimmont
quelle
1
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

GaneSH Malkar
quelle
6

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
Katu
quelle
5

In einem Webbrowser besuchen Sie:

http://[jenkinshost]/job/[jobname]/config.xml

Speichern Sie die Datei einfach auf Ihrer Festplatte.

Gayan Weerakutti
quelle
unvollständige Antwort :(
Pradeep Singh
4

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
karthick
quelle
2

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"
Justin Morgan
quelle
2

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

Wächter
quelle
1
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);
}
Jitendra Chandani
quelle
1

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.

Schrauben
quelle
1

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

xxxvodnikxxx
quelle
0

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

Dixon Joseph Dalmeida
quelle
0

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.

SwimBikeRun
quelle