งานส่งออก / นำเข้าใน Jenkins


268

เป็นไปได้ไหมที่จะแลกเปลี่ยนงานระหว่าง 2 เจนกินส์ที่ต่างกัน ฉันกำลังค้นหาวิธีการส่งออก / นำเข้างาน


2
ไม่ใช่คำตอบสำหรับคำถามของคุณโดยตรง แต่เป็นแนวปฏิบัติที่ดีที่สุดลองเขียนการกำหนดค่างานของคุณกับ Jenkins Pipeline DSL และทำให้เป็นส่วนหนึ่งของที่เก็บโครงการของคุณ เช่นนั้นงานพกพาง่ายจากเซิร์ฟเวอร์เจนกินส์หนึ่งไปอีกเซิร์ฟเวอร์หนึ่ง ดูgithub.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs

คำแนะนำบางอย่างที่stackoverflow.com/questions/38585734/ …เช่นกัน
Ben Creasy

คำตอบ:


154

Jenkins มีวิกิที่ค่อนข้างดีแม้ว่าจะอ่านยากเมื่อคุณใหม่กับซอฟต์แวร์ CI ...

พวกเขาเสนอทางออกที่ง่ายสำหรับการย้ายงานระหว่างเซิร์ฟเวอร์

เคล็ดลับอาจเป็นความต้องการที่จะโหลดการกำหนดค่าจากหน้าการกำหนดค่าเจนกินส์

อัพเดท 2020.03.10

ภูมิทัศน์ JenkinsCI เปลี่ยนไปมาก ... ฉันใช้Job DSLมาระยะหนึ่งแล้ว เรามีงาน SEED ที่สร้างงานที่เหลือ

สิ่งนี้ช่วยให้เราสร้างหรือย้ายเซิร์ฟเวอร์ Jenkins เมื่อใดก็ตามที่คุณต้องการ :) คุณสามารถสร้างไฟล์เหล่านั้นเพื่อการบำรุงรักษาที่ดียิ่งขึ้น!


22
ดังนั้นคุณต้องเข้าถึงระบบที่ติดตั้งเจนกินส์อยู่หรือไม่ ดังนั้นนี่ไม่ใช่คำตอบสำหรับผู้ใช้ทั่วไป
Wouter Schut

ยืนยันแล้วคุณต้องโหลดเจนกินส์อีกครั้งหลังจากใช้สิ่งที่เอกสารพูด
Miguel Ortiz

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
เพื่อให้สามารถใช้งานได้จาวาบนเซิร์ฟเวอร์เก่าของคุณเซิร์ฟเวอร์ใหม่และเครื่องท้องถิ่นต้องเป็นรุ่นเดียวกัน มิฉะนั้นจะเกิดปัญหากระแส / รุ่นแปลก ๆ พอร์ต jnlp ของคุณต้องเปิดด้วยเช่นกัน
MaratC

เส้นทางแบบเต็มไปยังไคลเอนต์ CLI คือ JENKINS_HOME / war / WEB-INF / jenkins-cli.jar โดยที่ JENKINS_HOME เป็นที่ตั้งของ JENKINS_HOME
Rob Kielty

1
วิธีนี้มีปัญหากับเครื่องหมายแอมเปอร์แซนด์เปล่าใน XML เช่นเมื่อคุณมี & ในโค้ด Groovy
Rob Kielty

เครื่องหมายแอมเปอร์แซนด์ที่ไม่เข้ารหัสใน XML ที่ส่งออกสามารถเกิดขึ้นได้ในโค้ด 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' - หัวข้อ "เนื้อหาส่วนหัว: แอปพลิเคชัน / xml" -d @ - <br/> : JENKIS_URL / ผู้ใช้ / <USER> / กำหนดค่า > โทเค็น API> แสดงโทเค็น API
Suhas Gaikwad

