जेनकिंस में निर्यात / आयात कार्य


268

क्या 2 अलग जेनकींस के बीच नौकरियों का आदान-प्रदान संभव है? मैं नौकरियों को निर्यात / आयात करने का तरीका खोज रहा हूं।


2
सीधे आपके प्रश्न का उत्तर नहीं, लेकिन कुछ सर्वोत्तम अभ्यास: जेनकिंस पाइपलाइन डीएसएल के साथ अपनी नौकरी के विन्यास को लिखने की कोशिश करें और इसे अपनी परियोजनाओं के भंडार का हिस्सा बनाएं। उस तरह, जॉब्स आसानी से एक जेनकिंस सर्वर से दूसरे में पोर्टेबल होते हैं। देखें github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
माइकल लीह्स

पर अधिक कुछ सलाह stackoverflow.com/questions/38585734/... रूप में अच्छी तरह
बेन Creasy

जवाबों:


154

जेनकिन्स के पास एक अच्छा विकी है, यद्यपि जब आप सीआई सॉफ्टवेयर में नए होते हैं तो पढ़ना मुश्किल होता है ...

वे सर्वर के बीच नौकरियों के लिए एक सरल समाधान प्रदान करते हैं

ट्रिक शायद जेनकिंस कॉन्फ़िगरेशन पेज से कॉन्फ़िगरेशन को फिर से लोड करने की आवश्यकता थी।

अद्यतन 2020.03.10

JenkinsCI परिदृश्य बहुत बदल गया है ... मैं थोड़ी देर के लिए जॉब डीएसएल का उपयोग कर रहा हूं । हमारे पास एक SEED जॉब है जो बाकी नौकरियों को उत्पन्न करता है।

यह जरूरत पड़ने पर जेनकींस सर्वर के लिए दोनों को फिर से बनाने या स्थानांतरित करने में मदद करता है :) आप और भी अधिक स्थिरता के लिए उन फाइलों को भी संस्करणित कर सकते हैं!


22
तो आपको सिस्टम तक पहुंच की आवश्यकता है जहां जेनकींस स्थापित है? तो यह सामान्य उपयोगकर्ताओं के लिए एक जवाब नहीं है।
राउटर स्कूट

पुष्टि की गई है, आपको दस्तावेज़ के कहने के बाद जेनकिन्स को फिर से लोड करने की आवश्यकता है।
मिगुएल ऑर्टिज़

180

संभवतः जेनकिंस कमांड लाइन का उपयोग एक और विकल्प है, https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI देखें

  • create-job: एक विन्यास XML फ़ाइल के रूप में 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
इसके लिए काम करने के लिए, आपके पुराने सर्वर, नए सर्वर और स्थानीय मशीन पर जावा को एक ही संस्करण का होना चाहिए। अन्यथा, अजीब धारा / संस्करण समस्याएं उत्पन्न होती हैं। आपके jnlp पोर्ट को भी खुला होना चाहिए।
मराट

CLI क्लाइंट के लिए पूर्ण पथ JENKINS_HOME / वार / WEB-INF / jenkins-cli.jar है जहाँ JENKINS_HOME JENKINS_HOME का स्थान है
Rob

1
इस विधि में XML में नंगे नग्न एम्परसेंड के साथ समस्याएँ हैं जैसे कि जब आपके पास और ग्रूवी कोड में होता है।
रॉब किली

निर्यात किए गए XML में अन-इनकोडेड एम्परसेंड्स ग्रूवी कोड में हो सकते हैं जो एक्टिव चॉइस प्लगिन (अन-चॉइस) मापदंडों को वापस करते हैं; अगर मैं कर सकता हूं तो समाधान पेश करेंगे।
रोब Kielty

1
नीचे दिए गए मेरे उत्तर में @information_interchange बिल्कुल प्रस्तावित है।
13

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
काम करने के लिए प्रमाणीकरण टोकन की आवश्यकता है, लेकिन स्टील महान काम!
विरोडाइड

7
curl -s http: // <USER>: <API_TOEKN> @ OLD_JENKINS / job / JOBNAME / config.xml | कर्ल -X POST 'http: // <USER>: <API_TOEKN> @ NEW_JENKINS / createItem? name = JOBNAME' --header "सामग्री-प्रकार: आवेदन / xml" -d- - <br/> उपयोगकर्ता API कुंजी प्राप्त करें : JENKIS_URL / उपयोगकर्ता / <USER> / कॉन्फ़िगर करें > एपीआई टोकन> एपीआई टोकन दिखाएं
सुहास गायकवाड़

1
इस पर सिर्फ एक अतिरिक्त योगदान। जब लक्ष्य सर्वर पर पोस्ट करने पर आपको एक त्रुटि कोड HTTP 403 समस्या पहुँचने / बनाने की संभावना है। कारण: अनुरोध में कोई वैध टुकड़ा शामिल नहीं था। आपको लक्ष्य जेनकिंस सर्वर के लिए एक सीएसआरएफ सुरक्षा टोकन उत्पन्न करना होगा। इस धागे से @Kenorb की सलाह का पालन करें: stackoverflow.com/questions/38137760/…
Mig82

2
कर्ल कमांड का उपयोग करने की भी आवश्यकता नहीं है क्योंकि आप फ़ाइल http://OLD_JENKINS/job/JOBNAME/config.xmlको हथियाने के लिए अपने ब्राउज़र में लिंक पर जा सकते हैं config.xml
२१:

1
आप की जरूरत --data-binaryके बजाय -dमें curlआदेश है, क्योंकि -dअपनी स्क्रिप्ट में खाली स्थान के ऊपर हो सकता है गड़बड़।
गाबोर सेसार्डी

