मैं कमांड लाइन से जेनकींस के निर्माण की स्थिति की जांच कैसे करूं?


40

मैं ब्राउज़र पर स्विच किए बिना जेनकींस निर्माण की स्थिति की जांच कैसे करूं?

यदि आवश्यक हो, तो मैं JSON एपीआई का उपयोग करके एक स्क्रिप्ट बना सकता हूं, लेकिन मैं सोच रहा था कि क्या पहले से ही ऐसा कुछ बनाया गया है।


आप कैटलाइट बिल्ड मॉनिटर जैसे विशेष टूल का भी उपयोग कर सकते हैं जो कि ट्रे में बिल्ड स्थिति दिखाएगा।
एलेक्स

यहाँ हर पोस्ट "अंतिम निर्माण" की ओर इशारा करती है। क्या नौकरी की स्थिति / बिल्ड नंबर X की जाँच के लिए समान क्वेरी है? कुछ आप वास्तविक समय में या तथ्य के बाद जाँच रहे हैं।
डेविड

जवाबों:


38

मुझे एक बिल्ट इन टूल नहीं मिला, इसलिए मैंने एक बनाया:

#!/usr/bin/python
#
# author: ajs
# license: bsd
# copyright: re2


import json 
import sys
import urllib
import urllib2

jenkinsUrl = "https://jenkins.example.com/job/"


if len( sys.argv ) > 1 :
    jobName = sys.argv[1]
    jobNameURL = urllib.quote(jobName)
else :
    sys.exit(1)

try:
    jenkinsStream   = urllib2.urlopen( jenkinsUrl + jobNameURL + "/lastBuild/api/json" )
except urllib2.HTTPError, e:
    print "URL Error: " + str(e.code) 
    print "      (job name [" + jobName + "] probably wrong)"
    sys.exit(2)

try:
    buildStatusJson = json.load( jenkinsStream )
except:
    print "Failed to parse json"
    sys.exit(3)

if buildStatusJson.has_key( "result" ):      
    print "[" + jobName + "] build status: " + buildStatusJson["result"]
    if buildStatusJson["result"] != "SUCCESS" :
        exit(4)
else:
    sys.exit(5)

sys.exit(0)

कैसे आप अपनी स्क्रिप्ट में जेनकींस उपयोगकर्ता प्रमाणित कर रहे हैं?
अमन वार्ष्णेय

11

यह देखने के लिए जांचें कि कोई बिल्ड चल रहा है या नहीं

मैंने इस प्रश्न के उत्तर में पायथन स्क्रिप्ट की कोशिश की, लेकिन काम करने के लिए इसे नहीं मिला। मैं पायथन को नहीं जानता, और डिबगिंग में किसी भी समय निवेश नहीं करना चाहता था, लेकिन इससे प्रेरणा प्राप्त करने के लिए पर्याप्त स्क्रिप्ट पढ़ने में सक्षम था।

मुझे बस यह देखने की ज़रूरत है कि एक बिल्ड चल रहा है या नहीं। ऐसा करने के लिए मैंने कर्ल और ग्रेप का उपयोग किया, जैसे:

curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null

  • यदि कोई निर्माण प्रगति पर है, तो result\":null0 के लिए एक grep वापस आएगा।
  • यदि एक निर्माण समाप्त हो जाता है, तो result\":null1 के लिए एक grep वापस आ जाएगा।

विशेष रूप से सुरुचिपूर्ण नहीं, लेकिन यह मेरी आवश्यकताओं के लिए पर्याप्त रूप से काम करता है।

उदाहरण के लिए, मेरे पास एक बैश स्क्रिप्ट है जो एक बिल्ड शुरू करती है, फिर इसके खत्म होने का इंतजार करती है:

JOB_URL=http://jenkins.local/job/stevehhhbuild
JOB_STATUS_URL=${JOB_URL}/lastBuild/api/json

GREP_RETURN_CODE=0

# Start the build
curl $JOB_URL/build?delay=0sec

# Poll every thirty seconds until the build is finished
while [ $GREP_RETURN_CODE -eq 0 ]
do
    sleep 30
    # Grep will return 0 while the build is running:
    curl --silent $JOB_STATUS_URL | grep result\":null > /dev/null
    GREP_RETURN_CODE=$?
done

echo Build finished

प्रेरणा के लिए धन्यवाद, Catskul!


मैंने अपने वर्तमान कार्यान्वयन को जांचा और जाँच रहा है जो काम कर रहा है, और यह कुछ पासवर्ड आवश्यकताओं के कारण मेरे द्वारा उत्तर में डाले गए संस्करण से थोड़ा अलग है। क्या आप जानते हैं कि यह आपके लिए काम क्यों नहीं कर रहा था?
कैटस्कूल

यदि कोई नौकरी पहले ही समाप्त हो गई है, तो पायथन स्क्रिप्ट बहुत अच्छा काम करती है, लेकिन यदि कोई नौकरी चल रही है, तो पायथन स्क्रिप्ट विफल हो जाती है TypeError: cannot concatenate 'str' and 'NoneType' objects:। मैं पायथन को नहीं जानता, इसलिए मैंने प्रेरणा के लिए शेल और + 1ed को आपके उत्तर का उपयोग करने के लिए स्विच किया। धन्यवाद!
स्टीव एचएचएच

