Jenkins Pipeline işinden vaktinden başarılı bir şekilde çıkmanın en temiz yolu?


55

Beslenen değerlerden biri eski bir değerle eşleşmediği sürece, dosyaları oluşturacak bir işim var. İptal veya işi çıkmak için Jenkins en temiz yolu nedir olmadan o varlık FAILED? Çıkıyor doğru davranış bu yüzden yapı işaretli istiyorum SUCCESS.

Bunun gibi bir if ifadesinde sonuçlanacaktır;

stage ('Check value') {

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

}

Başarılı bir yapı olarak işaretlenmiş bir şekilde tercüme edilemezse, bir hata kodu atmak istemiyorum.


1
Sadece exit 0...
Tensibai

Bunun bir başarısızlık olduğuna işaret ettiğini sanıyordum? Eğer hatalıysam ve belgeleri gösterebilirseniz, bunu bir cevap olarak kabul etmekten memnuniyet duyarım
Alex

Eh, sadece bash scriptleri, 0 çıkışı başarılı demektir, sıfırdan
çıkmazsa

Bu bir bash betiğinde değil, bu boru hattı işinin kendisidir, yani Groovy. Bu bir şeyleri değiştirir mi?
Alex

Groovy'de sadece bir deneyeceğim return 0, tüm groovy kodunun herhangi bir ucunda, bir istisna atmayan, sanırım yapmalıyım. Jenkins 2 hakkında daha fazla geçmişe sahip birisinin onaylamasına ya da
inmesine

Yanıtlar:


46

Anladım. Herhangi bir aşama dışında (aksi takdirde bu sadece belirli bir aşamayı başarı ile bitirir) aşağıdakileri yapın;

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

return sahne veya düğüm üzerinde çalıştırıyorsanız durur ayarlarken hangi neden bir sahne dışında çalışıyor o önemlidir, currentBuild.resultbaşarısız da önlenmiş o.


Sadece geri dönüş, yapıyı grileştirmiş bir durumla terk etmeli ve sonuç olmamalıdır ... bu yüzden başarısız bir yapıyla aynı değil.
17'de drewish

1
Kalan tüm aşamaları nasıl geri döndürür ve atlarsınız?
Jess Bowers,

1
@JessBowers, snippet'i nereye koyduğunuzla ilgilidir. Bunu aşama düzeyinde yapmak yerine düğüm düzeyinde yaparsanız, tüm işi bitirir.
Alex

4
Unutmayın, sadece
kodlanmış

@kagarlickij - Doğru, bildirge boru hatları bu cevap yazıldığında yoktu!
Alex,

10

Geçerli aşamadan çıkmak için hatayı da kullanabilirsiniz, o zaman geçerli aşama hiyerarşisini ve benzer şeyleri dikkate almanız gerekmez:

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
}

Ancak, hata bir aşamada meydana gelirse, bu kırmızı bir aşamaya yol açar.

görüntü tanımını buraya girin

Bu, kullanmak istediğiniz şekilde gereksinimlerinize bağlıdır.


Bu şekilde yapacaksanız, RuntimeExceptiontüm istisnaları yakalamak ve bir bayrağa bakmak yerine atmak için yeni bir alt sınıf oluşturun
Michael Mrozek

1

Dürüst olmak gerekirse, özellikle exit komutunu kullanmamanız gerekir, ancak aynı son sonucu (çalışmayan kod) elde edebilecek bir Koşullu BuildStep Eklentisi vardır.

Buna henüz karşılaşmadım, bu yüzden eklentiyi kullanmadım.

Ayrıca, Jenkins'in önceki İstif Taşması yazısında bulunan şartlandırmalar da var: Jenkins Pipeline Koşullu Adım / Aşama


1
Cevabınız geçerli gibi görünse de (başka bir geçici çözüm bulduğumdan beri canlı olarak kontrol etmedim), bence "Dürüst olmak gerekirse çıkmamalısın" diye başlamak için iyi bir yol değil; açıkça bu yöntemlerin varlığı bazen çıkmak için gerekli olduğu anlamına gelir.
Alex

Ne öneriyorsun? Bitiş ifadesine mi gidiyorsunuz? "Genellikle" niteleyicisini ekleme "Geri bildirim" verdiniz, ancak niyetini veya eylemini söylemek benim için kolay değil, lütfen daha az dikkatli olun.
MrMesees

Biraz bekle. Bu senin sorunun mu Öyleyse, TBH'den çıkmak istemediğinizi duymak istemezsiniz, ancak önerdiğim yöntemlerden hiçbiri çıkmaz, kod çalıştırmayı engellerler ... Konumumu doğrudan destekliyorlar.
MrMesees

1
Ahh, bence ifadenizi "işi bitirmek için kötü bir şey yapmak" yerine "edebi exitkomut kullanmamalısınız" yerine yanlış yorumladığımı düşünüyorum .
Alex,

3
Daha açık bir şekilde
anlatmaya

0

Executor.interrupt(Result)Yöntem ben erken bir yapı durdurmak için bulabildiğim en temiz, en doğrudan yoludur ve bir başarı olarak işaretleyin.

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

Artıları :

  • Betikli bir boru hattında olduğu gibi komut dosyasıyla da çalışır.
  • Ele almayı denemek / yakalamak veya istisnalar yok.
  • Arayan aşamayı ve herhangi bir ardışık aşamayı, kullanıcı arabiriminde yeşil / geçişli olarak işaretler.

Eksileri :

  • Güvensiz olarak kabul edilenler de dahil olmak üzere bir dizi işlem içi komut dosyası onayı gerektirir . Onaylayın ve dikkatli kullanın.

Benim için işe yaramıyor - ardışık aşamalar yürütülüyor.
asukasz K
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.