Eksportuj / importuj zadania w Jenkins

268

Czy można wymieniać oferty pracy między 2 różnymi Jenkinsami? Szukam sposobu na eksport / import zadań.

damluar
źródło
2
Nie bezpośrednia odpowiedź na twoje pytanie, ale najlepsza praktyka: spróbuj napisać konfigurację swojej pracy za pomocą Jenkins Pipeline DSL i włączyć ją do repozytoriów twoich projektów. W ten sposób zadania można łatwo przenosić z jednego serwera Jenkins na drugi. Zobacz github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs
Kilka rad na co stackoverflow.com/questions/38585734/... także
Ben Creasy

Odpowiedzi:

154

Jenkins ma dość dobrą wiki, choć trudną do odczytania, gdy jesteś nowy w oprogramowaniu CI ...

Oferują proste rozwiązanie do przenoszenia zadań między serwerami

Sztuczka prawdopodobnie polegała na konieczności ponownego załadowania konfiguracji ze strony konfiguracji Jenkins.

Aktualizacja 2020.03.10

Krajobraz JenkinsCI bardzo się zmienił ... Od jakiegoś czasu korzystam z Job DSL . Mamy SEED Job, który generuje resztę zadań.

Pomaga nam to odtworzyć lub przenieść na serwer Jenkins, gdy zajdzie taka potrzeba :) Możesz również zaktualizować te pliki, aby uzyskać jeszcze większą łatwość konserwacji!

Chez
źródło
22
Potrzebujesz dostępu do systemu, w którym jest zainstalowany Jenkins? To nie jest odpowiedź dla zwykłych użytkowników.
Wouter Schut
Potwierdzono, że należy ponownie załadować Jenkins po zastosowaniu tego, co mówi dokument.
Miguel Ortiz
180

Prawdopodobnie skorzystaj z linii poleceń jenkins to kolejna opcja, patrz https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: Tworzy nowe zadanie, czytając stdin jako plik konfiguracyjny XML.
  • get-job: Zrzuca XML definicji zadania na standardowe wyjście

Więc możesz to zrobić

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

Działa dla mnie dobrze i jestem przyzwyczajony do przechowywania w moim systemie kontroli wersji

Larry Cai
źródło
3
Aby to zadziałało, Java na starym serwerze, nowym serwerze i komputerze lokalnym musi mieć tę samą wersję. W przeciwnym razie pojawiają się dziwne problemy ze strumieniem / wersją. Twoje porty jnlp również muszą być otwarte.
MaratC
Pełna ścieżka do klienta CLI to JENKINS_HOME / war / WEB-INF / jenkins-cli.jar, gdzie JENKINS_HOME to lokalizacja JENKINS_HOME
Rob Kielty
1
Ta metoda ma problemy z nagimi ampersandami w pliku XML, na przykład gdy masz kod & Groovy.
Rob Kielty
niekodowane znaki handlowe w eksportowanym pliku XML mogą występować w kodzie Groovy, który wspiera parametry wtyczki Active Choice Plugin (bez możliwości wyboru); przedstawię rozwiązanie, jeśli mogę.
Rob Kielty
1
@information_interchange dokładnie jak zaproponowano w mojej odpowiedzi poniżej.
MaratC
151

Jednowarstwowy:

$ curl -s http://OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http://NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-

Z uwierzytelnieniem:

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

W przypadku Okruchów, jeśli CSRF jest aktywny ( zobacz szczegóły tutaj ):

Zdobądź okruchy dzięki:

$ 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)')

Nałożyć okruchy za pomocą -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
źródło
1
Potrzebujesz tokenów uwierzytelniających do pracy, ale stal świetna robota!
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' - nagłówek "Content-Type: application / xml" -d @ - <br/> Pobierz klucz API użytkownika z : JENKIS_URL / user / <USER> / configure > Token API> Pokaż token API
Suhas Gaikwad 16.08.16
1
Tylko jeden dodatkowy wkład w to. Podczas wysyłania do serwera docelowego prawdopodobnie pojawi się kod błędu HTTP 403 Problem z dostępem / createItem. Powód: Żądanie nie zawierało ważnego okruchu. Musisz wygenerować token ochrony CSRF dla docelowego serwera Jenkins. Postępuj zgodnie z radą @Kenorb z tego wątku: stackoverflow.com/questions/38137760/...
Mig82
2
Nie musisz nawet używać poleceń curl, ponieważ możesz po prostu przejść do http://OLD_JENKINS/job/JOBNAME/config.xmlłącza w przeglądarce, aby pobrać config.xmlplik.
entpnerd
1
Musisz --data-binaryzamiast -dw curlpoleceniu, ponieważ -dmoże zepsuć białe znaki w twoich skryptach.
Gabor Csardi
24

Istnieje wtyczka o nazwie Job Import Plugin, która może być tym, czego szukasz. Użyłem tego. Ma problemy z importowaniem projektów z serwera, który nie pozwala na anonimowy dostęp.

Dla kompletności: Jeśli masz dostęp z linii poleceń do obu, możesz wykonać procedurę już wspomnianą przez Khez w zakresie przenoszenia, kopiowania i zmiany nazwy Jenkins Jobs .

