Cara terbersih untuk keluar dari pekerjaan Jenkins Pipeline sebelum waktunya secara sukses?

56

Saya memiliki pekerjaan yang akan membuat file, kecuali salah satu nilai yang diumpankan itu cocok dengan nilai yang lebih lama. Apa cara terbersih di Jenkins untuk membatalkan atau keluar dari pekerjaan, tanpa itu FAILED? Keluar adalah perilaku yang benar jadi saya ingin build ditandai SUCCESS.

Itu akan berakhir dalam pernyataan if seperti itu;

stage ('Check value') {

     if( $VALUE1 == $VALUE2 ) {
       //if they do match exit as a success, else continue with the rest of the job 
    }

}

Saya tidak ingin membuang kode kesalahan kecuali jika entah bagaimana bisa menerjemahkannya menjadi ditandai membangun yang berhasil.

Alex
sumber
1
Hanya exit 0...
Tensibai
Saya pikir itu menandai pekerjaan itu gagal? Jika saya salah dan Anda dapat menunjukkan dokumentasi, saya akan dengan senang hati menerima itu sebagai jawaban
Alex
Yah, cukup bash script, keluar 0 berarti berhasil, keluar bukan nol berarti kegagalan ...
Tensibai
Ini bukan dalam skrip bash, ini adalah pekerjaan pipa itu sendiri, begitu Groovy. Apakah itu mengubah banyak hal?
Alex
Dalam groovy saya baru saja mencoba return 0, semua dalam semua ujung kode groovy yang tidak membuang pengecualian harus saya pikir. Saya akan memberi tahu seseorang dengan latar belakang jenkins 2 lebih lanjut untuk mengkonfirmasi atau lemah
Tensibai

Jawaban:

47

Menemukannya. Di luar tahapan apa pun (jika tidak, ini hanya akan mengakhiri tahap tertentu sebagai keberhasilan) lakukan hal berikut;

if( $VALUE1 == $VALUE2 ) {
   currentBuild.result = 'SUCCESS'
   return
}

return akan menghentikan tahap atau simpul yang Anda jalankan yang mengapa menjalankannya di luar tahap itu penting, sementara mengatur currentBuild.resultmencegahnya gagal.

Alex
sumber
baru kembali harus meninggalkan bangunan dengan status berwarna abu-abu dan tidak ada hasil ... jadi tidak sama dengan bangunan yang gagal.
drewish
1
Bagaimana Anda kembali dan melewati semua tahapan yang tersisa?
Jess Bowers
1
@JessBowers semuanya tentang tempat Anda meletakkan cuplikan. Jika Anda melakukannya tingkat-simpul daripada tingkat-tingkat itu akan menyelesaikan seluruh pekerjaan.
Alex
4
Harap dicatat bahwa ini hanya berfungsi untuk pipeline scripted, bukan untuk deklaratif
kagarlickij
@kagarlickij - Benar, saluran pipa deklaratif tidak ada ketika jawaban ini ditulis!
Alex
11

Anda juga dapat menggunakan kesalahan untuk keluar dari tahap saat ini, maka Anda tidak perlu mempertimbangkan hierarki tahap saat ini dan hal-hal serupa:

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'SUCCESS'
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

Tetapi ini akan mengarah ke tahap merah, jika kesalahan terjadi dalam suatu tahap.

masukkan deskripsi gambar di sini

Itu tergantung pada kebutuhan Anda, ke arah mana Anda ingin menggunakannya.

CSchulz
sumber
Jika Anda akan melakukannya dengan cara ini, buatlah subclass baru RuntimeExceptionuntuk melempar alih-alih perlu menangkap semua pengecualian dan periksa bendera
Michael Mrozek
1

Jujur Anda tidak perlu menggunakan perintah keluar secara khusus, tetapi ada Plugin BuildStep Bersyarat yang dapat mencapai hasil akhir yang sama (kode yang tidak berjalan).

Saya belum menemukan ini, jadi belum menggunakan plugin.

Ada juga kondisional seperti yang ditemukan dalam posting Stack Overflow sebelumnya di Jenkins: Jenkins Pipeline Conditional Step / Stage

MrMesees
sumber
1
Meskipun jawaban Anda tampaknya valid (belum memeriksa secara langsung sejak saya menemukan solusi lain), saya tidak berpikir "Jujur Anda tidak boleh keluar" adalah cara yang baik untuk memulainya; jelas keberadaan metode ini berarti kadang-kadang diperlukan untuk keluar.
Alex
Apa yang kamu sarankan? Pindah ke pernyataan akhir? Menambahkan kualifikasi "secara umum"? Anda telah memberikan "umpan balik" tetapi tidak mudah bagi saya untuk memberi tahu maksud atau tindakan itu, harap tidak terlalu singkat.
MrMesees
Tunggu sebentar. Apakah ini pertanyaan Anda? Jika ya, TBH yang tidak ingin Anda dengar tidak boleh keluar, tetapi metode yang saya sarankan tidak menyediakannya, mereka menghindari kode yang berjalan ... Langsung mendukung posisi saya.
MrMesees
1
Ahh begitu, saya pikir saya salah mengartikan pernyataan Anda sebagai "melakukan sesuatu untuk mengakhiri pekerjaan itu buruk" daripada "Anda seharusnya tidak menggunakan exitperintah literal " - jika demikian saya minta maaf, itu kesalahpahaman saya.
Alex
3
Saya sudah mencoba membuatnya lebih jelas, tidak perlu meminta maaf sama sekali, bahasa adalah binatang yang berubah-ubah, terutama di internet :)
MrMesees
0

The Executor.interrupt(Result)metode adalah terbersih, cara yang paling langsung saya bisa menemukan untuk berhenti membangun prematur dan menandainya sebagai sukses.

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
}

Pro :

  • Berfungsi dalam pipeline deklaratif sama halnya dengan script.
  • Tidak ada coba / tangkap atau pengecualian untuk menangani.
  • Menandai tahap panggilan dan setiap tahap berurutan sebagai hijau / lewat di UI.

Cons :

  • Membutuhkan sejumlah persetujuan skrip dalam proses, termasuk yang dianggap tidak aman . Setujui dan gunakan dengan hati-hati.
Ben Amos
sumber
Bagi saya itu tidak berhasil - tahap berturut-turut sedang dieksekusi.
Łukasz K