1
อีกหนึ่งการสนับสนุนสำหรับสิ่งนี้ เมื่อโพสต์ไปยังเซิร์ฟเวอร์เป้าหมายคุณน่าจะได้รับรหัสข้อผิดพลาด HTTP 403 ปัญหาในการเข้าถึง / createItem เหตุผล: ไม่มีเศษรวมอยู่ในคำขอ คุณจะต้องสร้างโทเค็นการป้องกัน CSRF สำหรับเซิร์ฟเวอร์ Jenkins เป้าหมาย ทำตามคำแนะนำของ @Kenorb จากกระทู้นี้: stackoverflow.com/questions/38137760/…
Mig82

2
ไม่จำเป็นต้องใช้คำสั่ง curl ในขณะที่คุณสามารถไปที่http://OLD_JENKINS/job/JOBNAME/config.xmlลิงค์ในเบราว์เซอร์ของคุณเพื่อคว้าconfig.xmlไฟล์
เริ่ม

1
คุณต้อง--data-binaryแทน-dในcurlคำสั่งเพราะ-dอาจเลอะช่องว่างในสคริปต์ของคุณ
Gabor Csardi

24

มีปลั๊กอินชื่อJob Import Pluginที่อาจเป็นสิ่งที่คุณกำลังมองหา ฉันได้ใช้มัน มันมีปัญหากับการนำเข้าโครงการจากเซิร์ฟเวอร์ที่ไม่อนุญาตการเข้าถึงแบบไม่ระบุชื่อ

เพื่อความสมบูรณ์: ถ้าคุณมีการเข้าถึงบรรทัดคำสั่งทั้งคุณสามารถทำตามขั้นตอนที่กล่าวมาแล้วโดย Khez สำหรับการย้ายคัดลอกและเปลี่ยนชื่อเจนกินส์งาน


ฉันไม่เชื่อว่าในปัจจุบันมันเคลื่อนไหวอย่างอื่นนอกเหนือจากการกำหนดค่า
jwernerny

14

ไปที่หน้าแรกของเซิร์ฟเวอร์เจนกินส์ของคุณคลิกที่ 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

เจ้าของโดยผู้ใช้เจนกินส์และกลุ่มเจนกินส์มีสิทธิ์ 644 การคัดลอกไฟล์ไปยังและจากที่นี่ควรใช้งานได้ ฉันไม่ได้ลองเปลี่ยนมันโดยตรง แต่สำรองการกำหนดค่าจากจุดนี้ในกรณีที่โครงการจำเป็นต้องติดตั้งอีกครั้ง


1
ใน WindowsC:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Sasha Bond

8

ปลั๊กอินการนำเข้างานเป็นวิธีที่ง่ายที่สุดในการนำเข้างานจากอินสแตนซ์อื่นของเจนกินส์ เพียงแค่ต้องระบุ URL ของอินสแตนซ์ของเจนกินส์ Remote 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

เจนกินส์ส่งออกงานไปยังไดเรกทอรี

 #! /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 ที่อาจจะหรืออาจจะไม่ได้มีการทุบตีใช้ได้นี่คือพอร์ต 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"

2

มันง่ายมากเพียงแค่ดาวน์โหลดชื่อปลั๊กอิน

ปลั๊กอินนำเข้างาน

ป้อน URL ของเซิร์ฟเวอร์ Jenkins ระยะไกลของคุณและมันจะนำเข้างานโดยอัตโนมัติ


1
อาจใช้ได้สำหรับบางคน แต่ไม่ใช่สำหรับฉัน วิธีนี้ใช้ได้เฉพาะในกรณีที่เจนกินส์ใหม่มีสิทธิ์เข้าถึงอินสแตนซ์ของเจนกินส์เก่าโดยตรง ฉันอยู่บนเครือข่ายที่ต่างกันสองแห่ง
Justin Domnitz

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

สิ่งนี้ไม่ได้สำหรับงานที่มีอยู่อย่างไรก็ตามมีผู้สร้างงานเจนกินส์การสร้างงานเจนกินส์

นี้ช่วยให้หนึ่งเพื่อเก็บคำนิยามงานในไฟล์ yaml และใน repo คอมไพล์ซึ่งเป็นแบบพกพามาก


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 ในฐานะผู้ใช้เว็บฉันยังอยากรู้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.