Cách đánh dấu một bản dựng không ổn định trong Jenkins khi chạy các tập lệnh shell


93

Trong một dự án mà tôi đang thực hiện, chúng tôi đang sử dụng các tập lệnh shell để thực thi các tác vụ khác nhau. Một số là tập lệnh sh / bash chạy rsync và một số là tập lệnh PHP. Một trong những tập lệnh PHP đang chạy một số bài kiểm tra tích hợp xuất ra JUnit XML, báo cáo phạm vi mã và tương tự.

Jenkins có thể đánh dấu các công việc là thành công / thất bại dựa trên trạng thái thoát . Trong PHP, tập lệnh thoát bằng 1 nếu nó phát hiện thấy các bài kiểm tra không thành công trong quá trình chạy. Các tập lệnh shell khác chạy các lệnh và sử dụng các mã thoát từ các lệnh đó để đánh dấu một bản dựng là không thành công.

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

Trong Thuật ngữ Jenkins , một bản dựng không ổn định được định nghĩa là:

Một bản dựng không ổn định nếu nó được tạo thành công và một hoặc nhiều nhà xuất bản báo cáo nó không ổn định. Ví dụ: nếu nhà xuất bản JUnit được cấu hình và kiểm tra không thành công thì bản dựng sẽ được đánh dấu là không ổn định.

Làm cách nào để Jenkins đánh dấu một bản dựng là không ổn định thay vì chỉ thành công / thất bại khi chạy các tập lệnh shell?


Tôi achived nó chạy các bước công việc khác nhau và sử dụng Jenkins plugins stackoverflow.com/questions/25442343/...
fantastory

Câu trả lời:


58

Sử dụng plugin Công cụ tìm văn bản .

Thay vì thoát với trạng thái 1 (sẽ không xây dựng được), hãy làm:

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

Hơn trong các hành động sau khi xây dựng, hãy bật Trình tìm kiếm văn bản, đặt biểu thức chính quy để khớp với thông báo bạn đã in ( TESTS FAILED!) và chọn hộp kiểm "Không ổn định nếu tìm thấy" trong mục nhập đó.


2
Xem câu trả lời dưới đây cho một tùy chọn mà không cần cài đặt một plugin, vì Jenkins phiên bản 2.26: stackoverflow.com/a/49676269/1347649
JSoet

63

Các phiên bản Jenkins hiện đại (kể từ 2.26, tháng 10 năm 2016) đã giải quyết vấn đề này: nó chỉ là một tùy chọn nâng cao cho bước xây dựng Execute shell!

mã thoát cho bản dựng

Bạn chỉ có thể chọn và đặt một giá trị thoát tùy ý; nếu nó khớp, bản dựng sẽ không ổn định. Chỉ cần chọn một giá trị khó có thể được đưa ra bởi một quy trình thực trong quá trình xây dựng của bạn.


Tôi thích tùy chọn này vì nó không yêu cầu bạn cài đặt thêm bất kỳ plugin nào
mattherman

2
Vì điều này được triển khai trong Jenkins mới nhất - đây phải là một câu trả lời được chấp nhận
Smoke_lp

3
"Phiên bản Jenkins hiện đại" có nghĩa là Jenkins 2.26 hoặc mới hơn. Xem issue.jenkins-ci.org/browse/JENKINS-23786 .
Blue

5
Có thể chỉ định điều này thông qua mã khi sử dụng shlệnh bước trong a Jenkinsfilekhông? Cài đặt nằm ở đâu trong GUI? Tôi không thể tìm thấy nó.
bluenote10

1
Tôi đã phải nhấp vào mở nút "Nâng cao ..." trong bước xây dựng để hiển thị điều này. Không hữu ích lắm khi ẩn một tùy chọn duy nhất (và không đặc biệt nâng cao) đằng sau một trình thu gọn "nhấp vào đây để làm mọi việc" nhưng đó là cách thực hiện.
tripleee

57

Nó có thể được thực hiện mà không cần in chuỗi ma thuật và sử dụng TextFinder. Đây là một số thông tin về nó.

Về cơ bản, bạn cần một tệp .jar từ http: // yourerver.com / cli có sẵn trong các tập lệnh shell, sau đó bạn có thể sử dụng lệnh sau để đánh dấu một bản dựng không ổn định:

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

Để đánh dấu bản dựng không ổn định về lỗi, bạn có thể sử dụng:

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

Vấn đề là jenkins-cli.jar phải có sẵn từ shell script. Bạn có thể đặt nó trong đường dẫn dễ truy cập hoặc tải xuống thông qua tập lệnh shell của job:

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