24

वहाँ एक प्लगइन है जो नौकरी आयात प्लगइन कहा जाता है कि आप के लिए क्या देख रहे हो सकता है। मैंने इसका इस्तेमाल किया है। यह एक सर्वर से परियोजनाओं के आयात के साथ समस्या है जो अनाम पहुँच की अनुमति नहीं देता है।

संपूर्णता के लिए: यदि आपके पास दोनों के लिए कमांड लाइन का उपयोग है, तो आप हिलाने, कॉपी करने और जेनकींस जॉब्स के नामकरण के लिए पहले से ही उल्लिखित प्रक्रिया कर सकते हैं ।


मुझे विश्वास नहीं है कि यह वर्तमान में कॉन्फ़िगरेशन के अलावा कुछ भी स्थानांतरित करता है।
jernernerny

14

अपने जेनकींस सर्वर के फ्रंट पेज पर जाएं, पेज के नीचे REST API पर क्लिक करें:

नौकरी बनाएँ

एक नया काम बनाने के लिए, config.xmlइस URL को क्वेरी पैरामीटर के साथ पोस्ट करें name=JOBNAME। आपको Content-Type: application/xmlहेडर भेजने की आवश्यकता है । 200सृजन सफल होने पर, या 4xx/5xxविफल होने पर कोड आपको स्थिति कोड मिलेगा । config.xmlफ़ाइल सिस्टम में प्रोजेक्ट को संग्रहीत करने के लिए जेनकिन्स का उपयोग करने वाला प्रारूप है, इसलिए आप जेनकींस होम डायरेक्टरी में उनके उदाहरण देख सकते हैं, या मौजूदा नौकरियों के XML कॉन्फ़िगरेशन को पुनः प्राप्त कर सकते हैं /job/JOBNAME/config.xml


13

मेरे जेनकींस उदाहरण (संस्करण 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

जॉब इम्पोर्ट प्लगइन एक अन्य जेनकिंस उदाहरण से नौकरी आयात करने का आसान तरीका है। बस स्रोत जेनरिक उदाहरण का URL प्रदान करने की आवश्यकता है। रिमोट जेनकिंस URL किसी भी प्रकार के URL ले सकता है:

  • http://$JENKINS - सभी नौकरियों को दूरस्थ उदाहरण पर प्राप्त करें

  • http://$JENKINS/job/$JOBNAME - एक ही काम मिलता है

  • http://$JENKINS/view/$VIEWNAME - सभी नौकरियों को एक विशेष दृष्टिकोण में प्राप्त करें


6

लैरी कै के जवाब की बदौलत मैं अपने सभी जेनकिंस नौकरियों का बैकअप बनाने के लिए एक स्क्रिप्ट बनाने में कामयाब रहा। मैंने एक ऐसी नौकरी बनाई जो हर हफ्ते चलती है। यदि कोई इसे उपयोगी पाता है, तो यह है:

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


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

विंडोज दुनिया में हम में से उन लोगों के लिए जो बैश उपलब्ध हो सकते हैं या नहीं हो सकते हैं, यहां पर मेरा पावरशेल पोर्ट ऑफ काटू और लैरी कै का दृष्टिकोण है। आशा है कि यह किसी की मदद करता है।

##### 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 दर्ज करें और यह स्वचालित रूप से नौकरियों को आयात करेगा


1
यह कुछ के लिए काम कर सकता है, लेकिन मेरे लिए नहीं। यह तभी काम करता है जब नए जेनकींस इंस्टेंस की पुरानी जेनकिन्स इंस्टेंस तक सीधी पहुंच हो। मेरा दो अलग-अलग नेटवर्क पर था।
जस्टिन डोमनित्ज

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 फाइलों में और एक git रेपो में काम की परिभाषा रखने की अनुमति देता है जो बहुत पोर्टेबल है।


1

मशीन के सीधे उपयोग के साथ सबसे आसान तरीका है, नौकरी फ़ोल्डर को पहले जेनकिन्स से दूसरे एक में कॉपी करना (आप कार्यक्षेत्र - workspaceफ़ोल्डर को बाहर कर सकते हैं ), क्योंकि डिस्क पर xml फ़ाइल में पूरे नौकरी कॉन्फ़िगरेशन को संग्रहीत किया जाता है।

फिर नए जेनकींस में ही reload configuration वैश्विक सेटिंग्स में (एडमिन एक्सेस की आवश्यकता है) पर्याप्त होना चाहिए, यदि नहीं, तो आपको जेनकिंस टूल को पुनरारंभ करना होगा।

एक अन्य तरीका इस पोस्ट के ऊपर वर्णित प्लगइन्स का उपयोग कर सकता है।

संपादित करें: - मामले में आप शायद modulesफ़ोल्डरों को भी बाहर कर सकते हैं


0

इंपोर्टिंग जॉब्स मैन्युअल रूप से: वैकल्पिक तरीका

जॉब्स को Git (संस्करण नियंत्रण) पर अपलोड करें मूल रूप से जॉब के config.xml को अपलोड करें।

यदि लिनक्स सर्वर:

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

जेनकींस को फिर से शुरू करें


0

एक वेब उपयोगकर्ता के रूप में, आप नौकरी कॉन्फ़िगरेशन इतिहास पर जाकर निर्यात कर सकते हैं, फिर एक्सएमएल निर्यात कर सकते हैं।

मैं मशीन तक पहुंच नहीं होने की स्थिति में हूं, जेनकिंस चल रहा है और बैकअप के रूप में निर्यात करना चाहता था।

वेब उपयोगकर्ता के रूप में xml आयात करने के लिए, मैं अभी भी जानना चाहूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.