Jenkins의 내보내기 / 가져 오기 작업


268

두 개의 다른 Jenkins간에 작업을 교환 할 수 있습니까? 작업 내보내기 / 가져 오기 방법을 찾고 있습니다.


2
질문에 대한 직접적인 대답이 아니라 모범 사례 : Jenkins Pipeline DSL을 사용하여 작업 구성을 작성하여 프로젝트 리포지토리의 일부로 만드십시오. 이와 같이 작업은 한 Jenkins 서버에서 다른 Jenkins 서버로 쉽게 이식 할 수 있습니다.
Michael Lihs를

에서 이상 몇 가지 조언 stackoverflow.com/questions/38585734/... 뿐만 아니라
벤 크리시

답변:


154

Jenkins는 CI 소프트웨어를 처음 접했을 때 읽기가 쉽지 않지만 다소 좋은 위키를 가지고 있습니다 ...

서버 간 작업 이동 을위한 간단한 솔루션을 제공 합니다.

트릭은 아마도 Jenkins 구성 페이지에서 구성을 다시로드해야 할 것입니다.

2020.03.10 업데이트

JenkinsCI 환경이 많이 바뀌 었습니다 ... 잠시 동안 Job DSL 을 사용 하고 있습니다. 나머지 작업을 생성하는 SEED 작업이 있습니다.

이것은 필요할 때마다 Jenkins 서버를 재생성하거나 이동할 수 있도록 도와줍니다.


22
jenkins가 설치된 시스템에 액세스해야합니까? 따라서 이것은 일반 사용자에게는 답이 아닙니다.
Wouter Schut

문서의 내용을 적용한 후 Jenkins를 다시로드해야합니다.
미구엘 오티즈

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 / 전쟁 / WEB-INF JENKINS_HOME이 JENKINS_HOME의 위치는 / 젠킨스 - cli.jar
롭 Kielty은

1
이 방법에는 Groovy 코드에 &가있을 때와 같이 XML에서 벌거 벗은 앰퍼샌드에 문제가 있습니다.
Rob Kielty

내 보낸 XML의 인코딩되지 않은 앰퍼샌드는 Active Choice Plugin (uno-choice) 매개 변수를 지원하는 Groovy 코드에서 발생할 수 있습니다. 내가 할 수 있다면 해결책을 제시 할 것이다.
Rob Kielty

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
작동하려면 인증 토큰이 필요하지만 강철 작업은 훌륭합니다!
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'-헤더 "Content-Type : application / xml"-d @-<br/> 사용자 API 키 가져 오기 : JENKIS_URL / 사용자 / <사용자> / 구성 > API 토큰> 쇼 API 토큰
Suhas Gaikwad

1
이것에 하나의 추가 기여. 대상 서버에 POST를 수행하면 오류 코드 HTTP 403 / createItem에 액세스하는 중 오류가 발생합니다. 이유 : 요청에 유효한 부스러기가 포함되지 않았습니다. 대상 Jenkins 서버에 대한 CSRF 보호 토큰을 생성해야합니다. 이 스레드에서 @Kenorb의 조언을 따르십시오 : stackoverflow.com/questions/38137760/…
Mig82

2
http://OLD_JENKINS/job/JOBNAME/config.xml브라우저 에서 링크 로 이동 하여 config.xml파일 을 가져 오기 때문에 curl 명령을 사용할 필요조차 없습니다 .
entpnerd

1
당신이 필요로 --data-binary하는 대신 -dcurl있기 때문에, 명령 -d힘 엉망 스크립트에서 공백까지.
Gabor Csardi 12

24

라는 플러그인있어 작업 가져 오기 플러그인 당신이 찾고있는 무엇을 할 수있다. 나는 그것을 사용했다. 익명 액세스를 허용하지 않는 서버에서 프로젝트를 가져 오는 데 문제가 있습니다.

완전성 : 둘 다에 명령 행 액세스 권한이있는 경우, Jenkins 작업 이동, 복사 및 이름 바꾸기를 위해 Khez에서 이미 언급 한 절차를 수행 할 수 있습니다 .


