शेल स्क्रिप्ट को चलाते समय जेनकिन्स में अस्थिर निर्माण को कैसे चिह्नित किया जाए


93

जिस परियोजना में मैं काम कर रहा हूं, हम विभिन्न कार्यों को निष्पादित करने के लिए शेल स्क्रिप्ट का उपयोग कर रहे हैं। कुछ श / बैश स्क्रिप्ट हैं जो rsync चलाते हैं, और कुछ PHP स्क्रिप्ट हैं। PHP स्क्रिप्ट में से एक कुछ एकीकरण परीक्षण चला रहा है जो जेयूनिट एक्सएमएल, कोड कवरेज रिपोर्ट और इसी तरह का आउटपुट देता है।

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

// :: End of PHP script:
// If any tests have failed, fail the build
if ($build_error) exit(1);

में जेनकींस शब्दावली , एक अस्थिर निर्माण के रूप में परिभाषित किया गया है:

एक बिल्ड अस्थिर है अगर इसे सफलतापूर्वक बनाया गया था और एक या अधिक प्रकाशक इसे अस्थिर रिपोर्ट करते हैं। उदाहरण के लिए यदि JUnit प्रकाशक कॉन्फ़िगर किया गया है और एक परीक्षण विफल हो जाता है तो बिल्ड को अस्थिर चिह्नित किया जाएगा।

शेल स्क्रिप्ट चलाने के दौरान मैं केवल सफलता के बजाय अस्थिर के रूप में निर्माण को चिह्नित करने के लिए जेनकिन्स कैसे प्राप्त कर सकता हूं?


मैंने इसे अलग-अलग काम करने के लिए कदम
बढ़ाया और जेनकींस

जवाबों:


58

पाठ-खोजक प्लगइन का उपयोग करें ।

स्थिति 1 से बाहर निकलने के बजाय (जो निर्माण को विफल करेगा), करें:

if ($build_error) print("TESTS FAILED!");

पोस्ट-बिल्ड एक्शन की तुलना में टेक्स्ट फाइंडर को सक्षम करें, आपके द्वारा प्रिंट किए गए संदेश से मेल खाने के लिए नियमित अभिव्यक्ति सेट करें ( TESTS FAILED!) और उस प्रविष्टि के तहत "अस्थिर पाए गए" चेकबॉक्स की जांच करें।


2
प्लगइन स्थापित किए बिना एक विकल्प के लिए नीचे दिए गए उत्तर को देखें, क्योंकि
जेनकिन्स

63

आधुनिक जेनकींस संस्करण (२.२६, अक्टूबर २०१६ से) ने इसे हल कर दिया: यह एग्ज़िक्यूट शेल बिल्ड स्टेप के लिए एक उन्नत विकल्प है!

निर्माण के लिए बाहर निकलें कोड

आप बस मनमाना निकास मूल्य चुन सकते हैं और सेट कर सकते हैं; यदि यह मेल खाता है, तो निर्माण अस्थिर होगा। बस एक मूल्य चुनें जिसे आपके निर्माण में वास्तविक प्रक्रिया द्वारा लॉन्च किए जाने की संभावना नहीं है।


मुझे यह विकल्प पसंद है क्योंकि इसके लिए आपको किसी भी अतिरिक्त प्लगइन्स को स्थापित करने की आवश्यकता नहीं है
गणितज्ञ

2
चूंकि यह नवीनतम जेनकिंस में लागू किया गया है - यह एक स्वीकृत उत्तर होना चाहिए
धूम्रपान_ एलपी

3
"आधुनिक जेनकींस संस्करण" का अर्थ जेनकिन्स 2.26 या नया है। मुद्दे देखें । jenkins-ci.org/browse/JENKINS-23786
ब्लू

5
क्या यह संभव है कि जब कोड shकमांड का उपयोग करके कोड के माध्यम से इसे निर्दिष्ट किया जाए Jenkinsfile? GUI में सेटिंग कहाँ स्थित है? मुझे यह नहीं मिला।
bluenote10

