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


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.