2
Tôi thực sự thích giải pháp này, tôi đã triển khai một lớp ruby ​​cho cái này để dễ dàng sử dụng lại trong rakefiles của mình. :)
Shire

3
+1 - đây là giải pháp tốt hơn so với câu trả lời được chấp nhận vì Trình tìm kiếm văn bản chỉ có thể tìm kiếm một chuỗi cho mỗi công việc, vì vậy bạn chỉ có thể đặt trạng thái xây dựng thành một trong hai giá trị.
gareth_bowles

4
Giải pháp thú vị. Nhưng nếu Jenkins của bạn yêu cầu xác thực, bạn sẽ cần thiết lập xác thực khóa công khai trong cấu hình của nó hoặc bất kỳ lệnh jenkins-cli nào sẽ không thành công với AccessDeniedException.
Tom De Leu

2
Điều này sẽ không hoạt động nếu bạn đang sử dụng nô lệ không có quyền truy cập web vào trang chủ. Ví dụ: nếu Jenkins nô lệ không thể tạo kết nối HTTP hoặc HTTPS trở lại máy chủ.
Steve HHH

3
Tôi muốn sử dụng giải pháp này, nhưng set-build-resultđã không được chấp nhận trong jenkins-cli.
DrLime2k10

28

Bạn nên sử dụng Jenkinsfile để bọc tập lệnh xây dựng của mình và chỉ cần đánh dấu bản dựng hiện tại là KHÔNG THỂ BỀN VỮNG bằng cách sử dụng currentBuild.result = "UNSTABLE".

   sân khấu {
      status = / * lệnh xây dựng của bạn ở đây * /
      if (status === "MARK-AS-UNSTABLE") {
        currentBuild.result = "KHÔNG THỂ BỎNG"
      }
   }

3
Tại sao câu trả lời này không có nhiều ủng hộ hơn? Có điều gì đó sai với nó (ngoại trừ việc sử dụng chuỗi "ma thuật" UNSTABLE)? Nó có vẻ đơn giản hơn những câu trả lời khác.
Kevin,

2
Câu hỏi là hỏi về công việc tự do, trong khi câu trả lời này là về công việc Pipeline. Câu trả lời đường ống không áp dụng cho các công việc tự do
Đánh dấu Waite

Làm thế nào để điều này thậm chí hoạt động? Tôi gặp lỗi: Expected one of "steps", "stages", or "parallel" for stagekhi tôi cố gắng đặt currentBuild.result trực tiếp bên trong một màn hình.
dokaspar

11

bạn cũng sẽ có thể sử dụng Groovy và làm những gì mà textfinder đã làm

đánh dấu một bản dựng là không ổn định với plugin hậu bản dựng thú vị

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()
}

Cũng xem Plugin Groovy Postbuild


6

Trong kịch bản công việc của mình, tôi có các câu sau (công việc này chỉ chạy trên Jenkins master):

# 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

Bạn có thể xem phần này và nhiều thông tin khác về cách đặt các trạng thái xây dựng trên Jenkins wiki: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI


4
  1. Định cấu hình bản dựng PHP để tạo báo cáo xml junit

    <phpunit bootstrap="tests/bootstrap.php" colors="true" >
       <logging>
           <log type="junit" target="build/junit.xml" 
               logIncompleteSkipped="false" title="Test Results"/>
       </logging>
    
       ....
    
     </phpunit>
    
  2. Hoàn thành tập lệnh xây dựng với trạng thái 0

    ...
    exit 0;
    
  3. Thêm hành động sau xây dựng Xuất bản báo cáo kết quả kiểm tra JUnit cho các XML báo cáo kiểm tra. Plugin này sẽ thay đổi bản dựng Ổn định thành Không ổn định khi thử nghiệm không thành công.

    **/build/junit.xml
    
  4. Thêm plugin Jenkins Text Finder với chức năng quét đầu ra bảng điều khiển và các tùy chọn bỏ chọn. Plugin này không xây dựng được toàn bộ do lỗi nghiêm trọng.

    PHP Fatal error:
    

3

Tôi thấy cách linh hoạt nhất để làm điều này là đọc một tệp trong plugin xây dựng bài đăng thú vị. nhập mô tả hình ảnh ở đây

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()
}

Nếu nội dung tệp là 'true', bản dựng sẽ được đặt thành không ổn định. Điều này sẽ hoạt động trên máy chủ cục bộ và trên bất kỳ nô lệ nào mà bạn thực hiện công việc và đối với bất kỳ loại tập lệnh nào có thể ghi vào đĩa.