1
मुझे इसे बेनकाब करने के लिए बिल्ड स्टेप के तहत "उन्नत ..." बटन को क्लिक करना था। यह "बातें करने के लिए यहां क्लिक करें" कोलापर के पीछे एक एकल (और विशेष रूप से उन्नत नहीं) विकल्प को छिपाने के लिए बहुत उपयोगी नहीं है लेकिन यह है कि यह कैसा है।
ट्रिपलए

57

यह मैजिक स्ट्रिंग्स को प्रिंट किए बिना और TextFinder का उपयोग किए बिना किया जा सकता है। यहाँ पर कुछ जानकारी है।

मूल रूप से आपको शेल स्क्रिप्ट में उपलब्ध http: // yourserver.com / cli से एक .jar फ़ाइल की आवश्यकता होती है , तो आप एक निर्माण अस्थिर बनाने के लिए निम्न कमांड का उपयोग कर सकते हैं:

java -jar jenkins-cli.jar set-build-result unstable

त्रुटि पर अस्थिर निर्माण को चिह्नित करने के लिए, आप इसका उपयोग कर सकते हैं:

failing_cmd cmd_args || java -jar jenkins-cli.jar set-build-result unstable

समस्या यह है कि शेल स्क्रिप्ट से जेनकिंस-क्लि.जर उपलब्ध है। आप इसे आसान-से-एक्सेस पथ में रख सकते हैं, या नौकरी के खोल स्क्रिप्ट के माध्यम से डाउनलोड कर सकते हैं:

wget ${JENKINS_URL}jnlpJars/jenkins-cli.jar

2
मैं वास्तव में इस समाधान को पसंद करता हूं, मैंने अपने रेकफाइल्स में आसान पुन: उपयोग के लिए इसके लिए एक रूबी वर्ग को लागू किया। :)
शायर

3
+1 - यह स्वीकृत उत्तर की तुलना में बेहतर समाधान है क्योंकि टेक्स्ट फाइंडर केवल एक स्ट्रिंग प्रति काम खोज सकता है, इसलिए आप केवल दो मानों में से एक को बिल्ड स्थिति सेट कर सकते हैं।
gareth_bowles

4
दिलचस्प समाधान। लेकिन अगर आपके जेनकिंस को प्रमाणीकरण की आवश्यकता है, तो आपको इसके कॉन्फ़िगरेशन में सार्वजनिक कुंजी प्रमाणीकरण सेट करने की आवश्यकता होगी या कोई जेनकींस-क्ली कमांड एक्सेसडेनइसेप्शन के साथ विफल हो जाएगा।
टॉम डे ल्यू

2
यह काम नहीं करेगा यदि आप एक ऐसे गुलाम का उपयोग कर रहे हैं जिसके पास मास्टर तक कोई वेब पहुंच नहीं है उदाहरण के लिए, यदि जेनकिंस दास सर्वर पर वापस HTTP या HTTPS कनेक्शन नहीं बना सकता है।
स्टीव एचएचएच

3
मैं इस समाधान का उपयोग करना चाहता था, लेकिन set-build-resultइसमें पदावनत कर दिया गया है jenkins-cli
DrLime2k10

28

आपको अपनी बिल्ड स्क्रिप्ट को लपेटने के लिए जेनकिंसफाइल का उपयोग करना चाहिए और बस उपयोग करके वर्तमान बिल्ड को UNSTABLE के रूप में चिह्नित करना चाहिए currentBuild.result = "UNSTABLE"

   मंच {
      स्टेटस = / * आपकी बिल्ड कमांड यहाँ जाती है * /
      अगर (स्थिति === "MARK-AS-UNSTABLE") {
        currentBuild.result = "UNSTABLE"
      }
   }

3
इस उत्तर में अधिक उत्थान क्यों नहीं है? क्या इसमें कुछ गड़बड़ है ("जादू" स्ट्रिंग के उपयोग को छोड़कर UNSTABLE)? यह अन्य उत्तरों की तुलना में अधिक सीधा लगता है।
केविन

