วิธีทำเครื่องหมายบิลด์ไม่เสถียรในเจนกินส์เมื่อเรียกใช้เชลล์สคริปต์


93

ในโปรเจ็กต์ที่ฉันกำลังทำอยู่เรากำลังใช้เชลล์สคริปต์เพื่อดำเนินการงานต่างๆ บางสคริปต์เป็นสคริปต์ sh / bash ที่รัน rsync และบางสคริปต์เป็น PHP สคริปต์ PHP ตัวหนึ่งกำลังเรียกใช้การทดสอบการรวมบางอย่างที่ส่งออกไปยัง JUnit XML รายงานการครอบคลุมโค้ดและสิ่งที่คล้ายกัน

เจนกินส์สามารถทำเครื่องหมายงานที่ประสบความสำเร็จ / ล้มเหลวขึ้นอยู่กับสถานะทางออก ในPHP สคริปต์จะออกด้วย 1หากตรวจพบว่าการทดสอบล้มเหลวระหว่างการรัน เชลล์สคริปต์อื่น ๆ รันคำสั่งและใช้โค้ดออกจากโค้ดเหล่านั้นเพื่อทำเครื่องหมายบิลด์ว่าล้มเหลว

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

ในJenkins Terminologyโครงสร้างที่ไม่เสถียรถูกกำหนดให้เป็น:

บิวด์ไม่เสถียรหากสร้างสำเร็จและผู้เผยแพร่อย่างน้อยหนึ่งรายรายงานว่าไม่เสถียร ตัวอย่างเช่นหากกำหนดค่าผู้เผยแพร่ JUnit และการทดสอบล้มเหลวโครงสร้างจะถูกทำเครื่องหมายว่าไม่เสถียร

ฉันจะทำให้เจนกินส์ทำเครื่องหมายบิลด์ว่าไม่เสถียรแทนที่จะเป็นเพียงความสำเร็จ / ล้มเหลวเมื่อเรียกใช้เชลล์สคริปต์ได้อย่างไร


ฉันบรรลุขั้นตอนการทำงานที่แตกต่างกันและใช้ปลั๊กอิน jenkins stackoverflow.com/questions/25442343/…
fantastory

คำตอบ:


58

ใช้ปลั๊กอินค้นหาข้อความ

แทนที่จะออกด้วยสถานะ 1 (ซึ่งจะล้มเหลวในการสร้าง) ให้ทำ:

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

กว่าในการดำเนินการหลังการสร้างจะเปิดใช้งาน Text Finder ให้ตั้งค่านิพจน์ทั่วไปให้ตรงกับข้อความที่คุณพิมพ์ ( TESTS FAILED!) และเลือกช่องทำเครื่องหมาย "ไม่เสถียรหากพบ" ใต้รายการนั้น


2
ดูคำตอบด้านล่างสำหรับตัวเลือกโดยไม่ต้องติดตั้งปลั๊กอินเนื่องจากเจนกินส์เวอร์ชัน 2.26: stackoverflow.com/a/49676269/1347649
JSoet

63

Modern Jenkins เวอร์ชัน (ตั้งแต่ 2.26 ตุลาคม 2559) แก้ไขสิ่งนี้ได้: เป็นเพียงตัวเลือกขั้นสูงสำหรับขั้นตอนการสร้างเชลล์ Execute!

รหัสออกสำหรับการสร้าง

คุณสามารถเลือกและกำหนดมูลค่าออกโดยพลการ หากตรงกันการสร้างจะไม่เสถียร เพียงแค่เลือกค่าที่ไม่น่าจะเปิดใช้โดยกระบวนการจริงในงานสร้างของคุณ


ฉันชอบตัวเลือกนี้เนื่องจากไม่ต้องการให้คุณติดตั้งปลั๊กอินเพิ่มเติมใด ๆ
mattherman

2
เนื่องจากสิ่งนี้ถูกนำไปใช้ใน Jenkins ล่าสุด - นี่ควรเป็นคำตอบที่ยอมรับ
smoke_lp

3
"รุ่น Modern Jenkins" หมายถึง Jenkins 2.26 หรือใหม่กว่า ดูissues.jenkins-ci.org/browse/JENKINS-23786
สีน้ำเงิน

5
เป็นไปได้ไหมที่จะระบุสิ่งนี้ผ่านรหัสเมื่อใช้shคำสั่ง step ใน a Jenkinsfile? การตั้งค่าอยู่ที่ไหนใน GUI? ฉันหามันไม่เจอ.
bluenote10