jwernerny
źródło
Nie sądzę, że obecnie przenosi coś innego niż konfiguracja.
jwernerny,
14

Przejdź do strony głównej serwera Jenkins, kliknij interfejs API REST u dołu strony:

Utwórz pracę

Aby utworzyć nowe zadanie, opublikuj config.xmlpod tym adresem URL z parametrem zapytania name=JOBNAME. Musisz wysłać Content-Type: application/xmlnagłówek. Otrzymasz 200kod stanu, jeśli tworzenie się powiedzie, lub 4xx/5xxkod, jeśli się nie powiedzie. config.xmljest formatem używanym przez Jenkinsa do przechowywania projektu w systemie plików, dzięki czemu można zobaczyć ich przykłady w katalogu domowym Jenkins lub pobierając konfigurację XML istniejących zadań /job/JOBNAME/config.xml.

użytkownik1050755
źródło
13

W mojej instancji Jenkins (wersja 1.548) plik konfiguracyjny znajduje się w:

/var/lib/jenkins/jobs/-the-project-name-/config.xml

Należy do użytkownika jenkins i grupy jenkins z uprawnieniami 644. Kopiowanie pliku do i stąd powinno działać. Nie próbowałem zmieniać go bezpośrednio, ale utworzyłem kopię zapasową konfiguracji z tego miejsca na wypadek, gdyby projekt musiał zostać ponownie skonfigurowany.

Jimmont
źródło
1
w systemie WindowsC:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Sasha Bond
8

Wtyczka Job Import to prosty sposób na importowanie zadań z innej instancji Jenkins. Wystarczy podać adres URL źródłowej instancji Jenkinsa. Zdalny adres URL Jenkins może przyjmować dowolny z następujących typów adresów URL:

  • http://$JENKINS - pobierz wszystkie zadania na zdalnej instancji

  • http://$JENKINS/job/$JOBNAME - dostać jedną pracę

  • http://$JENKINS/view/$VIEWNAME - uzyskać wszystkie zadania w określonym widoku

GaneSH Malkar
źródło
6

Dzięki odpowiedzi Larry'ego Cai udało mi się stworzyć skrypt do tworzenia kopii zapasowych wszystkich moich zadań w Jenkins. Stworzyłem pracę, która działa co tydzień. Jeśli ktoś uzna to za przydatne, oto:

#!/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
źródło
5

W przeglądarce internetowej odwiedź:

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

Po prostu zapisz plik na dysku.

Gayan Weerakutti
źródło
niepełna odpowiedź :(
Pradeep Singh
4

Jenkins eksportuje zadania do katalogu

 #! /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

Importuj zadania

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
źródło
2

Dla tych z nas w świecie Windows, którzy mogą, ale nie muszą mieć dostępnego Basha, oto mój port PowerShell Katu i Larry'ego Cai . Mam nadzieję, że to komuś pomoże.

##### 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
źródło
2

To bardzo proste, wystarczy pobrać nazwę wtyczki

Wtyczka importu zadań

Wprowadź adres URL swojego zdalnego serwera Jenkins, aby automatycznie zaimportować zadania

Opiekun
źródło
1
To może działać dla niektórych, ale nie dla mnie. Działa to tylko wtedy, gdy nowa instancja Jenkins ma bezpośredni dostęp do starej instancji Jenkins. Moje były w dwóch różnych sieciach.
Justin Domnitz
1

Prosty skrypt php działał dla mnie.

Eksport:

// 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);
}

Import:

<?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
źródło
1

Nie działa to w przypadku istniejących zleceń, jednak istnieje narzędzie do tworzenia zleceń Jenkins .

Pozwala to zachować definicje zadań w plikach yaml oraz w bardzo przenośnym repozytorium git.

sztaby
źródło
1

Najłatwiejszym sposobem, z bezpośrednim dostępem do maszyny, jest skopiowanie folderu zadania z pierwszego jenkinsa do innego (możesz wykluczyć obszary robocze - workspacefolder), ponieważ cała konfiguracja zadania jest przechowywana w pliku xml na dysku.

A potem tylko w nowych jenkinsach reload configuration w ustawieniach globalnych (wymagany jest dostęp administratora) powinno wystarczyć, jeśli nie, musisz ponownie uruchomić narzędzie Jenkins.

Innym sposobem może być użycie wtyczek wymienionych powyżej w tym poście.

edycja: - na wypadek, gdybyś prawdopodobnie mógł również wykluczyć modulesfoldery

xxxvodnikxxx
źródło
0

Ręczne importowanie zadań: alternatywny sposób

Prześlij zadania do Git (kontrola wersji) Zasadniczo prześlij config.xml zadania.

Jeśli serwery Linux:

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

Uruchom ponownie Jenkins

Dixon Joseph Dalmeida
źródło
0

Jako użytkownik sieci web możesz eksportować, przechodząc do Historii konfiguracji zadań, a następnie eksportując XML.

Nie mam dostępu do komputera, na którym działa Jenkins i chciałem wyeksportować jako kopię zapasową.

Jeśli chodzi o importowanie xml jako użytkownika internetowego, nadal chciałbym wiedzieć.

SwimBikeRun
źródło