2
सवाल फ्रीस्टाइल नौकरियों के बारे में पूछ रहा था, जबकि यह जवाब पाइपलाइन नौकरियों के बारे में है। पाइपलाइन का जवाब फ्रीस्टाइल नौकरियों पर लागू नहीं होता है
मार्क वाइट

यह भी कैसे काम करता है? मुझे एक त्रुटि मिलती है: Expected one of "steps", "stages", or "parallel" for stageजब मैं एक मंच के अंदर सीधे currentBuild.result सेट करने का प्रयास करता हूं।
डोकसपार

11

आपको ग्रूवी का उपयोग करने में सक्षम होना चाहिए और वही करना चाहिए जो टेक्स्टफाइंडर ने किया था

ग्रूवी पोस्ट-बिल्ड प्लगइन के साथ एक बिल्ड को स्थिर के रूप में चिह्नित करना

if(manager.logContains("Could not login to FTP server")) {
    manager.addWarningBadge("FTP Login Failure")
    manager.createSummary("warning.gif").appendText("<h1>Failed to login to remote FTP Server!</h1>", false, false, false, "red")
    manager.buildUnstable()
}

ग्रूवी पोस्टबिल्ट प्लगिन भी देखें


6

मेरी नौकरी की स्क्रिप्ट में, मेरे पास निम्नलिखित कथन हैं (यह नौकरी केवल जेनकिंस मास्टर पर चलती है):

# This is the condition test I use to set the build status as UNSTABLE
if [ ${PERCENTAGE} -gt 80 -a ${PERCENTAGE} -lt 90 ]; then
  echo WARNING: disc usage percentage above 80%

  # Download the Jenkins CLI JAR:
  curl -o jenkins-cli.jar ${JENKINS_URL}/jnlpJars/jenkins-cli.jar

  # Set build status to unstable
  java -jar jenkins-cli.jar -s ${JENKINS_URL}/ set-build-result unstable

fi

आप जेनकिंस विकी पर बिल्ड स्टेटस सेट करने के बारे में यह और बहुत अधिक जानकारी देख सकते हैं: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI


4
  1. Xml जूनिट रिपोर्ट बनाने के लिए PHP बिल्ड को कॉन्फ़िगर करें

    <phpunit bootstrap="tests/bootstrap.php" colors="true" >
       <logging>
           <log type="junit" target="build/junit.xml" 
               logIncompleteSkipped="false" title="Test Results"/>
       </logging>
    
       ....
    
     </phpunit>
    
  2. स्थिति 0 के साथ स्क्रिप्ट का निर्माण समाप्त करें

    ...
    exit 0;
    
  3. टेस्ट रिपोर्ट XMLs के लिए पोस्ट-बिल्ड एक्शन प्रकाशित करें JUnit परीक्षा परिणाम रिपोर्ट जोड़ें । जब परीक्षण विफल हो रहे हैं तो यह प्लगइन स्थिर बिल्ड को अस्थिर में बदल देगा।

    **/build/junit.xml
    
  4. कंसोल आउटपुट स्कैनिंग और अनियंत्रित विकल्पों के साथ जेनकिंस टेक्स्ट फाइंडर प्लगइन जोड़ें । यह प्लगइन पूरी तरह से असफल त्रुटि पर निर्माण करता है।

    PHP Fatal error:
    

3

मुझे लगता है कि ऐसा करने का सबसे लचीला तरीका ग्रूवी पोस्ट बिल्ड प्लगइन में एक फ़ाइल को पढ़ना है। यहाँ छवि विवरण दर्ज करें

import hudson.FilePath
import java.io.InputStream

def build = Thread.currentThread().executable

String unstable = null
if(build.workspace.isRemote()) {
    channel = build.workspace.channel;
    fp = new FilePath(channel, build.workspace.toString() + "/build.properties")
    InputStream is = fp.read()
    unstable = is.text.trim()
} else {
    fp = new FilePath(new File(build.workspace.toString() + "/build.properties"))
    InputStream is = fp.read()
    unstable = is.text.trim()
}

