Работы по экспорту/импорту в Дженкинсе

Можно ли обменяться работами между двумя разными Дженкинсами? Я ищу способ экспорта/импорта заданий.

Ответ 1

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

Они предлагают простое решение для перемещения заданий между серверами

Трюк, вероятно, заключался в необходимости перезагрузки конфигурации с Страница конфигурации Jenkins.

Ответ 2

Возможно, использовать командную строку jenkins - это еще один вариант, см. https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: создает новое задание, считывая stdin в качестве файла конфигурации конфигурации.
  • 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

Однострочный:

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


С крошкой, если 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 @-

Ответ 4

Там есть плагин под названием Плагин импорта заданий, который может быть тем, что вы ищете. Я использовал его. У этого есть проблемы с импортом проектов с сервера, который не позволяет анонимный доступ.

Для полноты: Если у вас есть доступ к командной строке для обоих, вы можете выполнить процедуру, уже упомянутую Khez для Перемещение, копирование и переименование Jenkins Jobs.

Ответ 5

Перейдите на главную страницу сервера Jenkins, нажмите на ссылку REST API внизу страницы:

Создать задание

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

Ответ 6

В моем примере Jenkins (версия 1.548) файл конфигурации находится по адресу:

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

Владелец jenkins user и jenkins group с 644 правами доступа. Копирование файла туда и обратно должно работать. Я не пробовал изменять его напрямую, но сохранил конфигурацию с этого места в случае, если проект нуждается в настройке снова.

Ответ 7

Плагин импорта заданий - это простой способ импортировать задания из другого экземпляра Jenkins. Просто нужно указать URL-адрес источника Jenkins. Удаленный URL Jenkins может использовать любой из следующих типов URL-адресов:

  • http://$JENKINS - получить все задания в удаленном экземпляре

  • http://$JENKINS/job/$JOBNAME - получить одно задание

  • http://$JENKINS/view/$VIEWNAME - получить все задания в определенном представлении

Ответ 8

Благодаря Larry Cai ответ мне удалось создать script для резервного копирования всех моих заданий Jenkins. Я создал работу, которая запускается каждую неделю. Если кто-то считает это полезным, вот он:

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

Ответ 9

Jenkins экспортирует задания в каталог

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

Ответ 10

Простой php script работал у меня.

Экспорт  

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

Ответ 11

Это не работает для существующих заданий, однако есть Jenkins job builder.

Это позволяет сохранять определения заданий в файлах yaml и в репозитории git, который очень портативен.

Ответ 12

Для тех из нас, кто находится в мире Windows, у которого может быть или не может быть Bash, здесь находится мой порт PowerShell Katu и Ларри Кай. Надеюсь, это поможет кому-то.

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

Ответ 13

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

Тогда в новых jenkins достаточно просто reload configuration в глобальных настройках (требуется доступ администратора), если нет, то вам нужно будет перезапустить инструмент Jenkins.

Другим способом может быть использование плагинов, упомянутых выше в этом посте.

изменение: - в случае, если вы также можете исключить папки modules

Ответ 14

Очень просто скачать имя плагина

Плагин импорта заданий

Введите URL-адрес удаленного сервера Jenkins и автоматически импортируйте задания

Ответ 15

Импортирование заданий вручную: альтернативный способ

Загрузка заданий в Git (управление версиями) В основном выгрузите файл config.xml задания.

Если серверы Linux:

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

Перезагрузите Дженкинс

Ответ 16

По умолчанию это значение равно ~/.jenkins, но вы можете изменить это одним из следующих способов:

* Set "JENKINS_HOME" environment variable to the new home directory before launching 
the servlet container.
* Set "JENKINS_HOME" system property to the servlet container.
* Set JNDI environment entry "JENKINS_HOME" to the new directory.

Посмотрите коллекцию документации для конкретного контейнера, чтобы узнать, как это сделать для вашего контейнера.

Вы также можете изменить это местоположение после того, как некоторое время пользовались Jenkins. Для этого полностью остановите Jenkins, переместите содержимое из старого JENKINS_HOME в новый дом, установите новый JENKINS_HOME и перезапустите Jenkins.

JENKINS_HOME имеет довольно очевидную структуру каталогов, которая выглядит следующим образом:

JENKINS_HOME
 +- config.xml     (jenkins root configuration)
 +- *.xml          (other site-wide configuration files)  
 +- userContent    (files in this directory will be served under your 
 http://server/userContent/)  
 +- fingerprints   (stores fingerprint records)
 +- plugins        (stores plugins)
 +- workspace (working directory for the version control system)
     +- [JOBNAME] (sub directory for each job)
 +- jobs
 +- [JOBNAME]      (sub directory for each job)
     +- config.xml     (job configuration file)
     +- latest         (symbolic link to the last successful build)
     +- builds
         +- [BUILD_ID]     (for each build)
             +- build.xml      (build result summary)
             +- log            (log file)
             +- changelog.xml  (change log)

Резервное копирование и восстановление:

Все настройки, журналы сборки, архивы артефактов хранятся в каталоге JENKINS_HOME. Просто заархивируйте этот каталог, чтобы сделать резервную копию. Точно так же восстановление данных - это просто замена содержимого каталога JENKINS_HOME из резервной копии.

Резервные копии могут быть сделаны без остановки сервера, но при восстановлении остановите сервер.

Перемещение/копирование/переименование заданий

Вы можете:

  1. Переместите задание из одной установки Jenkins в другую, просто скопировав соответствующий каталог заданий.
  2. Сделайте копию существующего задания, сделав клон каталога заданий под другим именем.
  3. Переименуйте существующее задание, переименовав каталог. Обратите внимание, что если вы меняете имя задания, вам нужно будет поменять любое другое задание, которое пытается вызвать переименованное задание.

Эти операции можно выполнять даже во время работы Jenkins. Чтобы изменения, подобные этим, вступили в силу, вы должны нажать "reload config", чтобы заставить Jenkins перезагрузить конфигурацию с диска.

Пакетное переименование заданий

Замена пробелов в именах должностей с подчеркиванием

$ rename 's/\s/_/g' *

Архив неиспользованных работ

Иногда вы хотите удалить задание из Jenkins, но сделайте так, чтобы вы могли воскресить его позже, если возникнет такая необходимость. Вы можете сделать это, перейдя в $ JENKINS_HOME и создать архив каталога заданий. Следующая команда иллюстрирует, как заархивировать задание 'xyz' и удалить его.

$ cd $JENKINS_HOME/jobs
$ tar czf xyz.tgz xyz
// go to Jenkins GUI "Manage Jenkins" page and "Reload Configuration from Disk"

Пока вы не создаете проект xyz при создании архива, вы можете выполнять эту операцию, не переводя Jenkins в автономный режим.

Смотрите также плагин "Проект полки".

Консоль скриптов

Полезно для устранения неполадок, диагностики или пакетного обновления заданий. Jenkins предоставляет консоль сценариев, которая дает вам доступ ко всем внутренним компонентам Jenkins. Эти сценарии написаны на Groovy, и вы найдете их примеры на этой странице.

Параметры URL

http://[jenkins-server]/[command]

где [команда] может быть

  1. выход из строя Дженкинс
  2. перезапустить перезапустить Дженкинс
  3. перезагрузить, чтобы перезагрузить конфигурацию

Ответ 17

Как веб-пользователь, вы можете выполнить экспорт, перейдя в "Журнал заданий" и затем экспортировав XML.

Я нахожусь в ситуации отсутствия доступа к машине, на которой работает Дженкинс, и хотел экспортировать ее в качестве резервной копии.

Что касается импорта XML как веб-пользователя, я все еще хотел бы знать.