เป็นไปได้ไหมที่จะแลกเปลี่ยนงานระหว่าง 2 เจนกินส์ที่ต่างกัน ฉันกำลังค้นหาวิธีการส่งออก / นำเข้างาน
เป็นไปได้ไหมที่จะแลกเปลี่ยนงานระหว่าง 2 เจนกินส์ที่ต่างกัน ฉันกำลังค้นหาวิธีการส่งออก / นำเข้างาน
คำตอบ:
Jenkins มีวิกิที่ค่อนข้างดีแม้ว่าจะอ่านยากเมื่อคุณใหม่กับซอฟต์แวร์ CI ...
พวกเขาเสนอทางออกที่ง่ายสำหรับการย้ายงานระหว่างเซิร์ฟเวอร์
เคล็ดลับอาจเป็นความต้องการที่จะโหลดการกำหนดค่าจากหน้าการกำหนดค่าเจนกินส์
อัพเดท 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
ไฟล์
--data-binary
แทน-d
ในcurl
คำสั่งเพราะ-d
อาจเลอะช่องว่างในสคริปต์ของคุณ
มีปลั๊กอินชื่อJob Import Pluginที่อาจเป็นสิ่งที่คุณกำลังมองหา ฉันได้ใช้มัน มันมีปัญหากับการนำเข้าโครงการจากเซิร์ฟเวอร์ที่ไม่อนุญาตการเข้าถึงแบบไม่ระบุชื่อ
เพื่อความสมบูรณ์: ถ้าคุณมีการเข้าถึงบรรทัดคำสั่งทั้งคุณสามารถทำตามขั้นตอนที่กล่าวมาแล้วโดย Khez สำหรับการย้ายคัดลอกและเปลี่ยนชื่อเจนกินส์งาน
ไปที่หน้าแรกของเซิร์ฟเวอร์เจนกินส์ของคุณคลิกที่ REST API ที่ด้านล่างของหน้า:
สร้างงาน
เพื่อสร้างงานใหม่โพสต์config.xml
ไปยัง URL name=JOBNAME
นี้กับพารามิเตอร์การค้นหา คุณต้องส่งContent-Type: application/xml
ส่วนหัว คุณจะได้รับ200
รหัสสถานะหากการสร้างสำเร็จหรือ4xx/5xx
รหัสหากล้มเหลว config.xml
คือรูปแบบเจนกินส์ใช้ในการเก็บโครงการในระบบแฟ้มเพื่อให้คุณสามารถดูตัวอย่างของพวกเขาในไดเรกทอรีบ้านเจนกินส์หรือโดยการเรียกคอนฟิกูเรชัน XML /job/JOBNAME/config.xml
ของงานที่มีอยู่จาก
ในอินสแตนซ์ Jenkins ของฉัน (รุ่น 1.548) ไฟล์กำหนดค่าอยู่ที่:
/var/lib/jenkins/jobs/-the-project-name-/config.xml
เจ้าของโดยผู้ใช้เจนกินส์และกลุ่มเจนกินส์มีสิทธิ์ 644 การคัดลอกไฟล์ไปยังและจากที่นี่ควรใช้งานได้ ฉันไม่ได้ลองเปลี่ยนมันโดยตรง แต่สำรองการกำหนดค่าจากจุดนี้ในกรณีที่โครงการจำเป็นต้องติดตั้งอีกครั้ง
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
ปลั๊กอินการนำเข้างานเป็นวิธีที่ง่ายที่สุดในการนำเข้างานจากอินสแตนซ์อื่นของเจนกินส์ เพียงแค่ต้องระบุ URL ของอินสแตนซ์ของเจนกินส์ Remote 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
เพียงบันทึกไฟล์ลงดิสก์ของคุณ
เจนกินส์ส่งออกงานไปยังไดเรกทอรี
#! /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
สำหรับพวกเราอยู่ในโลกของ Windows ที่อาจจะหรืออาจจะไม่ได้มีการทุบตีใช้ได้นี่คือพอร์ต PowerShell ของฉันKatuและแลร์รี่ Caiวิธี 's หวังว่าจะช่วยใครซักคน
##### 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"
มันง่ายมากเพียงแค่ดาวน์โหลดชื่อปลั๊กอิน
ป้อน URL ของเซิร์ฟเวอร์ Jenkins ระยะไกลของคุณและมันจะนำเข้างานโดยอัตโนมัติ
สคริปต์ 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);
}
สิ่งนี้ไม่ได้สำหรับงานที่มีอยู่อย่างไรก็ตามมีผู้สร้างงานเจนกินส์การสร้างงานเจนกินส์
นี้ช่วยให้หนึ่งเพื่อเก็บคำนิยามงานในไฟล์ yaml และใน repo คอมไพล์ซึ่งเป็นแบบพกพามาก
วิธีที่ง่ายที่สุดที่มีการเข้าถึงโดยตรงไปยังเครื่องคือการคัดลอกโฟลเดอร์งานจากเจนกินส์แรกไปยังอีกโฟลเดอร์หนึ่ง (คุณสามารถยกเว้นพื้นที่ทำงาน - workspace
โฟลเดอร์) เนื่องจากการกำหนดค่างานทั้งหมดจะถูกเก็บไว้ในไฟล์ xml บนดิสก์
จากนั้นในเจนกินส์ใหม่เพียง reload configuration
ในการตั้งค่าส่วนกลาง (จำเป็นต้องมีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบ) ควรจะเพียงพอถ้าไม่คุณจะต้องรีสตาร์ทเครื่องมือเจนกินส์
อีกวิธีหนึ่งคือการใช้ปลั๊กอินที่กล่าวถึงข้างต้นโพสต์นี้
แก้ไข: - ในกรณีที่คุณสามารถยกเว้นmodules
โฟลเดอร์ได้เช่นกัน
การนำเข้างานด้วยตนเอง: วิธีอื่น
อัปโหลดงานไปยัง Git (การควบคุมเวอร์ชัน) โดยทั่วไปอัปโหลด config.xml ของงาน
ถ้าเซิร์ฟเวอร์ Linux:
cd /var/lib/jenkins/jobs/<Job name>
Download the config.xml from Git
รีสตาร์ทเจนกินส์
ในฐานะผู้ใช้เว็บคุณสามารถส่งออกโดยไปที่ประวัติการกำหนดค่าของงานจากนั้นส่งออก XML
ฉันอยู่ในสถานการณ์ที่ไม่สามารถเข้าถึงเครื่องเจนกินส์กำลังทำงานอยู่และต้องการที่จะส่งออกเป็นข้อมูลสำรอง
สำหรับการนำเข้า xml ในฐานะผู้ใช้เว็บฉันยังอยากรู้