Експорт / імпорт робочих місць у Дженкінсі


268

Чи можливий обмін роботою між двома різними Дженкінсами? Я шукаю спосіб експорту / імпорту робочих місць.


2
Не безпосередньо відповідь на ваше запитання, але найкраща практика: спробуйте написати конфігурацію вашої роботи за допомогою DSL Jenkins Pipeline і перетворіть її в сховища ваших проектів. Так, завдання легко переноситься з одного сервера Дженкінса на інший. Дивіться github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs

Кілька порад на stackoverflow.com/questions/38585734/… також
Бен Крісі

Відповіді:


154

У Дженкінса є досить хороший вікі, хоч і важко читати, коли ви новачок у програмі CI ...

Вони пропонують просте рішення для переміщення завдань між серверами

Трюком, ймовірно, була необхідність перезавантажити конфігурацію зі сторінки конфігурації Дженкінса.

Оновлення 2020.03.10

Ландшафт JenkinsCI сильно змінився ... Я вже деякий час використовую Job DSL . У нас є робота SEED, яка створює решту робочих місць.

Це допомагає нам як відтворити, так і перейти на сервер Дженкінса, коли це потрібно :) Ви також можете версії цих файлів для ще більшої ремонтопридатності!


22
Тож вам потрібен доступ до системи, де встановлені дженкіни? Тож це не відповідь для звичайних користувачів.
Wouter Schut

Підтверджено, що вам потрібно перезавантажити Дженкінса після застосування того, що йдеться в документі.
Мігель Ортіс

180

Можливо, використання командного рядка jenkins - це ще один варіант, див. Https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: створює нове завдання, читаючи stdin як конфігураційний XML-файл.
  • get-job: скидає визначення XML визначення завдання на stdout

Так ви можете зробити

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

Це добре працює для мене, і я звик зберігати всередині моєї системи управління версіями


3
Щоб це працювало, Java на вашому старому сервері, новому сервері та локальній машині має бути тієї ж версії. Інакше виникають дивні проблеми з потоком / версіями. Ваші порти jnlp також повинні бути відкритими.
MaratC

Повний шлях до клієнта CLI - JENKINS_HOME / war / WEB-INF / jenkins-cli.jar, де JENKINS_HOME знаходиться JENKINS_HOME
Rob

1
Цей метод має проблеми з голими голими амперсандами в XML, наприклад, коли у вас є код Groovy.
Роб Кільті

некодовані амперсанди в експортованому XML можуть виникати в коді Groovy, який підтримує параметри плагіну Active Choice (без вибору); запропонував рішення, якщо зможу.
Роб Кільті

1
@information_interchange точно так, як запропоновано у моїй відповіді нижче.
MaratC

151

Одноколісний:

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

З аутентифікацією:

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

З Crumb, якщо CSRF активний ( детальну інформацію див. Тут ):

Отримайте крихту:

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

Застосовуємо крихту за допомогою -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
Для роботи потрібні жетони аутентифікації, але це велика робота!
Віроїда

7
curl -s http: // <USER>: <API_TOEKN> @ OLD_JENKINS / робота / JOBNAME / config.xml | curl -X POST 'http: // <USER>: <API_TOEKN> @ NEW_JENKINS / createItem? name = JOBNAME' --header "Тип вмісту: додаток / xml" -d @ - <br/> Отримати ключ API користувача від : JENKIS_URL / user / <USER> / configure > API Token> Показати API Token
Suhas Gaikwad

1
Лише один додатковий внесок у цьому. Під час POSTing на цільовому сервері ви, ймовірно, отримаєте код помилки HTTP 403 Проблема з доступом / createItem. Причина: жодна дійсна крихта не була включена до запиту. Вам потрібно буде генерувати маркер захисту CSRF для цільового сервера Jenkins. Дотримуйтесь порад @Kenorb з цієї теми: stackoverflow.com/questions/38137760 / ...
Mig82

2
Навіть не потрібно використовувати команди curl, оскільки ви можете просто перейти за http://OLD_JENKINS/job/JOBNAME/config.xmlпосиланням у своєму браузері, щоб забрати config.xmlфайл.
entpnerd

1
Вам потрібно --data-binaryзамість -dв curlкоманді, тому що -dміць заплуталися в прогалини в ваших сценаріях.
Gabor Csardi

24