manager.listener.logger.println("Build status file: " + unstable)
if (unstable.equalsIgnoreCase('true')) {
    manager.listener.logger.println('setting build to unstable')
    manager.buildUnstable()
}

यदि फ़ाइल सामग्री 'सत्य' है, तो निर्माण अस्थिर हो जाएगा। यह स्थानीय मास्टर और आपके द्वारा काम चलाने वाले किसी भी दास पर और किसी भी तरह की स्क्रिप्ट के लिए काम करेगा जो डिस्क पर लिख सकता है।


मैं मान रहा हूं कि यह वास्तव में "अगर build.properties नाम के कार्यक्षेत्र में एक फ़ाइल है" अस्थिर के रूप में चिह्नित करता है। क्या वह सही है? मैं ग्रूवी के लिए नया हूं, क्या आप इस स्पष्टीकरण को थोड़ा और नीचे तोड़ेंगे?
uchuugaka

@uchuugaka हाँ, अगर वहाँ एक फ़ाइल है और यह उन सामग्री है। फ़ाइल का नाम और सामग्री मनमाना है। जो भी आपके मामले में फिट बैठता है उसका उपयोग करें।
jeremyjjbrown

धन्यवाद! बहुत मददगार। Groovy Postbuild काफी अप्रत्यक्ष है, और Groovy जावा से इतनी बड़ी मात्रा में सामान चूसता है और अधिक जोड़ता है ... यह मेरे लिए एक नई चाल है।
uchuugaka

@uchuugaka मुझे नहीं लगता कि यह एक समस्या है groovy :)
jeremyjjbrown

कोईबातनही। बस एक चुनौती में दुबला करने के लिए!
uchuugaka

2

TextFinder केवल तभी अच्छा है जब जॉब की स्थिति SUCCESS से बदलकर FAILED या ABORTED नहीं की गई है। ऐसे मामलों के लिए, PostBuild चरण में एक ग्रूवी स्क्रिप्ट का उपयोग करें:

errpattern = ~/TEXT-TO-LOOK-FOR-IN-JENKINS-BUILD-OUTPUT.*/;
manager.build.logFile.eachLine{ line ->
    errmatcher=errpattern.matcher(line)
    if (errmatcher.find()) {
        manager.build.@result = hudson.model.Result.NEW-STATUS-TO-SET
    }
 }

मेरे द्वारा इसके बारे में लिखी गई पोस्ट में अधिक विवरण देखें: http://www.tikalk.com/devops/JenkinsJobStatusChange/


2

यहाँ से अपना उत्तर दोहरा रहा हूँ क्योंकि मैंने कुछ समय इसके लिए खोजा था:

जेनकींस के नए संस्करणों में अब यह संभव है, आप कुछ इस तरह कर सकते हैं:

#!/usr/bin/env groovy

properties([
  parameters([string(name: 'foo', defaultValue: 'bar', description: 'Fails job if not bar (unstable if bar)')]),
])


stage('Stage 1') {
  node('parent'){
    def ret = sh(
      returnStatus: true, // This is the key bit!
      script: '''if [ "$foo" = bar ]; then exit 2; else exit 1; fi'''
    )
    // ret can be any number/range, does not have to be 2.
    if (ret == 2) {
      currentBuild.result = 'UNSTABLE'
    } else if (ret != 0) {
      currentBuild.result = 'FAILURE'
      // If you do not manually error the status will be set to "failed", but the
      // pipeline will still run the next stage.
      error("Stage 1 failed with exit code ${ret}")
    }
  }
}

पाइपलाइन सिंटैक्स जनरेटर आपको उन्नत टैब में यह दिखाता है:

पाइपलाइन सिंटेक्स उदाहरण


2

मैंने सोचा कि मैं ऐसे लोगों के लिए एक और उत्तर दूंगा जो कुछ इसी तरह की तलाश में हों।