Tôi giả sử điều này thực sự nói rằng "nếu có một tệp trong không gian làm việc có tên là build.properties" được đánh dấu là không ổn định. Có đúng không? Tôi là người mới đến Groovy, Bạn có phiền chia nhỏ lời giải thích này thêm một chút không?
uchuugaka

@uchuugaka vâng, nếu có một tệp và nó có những nội dung đó. Tên tệp và nội dung là tùy ý. Sử dụng bất cứ điều gì phù hợp với trường hợp của bạn.
jeremyjjbrown

Cảm ơn! rất hữu ích. Groovy Postbuild khá gián tiếp và Groovy hút một lượng lớn thứ như vậy từ Java và thêm nhiều thứ khác ... đó là một mẹo mới đối với tôi.
uchuugaka

@uchuugaka Tôi không nghĩ đó là vấn đề với groovy :)
jeremyjjbrown

Không phải là một vấn đề gì cả. Chỉ là một thử thách để tham gia!
uchuugaka

2

Công cụ Tìm kiếm Văn bản chỉ hoạt động tốt nếu trạng thái công việc không bị thay đổi từ THÀNH CÔNG thành THẤT BẠI hoặc BỊ BỎ CUỘC. Đối với những trường hợp như vậy, hãy sử dụng một tập lệnh thú vị trong bước 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
    }
 }

Xem thêm chi tiết trong một bài đăng tôi đã viết về nó: http://www.tikalk.com/devops/JenkinsJobStatusChange/


2

Sao chép câu trả lời của tôi từ đây vì tôi đã dành một khoảng thời gian để tìm kiếm câu trả lời này:

Điều này hiện có thể thực hiện được trong các phiên bản Jenkins mới hơn, bạn có thể làm như sau:

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

Trình tạo cú pháp đường ống hiển thị cho bạn điều này trong tab nâng cao:

Ví dụ về cú pháp đường ống


2

Tôi nghĩ tôi sẽ đăng một câu trả lời khác cho những người có thể đang tìm kiếm điều gì đó tương tự.

Trong công việc xây dựng của chúng tôi, chúng tôi có những trường hợp chúng tôi muốn tiếp tục xây dựng, nhưng được đánh dấu là không ổn định. Đối với chúng tôi, nó liên quan đến số phiên bản.

Vì vậy, tôi muốn đặt một điều kiện trên bản dựng và đặt bản dựng thành không ổn định nếu điều kiện đó được đáp ứng.

Tôi đã sử dụng tùy chọn Bước có điều kiện (duy nhất) làm bước xây dựng.

Sau đó, tôi sử dụng tập lệnh Execute system Groovy làm bước xây dựng sẽ chạy khi điều kiện đó được đáp ứng.

Tôi đã sử dụng Groovy Command và đặt tập lệnh như sau

import hudson.model.*

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

return

Điều đó dường như hoạt động khá tốt.

Tôi tình cờ tìm ra giải pháp ở đây

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


1

Là một giải pháp thay thế nhẹ nhàng hơn cho các câu trả lời hiện có, bạn có thể đặt kết quả xây dựng bằng HTTP POST đơn giản để truy cập API REST của bảng điều khiển tập lệnh Groovy :

    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

Ưu điểm:

  • không cần tải xuống và chạy một tệp jar lớn
  • không có kludges để thiết lập và đọc một số trạng thái chung (văn bản trên bảng điều khiển, tệp trong không gian làm việc)
  • không cần plugin (ngoài Groovy)
  • không cần phải định cấu hình một bước xây dựng bổ sung không cần thiết trong trường hợp PASSED hoặc FAILURE.

Đối với giải pháp này, môi trường của bạn phải đáp ứng các điều kiện sau:

  • Jenkins REST API có thể được truy cập từ nô lệ
  • Slave phải có quyền truy cập thông tin xác thực cho phép truy cập API REST của tập lệnh Jenkins Groovy.

0

Một cách dễ dàng để đặt một bản dựng là không ổn định, là trong khối "thực thi trình bao" của bạn, chạy exit 13


-3

Bạn chỉ có thể gọi "exit 1", và quá trình xây dựng sẽ không thành công tại thời điểm đó và không thể tiếp tục. Tôi thực hiện một hàm tạo passthrough để xử lý nó cho tôi và gọi safemake thay vì make for building:

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

11
lối ra 1, theo như tôi biết chỉ làm cho việc xây dựng thất bại. Tôi không muốn bản dựng bị lỗi, tôi muốn nó được đánh dấu là không ổn định.
HNygard

1
Xem thêm stackoverflow.com/questions/36313216/… - giải pháp đơn giản chỉ làif make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi
tripleee
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.