Є плагін під назвою Job Import Plugin, який може бути тим, що ви шукаєте. Я ним користувався. У нього є проблеми з імпортом проектів із сервера, який не дозволяє анонімний доступ.

Для повноти: Якщо у вас є доступ до обох командних рядків, ви можете виконати процедуру, яку вже згадував Khez для переміщення, копіювання та перейменування Джобкінса Джобса .


Я не вірю, що в даний час рухається нічого іншого, крім конфігурації.
jwernerny

14

Перейдіть на головну сторінку вашого сервера Jenkins, натисніть REST API внизу сторінки:

Створіть роботу

Щоб створити нове завдання, опублікуйте config.xmlцю URL-адресу з параметром запиту name=JOBNAME. Вам потрібно надіслати Content-Type: application/xmlзаголовок. Ви отримаєте 200код статусу, якщо створення було успішним, або 4xx/5xxкод, якщо він не вдався . config.xml- це формат, який Дженкінс використовує для зберігання проекту у файловій системі, тому ви можете бачити приклади їх у домашній директорії Дженкінса або витягуючи конфігурацію XML існуючих завдань з /job/JOBNAME/config.xml.


13

У моєму екземплярі Jenkins (версія 1.548) файл конфігурації знаходиться за адресою:

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

Володіє користувачем jenkins та групою jenkins з 644 дозволами. Копіювання файлу туди і звідси повинно працювати. Я не намагався змінити його безпосередньо, але створив резервну копію конфігурації з цього місця на випадок, якщо проект потрібно буде знову налаштувати.


1
у WindowsC:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Саша Бонд

8

Плагін Job Import - це простий спосіб імпортувати роботу з іншого екземпляра Jenkins. Просто потрібно вказати URL-адресу джерела Дженкінса. URL-адреса віддаленого Дженкінса може приймати будь-який із наведених нижче типів URL-адрес:

  • http://$JENKINS - отримати всі завдання на віддалений екземпляр

  • http://$JENKINS/job/$JOBNAME - влаштуйтеся на єдину роботу

  • http://$JENKINS/view/$VIEWNAME - отримати всі робочі місця в певному режимі


6

Завдяки відповіді Ларрі Кая мені вдалося створити сценарій для резервного копіювання всіх моїх робіт у Дженкінсі. Я створив роботу, яка працює на цьому щотижня. Якщо хтось вважає це корисним, ось це:

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

Дженкінс експортує завдання в каталог

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

Імпорт робочих місць

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

Для тих із нас у світі Windows, які можуть або не можуть мати Bash, ось мій порт PowerShell Кату та підхід Ларрі Кая . Сподіваюся, це комусь допоможе.

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

Завантажити ім'я плагіна дуже просто

Плагін для імпорту роботи

Введіть URL-адресу вашого віддаленого сервера Дженкінса, і він буде імпортувати завдання автоматично


1
Це може спрацювати для деяких, але не для мене. Це працює лише в тому випадку, якщо новий екземпляр Дженкінса має прямий доступ до старого екземпляра Дженкінса. Мої були в двох різних мережах.
Джастін Домніц

1

Простий скрипт для php працював на мене.

Експорт:

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

Імпорт:

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

Найпростіший спосіб при прямому доступі до машини - скопіювати папку завдань з перших джинкінів в іншу (можна виключити робочі місця - workspaceпапку), оскільки вся конфігурація завдання зберігається у файлі xml на диску.

Тоді в нових джинкінах просто reload configurationв глобальних налаштуваннях (потрібен доступ адміністратора) має бути достатньо, якщо ні, то вам потрібно буде перезапустити інструмент Дженкінса.

Іншим способом може бути використання плагінів, згаданих вище у цій публікації.

редагувати: - якщо ви, ймовірно, також можете виключити modulesпапки


0

Імпорт робочих записів вручну: альтернативним способом

Завантажте роботу на Git (контроль версій) В основному завантажте config.xml Робота.

Якщо сервери Linux:

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

Перезапустіть Дженкінса


0

Як веб-користувач, ви можете експортувати, перейшовши в «Історію конфігурації завдань», а потім експортуючи XML.

Я в ситуації, коли я не маю доступу до машини, на якій працює Дженкінс, і хотів експортувати її як резервну копію.

Щодо імпорту xml як веб-користувача, я все одно хотів би знати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.