Làm cách nào để kiểm tra trạng thái xây dựng của bản dựng Jenkins từ dòng lệnh?


40

Làm cách nào để kiểm tra trạng thái bản dựng Jenkins mà không chuyển sang trình duyệt?

Nếu được yêu cầu, tôi có thể tạo tập lệnh bằng API JSON, nhưng tôi tự hỏi liệu đã có thứ gì đó như thế này được tích hợp sẵn chưa.


Bạn cũng có thể sử dụng các công cụ chuyên dụng như CatLight Build Monitor sẽ hiển thị trạng thái xây dựng trong khay.
alex

Mỗi bài viết ở đây dường như chỉ đến "bản dựng cuối cùng". Có một truy vấn tương tự để kiểm tra trạng thái của công việc / số xây dựng X không? Một cái gì đó bạn đang kiểm tra trong thời gian thực hoặc sau khi thực tế.
David

Câu trả lời:


38

Tôi không thể tìm thấy một công cụ tích hợp nên tôi đã tạo một công cụ:

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

Làm thế nào bạn được xác thực người dùng Jenkins trong kịch bản của bạn?
Aman Varshney

11

Kiểm tra xem bản dựng có chạy hay không

Tôi đã thử tập lệnh Python trong câu trả lời cho câu hỏi này, nhưng không thể làm cho nó hoạt động được. Tôi không biết Python và không muốn đầu tư bất kỳ lúc nào để gỡ lỗi, nhưng đã có thể đọc đủ kịch bản để lấy cảm hứng từ nó.

Tất cả những gì tôi cần làm là kiểm tra xem bản dựng có đang chạy hay không. Để làm điều đó tôi đã sử dụng curl và grep, như thế này:

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

  • Nếu quá trình xây dựng đang diễn ra, grep for result\":nullsẽ trả về 0.
  • Nếu quá trình xây dựng kết thúc, grep for result\":nullsẽ trả về 1.

Không đặc biệt thanh lịch, nhưng nó hoạt động đủ tốt cho nhu cầu của tôi.

Ví dụ: tôi có một tập lệnh Bash bắt đầu quá trình xây dựng, sau đó đợi nó hoàn thành:

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

Cảm ơn về nguồn cảm hứng, Catskul!


Tôi đã đi và kiểm tra việc triển khai hiện tại của mình đang hoạt động và nó hơi khác so với phiên bản tôi đưa ra câu trả lời vì một số yêu cầu về mật khẩu. Bạn có biết tại sao nó không làm việc cho bạn?
Catskul

Tập lệnh Python hoạt động rất tốt nếu một công việc đã hoàn thành, nhưng nếu một công việc đang chạy, tập lệnh Python thất bại : TypeError: cannot concatenate 'str' and 'NoneType' objects. Tôi không biết Python, vì vậy tôi đã chuyển sang sử dụng shell và +1 câu trả lời của bạn cho cảm hứng. Cảm ơn!
Steve HHH

Bạn có thể thêm | | và sau đó là điều kiện để thoát mã 1, curl --silent $ JOB_STATUS_URL | grep result \ ": null> / dev / null || nếu [" $? "==" 1 "]; thì GREP_RETURN_CODE = $? Vì vậy, bạn không nhận được mã thoát '1' trong trường hợp bạn đang chạy trong bản dựng Jenkins và bạn không muốn nó thất bại.
Shachar Hamuzim Rajuan


4

Một giải pháp Python khác:

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

Bạn có thể sử dụng tập lệnh Groovy:

  1. Qua jenkins-cli

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

    , trong đó =có nghĩa là tiêu chuẩn. Bạn có thể xác thực bằng --username <USER> --password <PASS>hoặc với -i <SSH-PRIVATE-KEY>.

  2. Qua jenkins-cli qua SSH

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

3

Tôi nghĩ rằng tôi đã tìm thấy một cách dễ dàng hơn. Nếu tôi hiểu chính xác, bạn muốn kiểm tra kết quả của bản dựng - nếu đó là thành công hay thất bại, nói cách khác.

Lệnh "build" của Jenkins CLI thay đổi mã thoát tùy thuộc vào kết quả của quá trình xây dựng, miễn là bạn sử dụng tùy chọn -shoặc -ftùy chọn ở cuối.

Ví dụ,

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

hoặc là

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

Lưu ý rằng tùy chọn đi ở cuối; đây không phải là lần đầu tiên -s, được sử dụng để xác định URL của ví dụ Jenkins.

Và sau đó, để có kết quả, bạn có thể sử dụng $?:

echo $?

Nếu kết quả là 0, đó là một thành công. Nếu đó là một cái gì đó khác 0, thì đó là một thất bại.

Tham khảo: Tôi không thể tìm thấy một phiên bản Jenkins công khai cho phép truy cập vào trang này, nhưng nó có thể được tìm thấy trong ví dụ Jenkins địa phương của bạn : http://<url of Jenkins Instance>/cli/command/build. Nó cũng giải thích sự khác biệt giữa -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

Bạn có thể sử dụng mô tả tượng trưng lastBuild:

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

Phần resulttử trong phản hồi chứa một chuỗi mô tả kết quả của bản dựng.


2

May mắn thay, có một jenkins-cli mà bạn có thể sử dụng để lấy một số thông tin từ Jenkins. Thật không may, bạn không thể truy xuất trạng thái của bản dựng bằng CLI - điều đó có nghĩa là giải pháp sử dụng API JSON của bạn không chỉ đúng - đó là cách lập trình duy nhất để làm như vậy.

Ngoài ra, mặc dù có vẻ như get-jobcó thể làm những gì bạn muốn, nhưng nó không thực sự trả về kết quả - nó chỉ trả về cấu hình công việc.


2

Một tập lệnh khác cho CMD (Windows):

: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!!"

Cảm ơn. Điều này tỏ ra rất hữu ích.
Victor S

0

Bạn có thể thử với điều này,

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.