1
ฉันต้องคลิกเปิดปุ่ม "ขั้นสูง ... " ใต้ขั้นตอนการสร้างเพื่อแสดงสิ่งนี้ ไม่มีประโยชน์มากที่จะซ่อนตัวเลือกเดียว (และไม่ใช่ขั้นสูงโดยเฉพาะ) ไว้ด้านหลังตัวยุบ "คลิกที่นี่เพื่อทำสิ่งต่างๆ" แต่ก็เป็นอย่างนั้น
tripleee

57

สามารถทำได้โดยไม่ต้องพิมพ์สตริงเวทย์มนตร์และใช้ TextFinder นี่คือข้อมูลบางส่วน

โดยทั่วไปคุณต้องมีไฟล์. jar จาก http: // yourserver.com / cli ที่มีอยู่ในเชลล์สคริปต์จากนั้นคุณสามารถใช้คำสั่งต่อไปนี้เพื่อทำเครื่องหมายบิลด์ไม่เสถียร:

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

หากต้องการทำเครื่องหมายบิวด์ไม่เสถียรเมื่อเกิดข้อผิดพลาดคุณสามารถใช้:

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

ปัญหาคือ jenkins-cli.jar ต้องพร้อมใช้งานจากเชลล์สคริปต์ คุณสามารถวางไว้ในเส้นทางที่เข้าถึงได้ง่ายหรือดาวน์โหลดผ่านเชลล์สคริปต์ของงาน:

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

2
ฉันชอบโซลูชันนี้มากฉันติดตั้งคลาสทับทิมสำหรับสิ่งนี้เพื่อให้สามารถนำมาใช้ซ้ำใน rakefiles :)
ไชร์

3
+1 - นี่เป็นวิธีแก้ปัญหาที่ดีกว่าคำตอบที่ยอมรับเนื่องจาก Text Finder สามารถค้นหาได้เพียงหนึ่งสตริงต่องานดังนั้นคุณจึงสามารถตั้งค่าสถานะบิลด์เป็นค่าใดค่าหนึ่งจากสองค่าเท่านั้น
gareth_bowles

4
ทางออกที่น่าสนใจ แต่ถ้า Jenkins ของคุณต้องการการพิสูจน์ตัวตนคุณจะต้องตั้งค่าการรับรองความถูกต้องของคีย์สาธารณะใน config มิฉะนั้นคำสั่ง jenkins-cli จะล้มเหลวด้วย AccessDeniedException
Tom De Leu

2
วิธีนี้จะใช้ไม่ได้หากคุณใช้ทาสที่ไม่มีการเข้าถึงเว็บไปยังต้นแบบ ตัวอย่างเช่นถ้า Jenkins slave ไม่สามารถสร้างการเชื่อมต่อ HTTP หรือ HTTPS กลับไปที่เซิร์ฟเวอร์
Steve HHH

3
ฉันต้องการใช้โซลูชันนี้ แต่set-build-resultเลิกใช้งานแล้วในไฟล์jenkins-cli.
DrLime2k10

28

คุณควรใช้ Jenkinsfile เพื่อรวมสคริปต์บิลด์ของคุณและทำเครื่องหมายบิลด์ปัจจุบันเป็น UNSTABLE โดยใช้currentBuild.result = "UNSTABLE".

   เวที {
      สถานะ = / * คำสั่ง build ของคุณอยู่ที่นี่ * /
      ถ้า (สถานะ === "MARK-AS-UNSTABLE") {
        currentBuild.result = "UNSTABLE"
      }
   }

3
เหตุใดคำตอบนี้จึงไม่มีการโหวตเพิ่มขึ้น มีสิ่งผิดปกติเกิดขึ้นหรือไม่ (ยกเว้นการใช้สตริง "มายากล" UNSTABLE) ดูเหมือนจะตรงไปตรงมามากกว่าคำตอบอื่น ๆ
Kevin

2
คำถามคือถามเกี่ยวกับงานฟรีสไตล์ในขณะที่คำตอบนี้เกี่ยวกับงาน Pipeline คำตอบ Pipeline ใช้ไม่ได้กับงานฟรีสไตล์
Mark Waite

วิธีนี้ใช้งานได้อย่างไร? ฉันได้รับข้อผิดพลาด: Expected one of "steps", "stages", or "parallel" for stageเมื่อฉันพยายามตั้งค่า currentBuild.result ภายในเวทีโดยตรง
dokaspar

11

คุณควรจะสามารถใช้ groovy และทำสิ่งที่ textfinder ทำได้

ทำเครื่องหมายบิลด์ว่าไม่เสถียรด้วยปลั๊กอินโพสต์บิวด์ที่มีร่อง

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

นอกจากนี้โปรดดูGroovy Postbuild Plugin


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

คุณสามารถดูสิ่งนี้และข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าสถานะการสร้างในวิกิ Jenkins: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI


