Cara menandai build tidak stabil di Jenkins saat menjalankan skrip shell

93

Dalam sebuah proyek yang saya kerjakan, kami menggunakan skrip shell untuk menjalankan tugas yang berbeda. Beberapa adalah skrip sh / bash yang menjalankan rsync, dan beberapa lagi adalah skrip PHP. Salah satu skrip PHP menjalankan beberapa tes integrasi yang menghasilkan output ke XML JUnit, laporan cakupan kode, dan sejenisnya.

Jenkins dapat menandai pekerjaan sebagai berhasil / gagal berdasarkan status keluar . Di PHP, skrip keluar dengan 1 jika telah mendeteksi bahwa pengujian gagal selama berjalan. Skrip shell lainnya menjalankan perintah dan menggunakan kode keluar dari skrip tersebut untuk menandai build sebagai gagal.

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

Dalam Jenkins Terminology , build yang tidak stabil didefinisikan sebagai:

Sebuah bangunan tidak stabil jika berhasil dibangun dan satu atau beberapa penerbit melaporkannya tidak stabil. Misalnya jika penerbit JUnit dikonfigurasi dan pengujian gagal, maka build akan ditandai tidak stabil.

Bagaimana cara membuat Jenkins menandai build sebagai tidak stabil, bukan hanya berhasil / gagal saat menjalankan skrip shell?

HNygard
sumber
Saya mencapainya dengan menjalankan langkah-langkah pekerjaan yang berbeda dan menggunakan plugin jenkins stackoverflow.com/questions/25442343/…
fantastory

Jawaban:

58

Gunakan plugin pencari teks .

Daripada keluar dengan status 1 (yang akan gagal membangun), lakukan:

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

Dari pada tindakan pasca-pembuatan, aktifkan Pencari Teks, setel ekspresi reguler agar cocok dengan pesan yang Anda cetak ( TESTS FAILED!) dan centang kotak "Tidak stabil jika ditemukan" di bawah entri itu.

Jan Hudec
sumber
2
Lihat jawaban di bawah untuk opsi tanpa menginstal plugin, karena jenkins versi 2.26: stackoverflow.com/a/49676269/1347649
JSoet
63

Versi Jenkins modern (sejak 2.26, Oktober 2016) memecahkan masalah ini: ini hanya opsi lanjutan untuk langkah build Execute shell!

kode keluar untuk membangun

Anda tinggal memilih dan menetapkan nilai keluar yang sewenang-wenang; jika cocok, build tersebut akan menjadi tidak stabil. Pilih saja nilai yang tidak mungkin diluncurkan oleh proses nyata dalam build Anda.

Alan Franzoni
sumber
Saya suka opsi ini karena tidak mengharuskan Anda memasang plugin tambahan
mattherman
2
Karena ini diterapkan di Jenkins terbaru - ini harus menjadi jawaban yang diterima
smoke_lp
3
"Versi Jenkins modern" berarti Jenkins 2.26 atau yang lebih baru. Lihat issues.jenkins-ci.org/browse/JENKINS-23786 .
Biru
5
Apakah mungkin untuk menentukan ini melalui kode saat menggunakan shperintah langkah di a Jenkinsfile? Di manakah letak pengaturan di GUI? Saya tidak dapat menemukannya.
bluenote10
1
Saya harus mengklik tombol "Advanced ..." di bawah langkah build untuk mengekspos ini. Ini tidak terlalu berguna untuk menyembunyikan satu opsi (dan tidak terlalu canggih) di belakang collapser "klik di sini untuk melakukan sesuatu" tetapi begitulah adanya.
tripleee
57

Itu dapat dilakukan tanpa mencetak string ajaib dan menggunakan TextFinder. Berikut beberapa info tentangnya.

Pada dasarnya Anda memerlukan file .jar dari http: // yourserver.com / cli yang tersedia dalam skrip shell, lalu Anda dapat menggunakan perintah berikut untuk menandai build tidak stabil:

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

Untuk menandai build tidak stabil pada kesalahan, Anda dapat menggunakan:

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

Masalahnya adalah jenkins-cli.jar harus tersedia dari skrip shell. Anda dapat meletakkannya di jalur yang mudah diakses, atau mengunduhnya melalui skrip shell pekerjaan:

wget ${JENKINS_URL}jnlpJars/jenkins-cli.jar
binaryLV
sumber
2
Saya sangat menyukai solusi ini, saya menerapkan kelas ruby ​​untuk ini agar mudah digunakan kembali di rakefiles saya. :)
Shire
3
+1 - ini adalah solusi yang lebih baik daripada jawaban yang diterima karena Pencari Teks hanya dapat mencari satu string per pekerjaan, jadi Anda hanya dapat menyetel status build ke salah satu dari dua nilai.
gareth_bowles
4
Solusi menarik. Namun jika Jenkins Anda memerlukan autentikasi, Anda perlu menyiapkan autentikasi kunci publik dalam konfignya atau perintah jenkins-cli apa pun akan gagal dengan AccessDeniedException.
Tom De Leu
2
Ini tidak akan berfungsi jika Anda menggunakan budak yang tidak memiliki akses web ke master. Misalnya, jika budak Jenkins tidak dapat membuat koneksi HTTP atau HTTPS kembali ke server.
Steve HHH
3
Saya ingin menggunakan solusi ini, tetapi set-build-resultsudah tidak digunakan lagi di jenkins-cli.
DrLime2k10
28

Anda harus menggunakan Jenkinsfile untuk membungkus skrip build Anda dan cukup tandai build saat ini sebagai UNSTABLE dengan menggunakan currentBuild.result = "UNSTABLE".

   panggung {
      status = / * perintah build Anda berada di sini * /
      if (status === "TANDAI-SEBAGAI-TIDAK STABIL") {
        currentBuild.result = "UNSTABLE"
      }
   }
poussma.dll
sumber
3
Mengapa jawaban ini tidak memiliki lebih banyak suara positif? Apakah ada yang salah dengannya (kecuali penggunaan string "ajaib" UNSTABLE)? Tampaknya lebih mudah daripada jawaban lainnya.
Kevin
2
Pertanyaannya adalah tentang pekerjaan gaya bebas, sedangkan jawaban ini adalah tentang pekerjaan Pipeline. Jawaban Pipeline tidak berlaku untuk pekerjaan gaya bebas
Mark Waite
Bagaimana cara kerjanya? Saya mendapatkan kesalahan: Expected one of "steps", "stages", or "parallel" for stageketika saya mencoba mengatur currentBuild.result langsung di dalam panggung.
dokaspar
6

Dalam skrip pekerjaan saya, saya memiliki pernyataan berikut (pekerjaan ini hanya berjalan pada master Jenkins):

# 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

Anda dapat melihat ini dan lebih banyak informasi tentang pengaturan status build di wiki Jenkins: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

Steve HHH
sumber
4
  1. Konfigurasikan build PHP untuk menghasilkan laporan junit xml

    <phpunit bootstrap="tests/bootstrap.php" colors="true" >
       <logging>
           <log type="junit" target="build/junit.xml" 
               logIncompleteSkipped="false" title="Test Results"/>
       </logging>
    
       ....
    
     </phpunit>
    
  2. Selesaikan skrip build dengan status 0

    ...
    exit 0;
    
  3. Tambahkan tindakan pasca-pembuatan Publikasikan laporan hasil pengujian JUnit untuk XML laporan pengujian. Plugin ini akan mengubah build Stabil menjadi Tidak Stabil saat pengujian gagal.

    **/build/junit.xml
    
  4. Tambahkan plugin Jenkins Text Finder dengan pemindaian keluaran konsol dan opsi yang tidak dicentang. Plugin ini gagal secara keseluruhan karena kesalahan fatal.

    PHP Fatal error:
    
MariuszS
sumber
3

Saya menemukan cara paling fleksibel untuk melakukan ini adalah dengan membaca file di plugin groovy post build. masukkan deskripsi gambar di sini

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

Jika konten file adalah 'true', build akan disetel ke tidak stabil. Ini akan bekerja pada master lokal dan pada semua budak tempat Anda menjalankan pekerjaan, dan untuk semua jenis skrip yang dapat menulis ke disk.