आप जोड़ सकते हैं || और उसके बाद बाहर निकलने के लिए शर्त 1 कोड, कर्ल - $ $ JOB_STATUS_URL | grep result \ ": null> / dev / null || अगर [" $? "==" 1 "]? तो GREP_RETURN_CODE = $? तो यदि आप जेनकींस बिल्ड में चल रहे हैं तो आपको बाहर निकलने का कोड '1' नहीं मिलता है? और आप इसे विफल नहीं करना चाहते हैं।
शचर हमुज़िम राजुआन

6

मेरे एक पूर्व सहयोगी ने https://github.com/txels/autojenkins लिखा है, जिसके पास पाइथन से जेनकींस उदाहरण के साथ काम करने के लिए सुविधा सुविधाओं और एपीआई प्रकार के सामान का एक पूरा गुच्छा है ...


4

एक और पायथन समाधान:

from jenkinsapi.jenkins import Jenkins

jenkins_url = 'http://<server url>/'
server = Jenkins(jenkins_url, username = 'myUser', password = myPass)

job_instance = server.get_job('the job name')
running = job_instance.is_queued_or_running()
if not running:
   latestBuild = job_instance.get_last_build()
   print latestBuild.get_status()

4

आप एक ग्रूवी स्क्रिप्ट का उपयोग कर सकते हैं:

  1. वाया जेनकिंस-क्लि

    echo 'println(jenkins.model.Jenkins.instance'\
    '.getItem("<JOB-NAME>").lastBuild.building)' \
        | java -jar jenkins-cli.jar -s <JENKINS-URL> groovy =
    

    , जहां =मानक का मतलब है। आप के साथ --username <USER> --password <PASS>या साथ प्रमाणित कर सकते हैं -i <SSH-PRIVATE-KEY>

  2. SSH के ऊपर जेंकिंस-क्ली के माध्यम से

    echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
    | ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
    

3

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

जेनकिन्स सीएलआई की "बिल्ड" कमांड बिल्ड के परिणाम के आधार पर निकास कोड को बदल देती है, जब तक कि आप अंत में -sया -fविकल्प का उपयोग करते हैं ।

उदाहरण के लिए,

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s

या

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f

ध्यान दें कि विकल्प अंत में जाता है; यह पहला नहीं है -s, जिसका उपयोग जेनकिंस उदाहरण के URL को परिभाषित करने के लिए किया जाता है।

और फिर, परिणाम प्राप्त करने के लिए, आप उपयोग कर सकते हैं $?:

echo $?

यदि परिणाम 0 है, तो यह एक सफलता थी। यदि यह 0 के अलावा कुछ है, तो यह एक विफलता थी।

संदर्भ: मैं एक सार्वजनिक जेनकींस उदाहरण है कि इस पृष्ठ पर पहुँच देता है नहीं मिल सकता है, लेकिन यह अपने स्थानीय जेनकींस उदाहरण में पाया जा सकता है: http://<url of Jenkins Instance>/cli/command/build। यह भी -sऔर बीच का अंतर बताता है -f:

-s  : Wait until the completion/abortion of the command. Interrupts are passed
      through to the build.

-f  : Follow the build progress. Like -s only interrupts are not passed
      through to the build.

2

आप प्रतीकात्मक वर्णनकर्ता का उपयोग कर सकते हैं lastBuild:

http://localhost/jenkins/job/<jobName>/lastBuild/api/xml

resultजवाब में तत्व एक स्ट्रिंग निर्माण के परिणाम का वर्णन होता है।


2

सौभाग्य से, एक जेनकिंस -क्लि है जिसका उपयोग आप जेनकिंस से कुछ जानकारी प्राप्त करने के लिए कर सकते हैं। दुर्भाग्य से, आप सीएलआई का उपयोग करके एक निर्माण की स्थिति को पुनः प्राप्त नहीं कर सकते हैं - जिसका अर्थ है कि JSON एपीआई का उपयोग करने का आपका समाधान न केवल सही है - यह ऐसा करने का एकमात्र प्रोग्रामेटिक तरीका है।

इसके अलावा, जब यह दिखता get-jobहै कि आप क्या चाहते हैं, तो यह वास्तव में परिणाम नहीं लौटा सकता है - यह केवल नौकरी कॉन्फ़िगरेशन देता है।


2

सीएमडी (विंडोज) के लिए एक और स्क्रिप्ट:

:loop
ping 127.0.0.1 -n 6  1>nul
curl --silent http://localhost:8080/job/JOB_NAME/lastBuild/api/xml | FINDSTR "SUCCESS FAILURE" >nul & IF ERRORLEVEL 1 (goto :loop)
echo "BUILD FINISH!!"

धन्यवाद। यह बहुत मददगार साबित हुआ।
विक्टर एस

0

आप इस के साथ कोशिश कर सकते हैं,

JOB_URL=http://localhost:8080/view/TestTab/job/JobWait
JOB_STATUS_URL=${JOB_URL}/lastBuild/api/json

GREP_RETURN_CODE=0

# Start the build
curl --user "username:password" $JOB_URL/build?delay=0sec

# Poll every 10 second  until the build is finished
while [ $GREP_RETURN_CODE -eq 0 ]
do
    sleep 10
    # Grep will return 0 while the build is running:
    curl --user "username:password" --silent $JOB_STATUS_URL | grep result\":null > /dev/null || if [ "$?" == "1" ]; then
      exit 0
    fi

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