4
  1. กำหนดค่า PHP build เพื่อสร้างรายงาน 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. เสร็จสิ้นการสร้างสคริปต์ด้วยสถานะ 0

    ...
    exit 0;
    
  3. เพิ่มการดำเนินการหลังการสร้างเผยแพร่รายงานผลการทดสอบ JUnitสำหรับ XML ของรายงานการทดสอบ ปลั๊กอินนี้จะเปลี่ยน Stable build เป็น Unstable เมื่อการทดสอบล้มเหลว

    **/build/junit.xml
    
  4. เพิ่มปลั๊กอินJenkins Text Finderด้วยการสแกนเอาต์พุตคอนโซลและตัวเลือกที่ไม่ได้เลือก ปลั๊กอินนี้ล้มเหลวทั้งโครงสร้างเนื่องจากข้อผิดพลาดร้ายแรง

    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" ทำเครื่องหมายว่าไม่เสถียร นั่นถูกต้องใช่ไหม? ฉันยังใหม่กับ Groovy คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม
uchuugaka

@uchuugaka ใช่ถ้ามีไฟล์และมีเนื้อหาเหล่านั้น ชื่อไฟล์และเนื้อหาเป็นไปตามอำเภอใจ ใช้อะไรก็ได้ที่เหมาะกับกรณีของคุณ
jeremyjjbrown

ขอบคุณ! เป็นประโยชน์มาก. Groovy Postbuild ค่อนข้างเป็นทางอ้อมและ Groovy ดูดสิ่งต่างๆมากมายจาก Java และเพิ่มมากขึ้น ...
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

การทำซ้ำคำตอบของฉันจากที่นี่เพราะฉันใช้เวลาค้นหาสิ่งนี้:

ตอนนี้เป็นไปได้แล้วใน Jenkins เวอร์ชันใหม่กว่าคุณสามารถทำสิ่งนี้ได้:

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

ฉันคิดว่าฉันจะโพสต์คำตอบอื่นสำหรับผู้ที่อาจกำลังมองหาสิ่งที่คล้ายกัน

ในงานสร้างของเราเรามีกรณีที่เราต้องการให้งานสร้างต่อไป แต่ถูกทำเครื่องหมายว่าไม่เสถียร สำหรับของเรามันเกี่ยวข้องกับหมายเลขเวอร์ชัน

ดังนั้นฉันจึงต้องการตั้งเงื่อนไขบนบิลด์และตั้งค่าการสร้างให้ไม่เสถียรหากตรงตามเงื่อนไขนั้น

ฉันใช้อ็อพชันConditional step (single)เป็นขั้นตอนการสร้าง

จากนั้นฉันใช้Execute system Groovy scriptเป็นขั้นตอนการสร้างที่จะทำงานเมื่อตรงตามเงื่อนไขนั้น

ฉันใช้Groovy Commandและตั้งค่าสคริปต์ดังต่อไปนี้

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

เพื่อเป็นทางเลือกที่น้อยกว่าสำหรับคำตอบที่มีอยู่คุณสามารถตั้งค่าผลลัพธ์ของการสร้างด้วยHTTP POST แบบง่ายเพื่อเข้าถึงคอนโซลสคริปต์ Groovy REST API :

    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

ข้อดี:

  • ไม่จำเป็นต้องดาวน์โหลดและเรียกใช้ไฟล์ jar ขนาดใหญ่
  • ไม่มี kludges สำหรับการตั้งค่าและอ่านสถานะส่วนกลาง (ข้อความคอนโซลไฟล์ในพื้นที่ทำงาน)
  • ไม่ต้องใช้ปลั๊กอิน (นอกจาก Groovy)
  • ไม่จำเป็นต้องกำหนดค่าขั้นตอนการสร้างเพิ่มเติมที่ไม่จำเป็นในกรณี PASSED หรือ FAILURE

สำหรับโซลูชันนี้สภาพแวดล้อมของคุณต้องเป็นไปตามเงื่อนไขเหล่านี้:

  • Jenkins REST API สามารถเข้าถึงได้จากทาส
  • Slave ต้องมีสิทธิ์เข้าถึงข้อมูลประจำตัวที่อนุญาตให้เข้าถึง Jenkins Groovy script REST API

0

วิธีง่ายๆวิธีหนึ่งในการตั้งค่าบิลด์ให้ไม่เสถียรคือในบล็อก "execute shell" ของคุณเรียกใช้ exit 13


-3

คุณสามารถเรียก "exit 1" ได้และการสร้างจะล้มเหลว ณ จุดนั้นและไม่ดำเนินการต่อ ฉันทำ passthrough make function เพื่อจัดการมันให้ฉันและโทรหา safemake แทน make for building:

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
tripleee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.