jeremyjjbrown
sumber
Saya berasumsi bahwa ini benar-benar mengatakan "jika ada file di ruang kerja bernama build.properties" tandai sebagai tidak stabil. Apakah itu benar? Saya baru mengenal Groovy, Maukah Anda memecah penjelasan ini sedikit lagi?
uchuugaka
@uchuugaka ya, jika ada file dan ada isinya. Nama file dan isinya sewenang-wenang. Gunakan apa pun yang sesuai dengan kasus Anda.
jeremyjjbrown
Terima kasih! sangat membantu. Groovy Postbuild cukup tidak langsung, dan Groovy menyedot begitu banyak hal dari Java dan menambahkan lebih banyak ... ini adalah trik baru bagi saya.
uchuugaka
@uchuugaka Saya tidak berpikir itu masalah dengan groovy :)
jeremyjjbrown
Tidak masalah sama sekali. Hanya tantangan untuk dicondongkan!
uchuugaka
2

TextFinder hanya berfungsi jika status pekerjaan belum diubah dari SUCCESS menjadi FAILED atau ABORTED. Untuk kasus seperti itu, gunakan skrip yang menarik di langkah 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
    }
 }

Lihat detail lebih lanjut dalam posting yang saya tulis tentang ini: http://www.tikalk.com/devops/JenkinsJobStatusChange/

yorammi
sumber
2

Menggandakan jawaban saya dari sini karena saya menghabiskan beberapa waktu untuk mencari ini:

Ini sekarang dapat dilakukan di versi Jenkins yang lebih baru, Anda dapat melakukan sesuatu seperti ini:

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

Generator Sintaks Pipeline menunjukkan ini di tab lanjutan:

Contoh Sintaks Pipeline

Gib
sumber
2

Saya pikir saya akan memposting jawaban lain untuk orang-orang yang mungkin mencari sesuatu yang serupa.

Dalam pekerjaan pembangunan kita, kita memiliki kasus-kasus di mana kita ingin pembangunan dilanjutkan, tetapi ditandai sebagai tidak stabil. Untuk kami ini terkait dengan nomor versi.

Jadi, saya ingin mengatur kondisi pada build dan mengatur build menjadi tidak stabil jika kondisi itu terpenuhi.

Saya menggunakan opsi Langkah bersyarat (tunggal) sebagai langkah pembuatan.

Kemudian saya menggunakan skrip Execute system Groovy sebagai langkah build yang akan berjalan ketika kondisi itu terpenuhi.

Saya menggunakan Perintah Groovy dan mengatur skrip berikut ini

import hudson.model.*

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

return

Sepertinya itu bekerja dengan cukup baik.

Saya menemukan solusinya di sini

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

adprocas
sumber
1

Sebagai alternatif yang lebih ringan dari jawaban yang ada, Anda dapat menyetel hasil build dengan HTTP POST sederhana untuk mengakses REST API konsol skrip 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

Keuntungan:

  • tidak perlu mengunduh dan menjalankan file jar yang besar
  • tidak ada batasan untuk menyetel dan membaca beberapa status global (teks konsol, file di ruang kerja)
  • tidak ada plugin yang diperlukan (selain Groovy)
  • tidak perlu mengonfigurasi langkah build tambahan yang berlebihan dalam kasus PASSED atau FAILURE.

Untuk solusi ini, lingkungan Anda harus memenuhi ketentuan berikut:

  • Jenkins REST API dapat diakses dari slave
  • Slave harus memiliki akses ke kredensial yang memungkinkan untuk mengakses REST API skrip Jenkins Groovy.
Alex O
sumber
0

Salah satu cara mudah untuk menyetel build sebagai tidak stabil adalah di blok "eksekusi shell" Anda, jalankan exit 13

pengguna1415664
sumber
-3

Anda cukup memanggil "exit 1", dan build akan gagal pada saat itu dan tidak dapat dilanjutkan. Saya akhirnya membuat fungsi passthrough make untuk menanganinya untuk saya, dan memanggil safemake alih-alih membuat untuk bangunan:

function safemake {
  make "$@"
  if [ "$?" -ne 0 ]; then
    echo "ERROR: BUILD FAILED"
    exit 1
  else
    echo "BUILD SUCCEEDED"
  fi
}
jessebs
sumber
11
exit 1, sejauh yang saya tahu hanya akan membuat build gagal. Saya tidak ingin build gagal, saya ingin build ditandai tidak stabil.
HNygard
1
Lihat juga stackoverflow.com/questions/36313216/… - solusi sederhananyaif make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi
tripleee