나는 그것이 구성 이외의 것을 움직이고 있다고 생각하지 않습니다.
jwernerny

14

Jenkins 서버의 첫 페이지로 이동하여 페이지 하단에서 REST API를 클릭하십시오.

직업 만들기

새 작업을 작성하려면 config.xmlquery parameter를 사용하여이 URL에 게시하십시오 name=JOBNAME. Content-Type: application/xml헤더 를 보내야합니다 . 당신은 얻을 것이다 200작성이 성공하면 상태 코드를하거나 4xx/5xx실패하면 코드입니다. config.xmlJenkins가 파일 시스템에 프로젝트를 저장하는 데 사용하는 형식이므로 Jenkins 홈 디렉토리에서 또는 기존 작업의 XML 구성을 검색하여 해당 예제를 볼 수 있습니다 /job/JOBNAME/config.xml.


13

내 Jenkins 인스턴스 (버전 1.548)에서 구성 파일은 다음과 같습니다.

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

644 권한을 가진 jenkins 사용자 및 jenkins 그룹이 소유합니다. 여기에서 파일을 복사하거나 여기에서 복사하면 작동합니다. 직접 변경하지는 않았지만 프로젝트를 다시 설정 해야하는 경우이 자리에서 구성을 백업했습니다.


1
창에서C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
사샤 본드

8

Job Import 플러그인 은 다른 Jenkins 인스턴스에서 작업을 가져 오는 쉬운 방법입니다. 소스 Jenkins 인스턴스의 URL 만 제공하면됩니다. 원격 Jenkins URL은 다음 유형의 URL 중 하나를 사용할 수 있습니다.

  • http://$JENKINS -원격 인스턴스에서 모든 작업 가져 오기

  • http://$JENKINS/job/$JOBNAME -하나의 직업을 얻다

  • http://$JENKINS/view/$VIEWNAME -특정 관점에서 모든 직업을 얻는다


6

Larry Cai의 답변 덕분에 모든 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

5

웹 브라우저에서 다음을 방문하십시오.

http://[jenkinshost]/job/[jobname]/config.xml

파일을 디스크에 저장하십시오.


불완전한 답변 :(
Pradeep Singh

4

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

2

Bash를 사용하거나 사용하지 않을 수있는 Windows 세계 사용자에게는 Katu의 PowerShell 포트 및 Larry Cai 의 접근 방식이 있습니다. 그것이 누군가를 돕기를 바랍니다.

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

플러그인 이름을 다운로드하는 것은 매우 쉽습니다.

작업 가져 오기 플러그인

원격 Jenkins 서버의 URL을 입력하면 작업을 자동으로 가져옵니다.


1
이것은 일부에게는 효과가 있지만 나에게는 효과가 없습니다. 새 Jenkins 인스턴스가 이전 Jenkins 인스턴스에 직접 액세스 할 수있는 경우에만 작동합니다. 광산은 서로 다른 두 네트워크에있었습니다.
저스틴 돔 니츠

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 파일에 저장되므로 작업 폴더를 첫 번째 jenkins에서 다른 폴더로 복사하는 것입니다 (작업 영역- 폴더 제외 ).

그런 다음 reload configuration전역 설정 의 새 젠킨스 (관리자 액세스 필요)로 충분하면 그렇지 않은 경우 젠킨스 도구를 다시 시작해야합니다.

다른 방법은이 게시물 위에 언급 된 플러그인을 사용하는 것입니다.

편집 :-아마도 modules폴더를 제외시킬 수있는 경우


0

수동으로 작업 가져 오기 : 다른 방법

Git에 작업 업로드 (버전 제어) 기본적으로 작업의 config.xml을 업로드하십시오.

Linux 서버 인 경우 :

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

Jenkins를 다시 시작하십시오.


0

웹 사용자는 작업 구성 히스토리로 이동 한 다음 XML을 내 보내서 내보낼 수 있습니다.

Jenkins가 실행중인 시스템에 액세스 할 수없는 상황에 있으며 백업으로 내보내려고했습니다.

웹 사용자로 xml을 가져 오는 것에 대해서는 여전히 알고 싶습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.