두 개의 다른 Jenkins간에 작업을 교환 할 수 있습니까? 작업 내보내기 / 가져 오기 방법을 찾고 있습니다.
두 개의 다른 Jenkins간에 작업을 교환 할 수 있습니까? 작업 내보내기 / 가져 오기 방법을 찾고 있습니다.
답변:
Jenkins는 CI 소프트웨어를 처음 접했을 때 읽기가 쉽지 않지만 다소 좋은 위키를 가지고 있습니다 ...
서버 간 작업 이동 을위한 간단한 솔루션을 제공 합니다.
트릭은 아마도 Jenkins 구성 페이지에서 구성을 다시로드해야 할 것입니다.
2020.03.10 업데이트
JenkinsCI 환경이 많이 바뀌 었습니다 ... 잠시 동안 Job DSL 을 사용 하고 있습니다. 나머지 작업을 생성하는 SEED 작업이 있습니다.
이것은 필요할 때마다 Jenkins 서버를 재생성하거나 이동할 수 있도록 도와줍니다.
아마도 jenkins 명령 줄을 사용하는 것이 또 다른 옵션입니다 ( https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI 참조)
그래서 당신은 할 수 있습니다
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
그것은 나에게 잘 작동하며 버전 관리 시스템 내부에 저장하는 데 익숙합니다.
원 라이너 :
$ 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 @-
http://OLD_JENKINS/job/JOBNAME/config.xml
브라우저 에서 링크 로 이동 하여 config.xml
파일 을 가져 오기 때문에 curl 명령을 사용할 필요조차 없습니다 .
--data-binary
하는 대신 -d
에 curl
있기 때문에, 명령 -d
힘 엉망 스크립트에서 공백까지.
라는 플러그인있어 작업 가져 오기 플러그인 당신이 찾고있는 무엇을 할 수있다. 나는 그것을 사용했다. 익명 액세스를 허용하지 않는 서버에서 프로젝트를 가져 오는 데 문제가 있습니다.
완전성 : 둘 다에 명령 행 액세스 권한이있는 경우, Jenkins 작업 이동, 복사 및 이름 바꾸기를 위해 Khez에서 이미 언급 한 절차를 수행 할 수 있습니다 .
Jenkins 서버의 첫 페이지로 이동하여 페이지 하단에서 REST API를 클릭하십시오.
직업 만들기
새 작업을 작성하려면 config.xml
query parameter를 사용하여이 URL에 게시하십시오 name=JOBNAME
. Content-Type: application/xml
헤더 를 보내야합니다 . 당신은 얻을 것이다 200
작성이 성공하면 상태 코드를하거나 4xx/5xx
실패하면 코드입니다. config.xml
Jenkins가 파일 시스템에 프로젝트를 저장하는 데 사용하는 형식이므로 Jenkins 홈 디렉토리에서 또는 기존 작업의 XML 구성을 검색하여 해당 예제를 볼 수 있습니다 /job/JOBNAME/config.xml
.
내 Jenkins 인스턴스 (버전 1.548)에서 구성 파일은 다음과 같습니다.
/var/lib/jenkins/jobs/-the-project-name-/config.xml
644 권한을 가진 jenkins 사용자 및 jenkins 그룹이 소유합니다. 여기에서 파일을 복사하거나 여기에서 복사하면 작동합니다. 직접 변경하지는 않았지만 프로젝트를 다시 설정 해야하는 경우이 자리에서 구성을 백업했습니다.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Job Import 플러그인 은 다른 Jenkins 인스턴스에서 작업을 가져 오는 쉬운 방법입니다. 소스 Jenkins 인스턴스의 URL 만 제공하면됩니다. 원격 Jenkins URL은 다음 유형의 URL 중 하나를 사용할 수 있습니다.
http://$JENKINS
-원격 인스턴스에서 모든 작업 가져 오기
http://$JENKINS/job/$JOBNAME
-하나의 직업을 얻다
http://$JENKINS/view/$VIEWNAME
-특정 관점에서 모든 직업을 얻는다
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
웹 브라우저에서 다음을 방문하십시오.
http://[jenkinshost]/job/[jobname]/config.xml
파일을 디스크에 저장하십시오.
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
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"
간단한 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);
}
기존 작업에는 작동하지 않지만 Jenkins 작업 빌더가 있습니다.
이를 통해 yaml 파일과 git repo에 작업 정의를 유지할 수 있습니다.
머신에 직접 액세스하는 가장 쉬운 방법 workspace
은 전체 작업 구성이 디스크의 xml 파일에 저장되므로 작업 폴더를 첫 번째 jenkins에서 다른 폴더로 복사하는 것입니다 (작업 영역- 폴더 제외 ).
그런 다음 reload configuration
전역 설정 의 새 젠킨스 (관리자 액세스 필요)로 충분하면 그렇지 않은 경우 젠킨스 도구를 다시 시작해야합니다.
다른 방법은이 게시물 위에 언급 된 플러그인을 사용하는 것입니다.
편집 :-아마도 modules
폴더를 제외시킬 수있는 경우
수동으로 작업 가져 오기 : 다른 방법
Git에 작업 업로드 (버전 제어) 기본적으로 작업의 config.xml을 업로드하십시오.
Linux 서버 인 경우 :
cd /var/lib/jenkins/jobs/<Job name>
Download the config.xml from Git
Jenkins를 다시 시작하십시오.
웹 사용자는 작업 구성 히스토리로 이동 한 다음 XML을 내 보내서 내보낼 수 있습니다.
Jenkins가 실행중인 시스템에 액세스 할 수없는 상황에 있으며 백업으로 내보내려고했습니다.
웹 사용자로 xml을 가져 오는 것에 대해서는 여전히 알고 싶습니다.