Eksportuj / importuj zadania w Jenkins


268

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


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

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!


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


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

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


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.


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.


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


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


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

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"

2

To bardzo proste, wystarczy pobrać nazwę wtyczki

Wtyczka importu zadań

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


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

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.


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


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


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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.