web-dev-qa-db-de.com

Exportieren/Importieren von Jobs in Jenkins

Kann ich Jobs zwischen zwei verschiedenen Jenkins austauschen? Ich suche nach einer Möglichkeit, Jobs zu exportieren/importieren.

239
damluar

Jenkins hat ein ziemlich gutes Wiki, obwohl es schwer zu lesen ist, wenn Sie noch keine CI-Software verwenden.

Sie bieten eine einfache Lösung zum Verschieben von Jobs zwischen Servern

Der Trick war wahrscheinlich die Notwendigkeit, config von der Jenkins-Konfigurationsseite neu zu laden.

141
Khez

Verwenden Sie möglicherweise die Befehlszeile jenkins, siehe https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: Erstellt einen neuen Job durch Lesen von stdin als Konfigurations-XML-Datei.
  • get-job: Gibt die XML der Jobdefinition in stdout aus

Das kannst du 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 werde verwendet, um in meinem Versionskontrollsystem zu speichern

165
Larry Cai

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 @-

Mit Crumb, wenn 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 @-
135
MaratC

Es gibt ein Plugin namens Job Import Plugin , nach dem Sie suchen. Ich habe es benutzt Es treten Probleme beim Importieren von Projekten von einem Server auf, der keinen anonymen Zugriff zulässt.

Vollständigkeit: Wenn Sie über beide über die Befehlszeile verfügen, können Sie die von Khez bereits erwähnte Prozedur für Verschieben, Kopieren und Umbenennen von Jenkins Jobs ausführen.

24
jwernerny

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, geben Sie config.xml mit dem Abfrageparameter name=JOBNAME an diese URL ein. Sie müssen einen Content-Type: application/xml-Header senden. Sie erhalten 200-Statuscode, wenn die Erstellung erfolgreich ist, oder 4xx/5xx-Code, wenn die Ausführung fehlschlägt. config.xml ist das Format, das Jenkins verwendet, um das Projekt im Dateisystem zu speichern. Sie können Beispiele davon im Jenkins-Basisverzeichnis oder durch Abrufen der XML-Konfiguration vorhandener Jobs von /job/JOBNAME/config.xml anzeigen.

13
user1050755

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 nach und von hier sollte funktionieren. Ich habe es nicht direkt versucht, es zu ändern, habe aber die Konfiguration von dieser Stelle aus gesichert, falls das Projekt erneut eingerichtet werden muss.

8
jimmont

Job Import Plugin ist der einfache Weg, um Jobs aus einer anderen Jenkins-Instanz zu importieren. Geben Sie einfach die URL der Jenkins-Quellinstanz an. Die Remote-Jenkins-URL kann einen der folgenden URL-Typen annehmen:

  • http://$JENKINS - holt alle Jobs in der Remote-Instanz

  • http://$JENKINS/job/$JOBNAME - einen einzelnen Job abrufen

  • http://$JENKINS/view/$VIEWNAME - Alle Jobs in einer bestimmten Ansicht abrufen

7
GaneSH Malkar

Dank Larry Cais Antwort konnte ich ein Skript erstellen, um alle meine Jenkins-Jobs zu sichern. Ich habe einen Job erstellt, der dies jede Woche ausführt. Falls es jemand 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
6
Katu

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
4
karthick

Für diejenigen von uns in der Windows-Welt, die möglicherweise nicht über Bash verfügen, ist hier der PowerShell-Port von Katu und Larry Cai s Ansatz. 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"
1
Justin Morgan

Mit dem direkten Zugriff auf den Computer ist es am einfachsten, den Jobordner von den ersten Jenkins auf einen anderen zu kopieren (Sie können den Arbeitsbereich workspace 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 (Admin-Zugriff ist erforderlich) ausreichend sein. Wenn nicht, dann müssen Sie das Jenkins-Tool neu starten.

Eine andere Möglichkeit kann die Verwendung von Plugins sein, die oben in diesem Beitrag erwähnt werden.

edit: - falls Sie wahrscheinlich auch modules-Ordner ausschließen können

1
xxxvodnikxxx

Ein einfaches PHP-Skript hat für mich 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);
}

Einführen:

<?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

Dies funktioniert nicht für bestehende Jobs, jedoch gibt es Jenkins Job Builder .

Dies ermöglicht es, Jobdefinitionen in yaml-Dateien und in einem sehr portablen git-Repo zu speichern.

1
pcrews

Es ist sehr einfach, den Namen des Plugins herunterzuladen 

Job Import Plugin

Geben Sie die URL Ihres Remote Jenkins-Servers ein, und die Jobs werden automatisch importiert

0
Guardian

Jobs manuell importieren: Alternative

Laden Sie die Jobs auf Git (Versionskontrolle) hoch Laden Sie die Datei config.xml des Jobs grundsätzlich hoch.

Wenn Linux-Server:

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

Starten Sie die Jenkins neu

0
Dixon Almeida

Standardmäßig ist dies auf ~/.jenkins eingestellt. Sie können dies jedoch auf eine der folgenden Arten ändern:

* Set "JENKINS_HOME" environment variable to the new home directory before launching 
the servlet container.
* Set "JENKINS_HOME" system property to the servlet container.
* Set JNDI environment entry "JENKINS_HOME" to the new directory.

Weitere Informationen dazu, wie Sie dies für Ihren Container tun können, finden Sie in der Dokumentation zur Container-spezifischen Dokumentation.

Sie können diesen Ort auch ändern, nachdem Sie Jenkins eine Zeit lang verwendet haben. Stoppen Sie dazu Jenkins vollständig, verschieben Sie den Inhalt vom alten JENKINS_HOME in das neue Zuhause, legen Sie das neue JENKINS_HOME fest und starten Sie Jenkins erneut.

JENKINS_HOME hat eine ziemlich offensichtliche Verzeichnisstruktur, die wie folgt aussieht:

JENKINS_HOME
 +- config.xml     (jenkins root configuration)
 +- *.xml          (other site-wide configuration files)  
 +- userContent    (files in this directory will be served under your 
 http://server/userContent/)  
 +- fingerprints   (stores fingerprint records)
 +- plugins        (stores plugins)
 +- workspace (working directory for the version control system)
     +- [JOBNAME] (sub directory for each job)
 +- jobs
 +- [JOBNAME]      (sub directory for each job)
     +- config.xml     (job configuration file)
     +- latest         (symbolic link to the last successful build)
     +- builds
         +- [BUILD_ID]     (for each build)
             +- build.xml      (build result summary)
             +- log            (log file)
             +- changelog.xml  (change log)

Sichern und Wiederherstellen:

Alle Einstellungen, Build-Protokolle und Artefaktarchive werden im Verzeichnis JENKINS_HOME gespeichert. Archivieren Sie dieses Verzeichnis einfach, um eine Sicherungskopie zu erstellen. Auf ähnliche Weise ersetzt die Wiederherstellung der Daten lediglich den Inhalt des Verzeichnisses JENKINS_HOME aus einer Sicherung.

Sie können Sicherungskopien erstellen, ohne den Server zu stoppen. Wenn Sie jedoch wiederherstellen, stoppen Sie den Server.

Jobs verschieben/kopieren/umbenennen

Sie können:

  1. Verschieben Sie einen Job von einer Installation von Jenkins in eine andere, indem Sie einfach das entsprechende Jobverzeichnis kopieren.
  2. Erstellen Sie eine Kopie eines vorhandenen Jobs, indem Sie ein Jobverzeichnis unter einem anderen Namen klonen.
  3. Benennen Sie einen vorhandenen Job um, indem Sie ein Verzeichnis umbenennen. Wenn Sie einen Jobnamen ändern, müssen Sie jeden anderen Job ändern, der versucht, den umbenannten Job aufzurufen.

Diese Vorgänge können auch ausgeführt werden, wenn Jenkins ausgeführt wird. Damit Änderungen wie diese wirksam werden, müssen Sie auf "reload config" klicken, damit Jenkins die Konfiguration von der Festplatte neu lädt.

Batch-Umbenennung von Jobs

Leerzeichen in Jobnamen durch Unterstriche ersetzen

$ rename 's/\s/_/g' *

Nicht verwendete Jobs archivieren

Manchmal möchten Sie einen Job von Jenkins entfernen, tun dies jedoch auf eine Weise, die Sie später wiederbeleben können, wenn dies erforderlich ist. Gehen Sie hierzu zu $ ​​JENKINS_HOME und erstellen Sie ein Archiv des Jobverzeichnisses. Der folgende Befehl veranschaulicht, wie ein Job 'xyz' archiviert und entfernt wird.

$ cd $JENKINS_HOME/jobs
$ tar czf xyz.tgz xyz
// go to Jenkins GUI "Manage Jenkins" page and "Reload Configuration from Disk"

Solange Sie das xyz-Projekt nicht erstellen, während Sie ein Archiv erstellen, können Sie diese Operation ausführen, ohne Jenkins offline zu setzen.

Siehe auch das "Shelve Project" Plugin .

Script Console

Nützlich für die Fehlersuche, Diagnose oder Stapelaktualisierung von Jobs Jenkins bietet eine Skriptkonsole, über die Sie auf alle Jenkins-Interna zugreifen können .. Diese Skripts sind in Groovy geschrieben und einige Beispiele finden Sie in dieser Seite .

URL-Optionen

http://[jenkins-server]/[command]

wo [Befehl] sein kann

  1. beenden Sie das Herunterfahren von Jenkins
  2. neustart Jenkins neu starten
  3. neu laden, um die Konfiguration neu zu laden
0
Gavriel Cohen

Als Webbenutzer können Sie exportieren, indem Sie zum Job Config-Protokoll wechseln und dann XML exportieren.

Ich bin in der Situation, keinen Zugriff auf die Maschine zu haben, auf der Jenkins läuft, und wollte als Backup exportieren.

Was den Import der XML-Datei als Webbenutzer betrifft, würde ich gerne wissen.

0
SwimBikeRun