हमारे निर्माण कार्य में हमारे पास ऐसे मामले हैं जहां हम चाहते हैं कि निर्माण जारी रहेगा, लेकिन अस्थिर के रूप में चिह्नित किया जाएगा। हमारे लिए यह संस्करण संख्याओं से संबंधित है।

इसलिए, मैं बिल्ड पर एक शर्त स्थापित करना चाहता था और अगर वह शर्त पूरी हो जाती है तो बिल्ड को अस्थिर कर सकता है।

मैंने निर्माण चरण के रूप में सशर्त चरण (एकल) विकल्प का उपयोग किया।

तब मैंने एक्सक्यूट सिस्टम ग्रूवी स्क्रिप्ट का निर्माण कदम के रूप में किया था जो उस स्थिति के पूरा होने पर चलेगी।

मैंने ग्रूवी कमांड का उपयोग किया और स्क्रिप्ट को निम्नलिखित सेट किया

import hudson.model.*

def build = Thread.currentThread().executable
build.@result = hudson.model.Result.UNSTABLE

return

यह काफी अच्छा काम करता है।

मैं यहाँ समाधान पर ठोकर खाई

http://tech.akom.net/archives/112-Marking-Jenkins-build-UNSTABLE-from-environment-inject-groovy-script.html


1

मौजूदा उत्तरों के लिए एक हल्के विकल्प के रूप में, आप Groovy स्क्रिप्ट कंसोल को एक्सेस करने के लिए एक साधारण HTTP POST के साथ बिल्ड रिजल्ट सेट कर सकते हैं :

    curl -X POST \
     --silent \
     --user "$YOUR_CREDENTIALS" \
     --data-urlencode "script=Jenkins.instance.getItemByFullName( '$JOB_NAME' ).getBuildByNumber( $BUILD_NUMBER ).setResult( hudson.model.Result.UNSTABLE )" $JENKINS_URL/scriptText

लाभ:

  • कोई बड़ी जार फ़ाइल डाउनलोड करने और चलाने की आवश्यकता नहीं है
  • कुछ वैश्विक राज्य को स्थापित करने और पढ़ने के लिए कोई कीचड़ नहीं है (कंसोल टेक्स्ट, कार्यक्षेत्र में फ़ाइलें)
  • कोई प्लगइन्स आवश्यक नहीं है (ग्रूवी के अलावा)
  • एक अतिरिक्त बिल्ड चरण को कॉन्फ़िगर करने की आवश्यकता नहीं है जो कि PASSED या FAILURE मामलों में शानदार है।

इस समाधान के लिए, आपके पर्यावरण को इन शर्तों को पूरा करना चाहिए:

  • जेनकिंस रीस्ट एपीआई को दास से एक्सेस किया जा सकता है
  • दास के पास क्रेडेंशियल्स तक पहुंच होनी चाहिए जो जेनकिंस ग्रूवी स्क्रिप्ट रीस्ट एपीआई तक पहुंचने की अनुमति देता है।

0

अस्थिर बनाने के लिए एक आसान तरीका, आपके "निष्पादित शेल" ब्लॉक में है, चलाएं exit 13


-3

आप बस "बाहर निकलें 1" को कॉल कर सकते हैं, और बिल्ड उस बिंदु पर विफल हो जाएगा और जारी नहीं रहेगा। मुझे लगता है कि मेरे लिए इसे संभालने के लिए एक पार्थस्ट्रॉ बनाने का कार्य किया गया है, और निर्माण के लिए इसे बनाने के बजाय सुरक्षित कॉल करें:

function safemake {
  make "$@"
  if [ "$?" -ne 0 ]; then
    echo "ERROR: BUILD FAILED"
    exit 1
  else
    echo "BUILD SUCCEEDED"
  fi
}

11
बाहर निकलें 1, जहां तक ​​मुझे पता है कि केवल बिल्ड फेल हो जाएगा। मैं नहीं चाहता कि निर्माण विफल हो, मैं चाहता हूं कि यह अस्थिर हो।
HNygard

1
यह भी देखें stackoverflow.com/questions/36313216/… - इसका सरल उपाय हैif make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi
ट्रिपल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.