Czy można wymieniać oferty pracy między 2 różnymi Jenkinsami? Szukam sposobu na eksport / import zadań.
Czy można wymieniać oferty pracy między 2 różnymi Jenkinsami? Szukam sposobu na eksport / import zadań.
Odpowiedzi:
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!
Prawdopodobnie skorzystaj z linii poleceń jenkins to kolejna opcja, patrz https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
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
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 @-
http://OLD_JENKINS/job/JOBNAME/config.xml
łącza w przeglądarce, aby pobrać config.xml
plik.
--data-binary
zamiast -d
w curl
poleceniu, ponieważ -d
może zepsuć białe znaki w twoich skryptach.
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 .
Przejdź do strony głównej serwera Jenkins, kliknij interfejs API REST u dołu strony:
Utwórz pracę
Aby utworzyć nowe zadanie, opublikuj config.xml
pod tym adresem URL z parametrem zapytania name=JOBNAME
. Musisz wysłać Content-Type: application/xml
nagłówek. Otrzymasz 200
kod stanu, jeśli tworzenie się powiedzie, lub 4xx/5xx
kod, jeśli się nie powiedzie. config.xml
jest 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
.
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.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
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
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
W przeglądarce internetowej odwiedź:
http://[jenkinshost]/job/[jobname]/config.xml
Po prostu zapisz plik na dysku.
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
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"
To bardzo proste, wystarczy pobrać nazwę wtyczki
Wprowadź adres URL swojego zdalnego serwera Jenkins, aby automatycznie zaimportować zadania
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);
}
Najłatwiejszym sposobem, z bezpośrednim dostępem do maszyny, jest skopiowanie folderu zadania z pierwszego jenkinsa do innego (możesz wykluczyć obszary robocze - workspace
folder), 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ć modules
foldery
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
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ć.