yürütme kabuğu başarısız olursa jenkins derlemesinde başarısız olma


132

Derleme sürecimin bir parçası olarak, kabuk yürütme adımı olarak bir git commit çalıştırıyorum. Bununla birlikte, çalışma alanında herhangi bir değişiklik yoksa, Jenkins derlemede başarısız oluyor. Bunun nedeni, git'in kesinleştirilecek değişiklik olmadığında bir hata kodu döndürmesidir. Ya yapıyı iptal etmek isterim ya da durum buysa kararsız olarak işaretlemek isterim. Herhangi bir fikir?


Taahhüt edilecek bir şey olup olmadığını kontrol edin ve yalnızca bu durumlarda taahhüt edin? stackoverflow.com/questions/5139290/…
Anders Lindahl

Yanıtlar:


211

Komut başarısız olduğunda daha fazla yürütmeyi durdurmak için :

command || exit 0

Komut başarısız olduğunda yürütmeye devam etmek için :

command || true


12
|| exit 0İlk durumda ihtiyacınız yoktur , eğer commandyanlış dönerse yürütme durur. Bununla birlikte, ikinci seçenek çok yararlıdır!
Nir Alfasi

20
@alfasin Sorunu anlamıyorsun. OP, Jenkins yapısının başarısız olmasını istemez; ergo yapmalıyız exit 0çünkü sıfır olmayan herhangi bir çıkış kodu yapıda başarısız olur.
Quolonel Soruları

1
Görüyorum ki, bu durumda şu ifadeyi değiştirirdim: "Komut başarısız olduğunda daha fazla yürütmeyi durdurmak için:": "Komut başarısız olduğunda daha fazla yürütmeyi durdurmak ve Jenkins işini başarılı olarak işaretlemek için:".
Nir Alfasi

1
@alfasin Quolonel Questions hızlı açıklamasının profesyonelce olmadığını kabul etsem de, söylediklerinde haklıydı. "çıkış 0" işi başarılı olarak İŞARETLEMEYECEKTİR. Sadece mevcut derleme adımını başarılı olarak işaretleyecektir. İş, sonraki derleme adımlarından birinde hala başarısız olabilir.
noamik

1
Teşekkürler bu işe yaradı! Bu, hata durumunda başarısız olmamak için / bin / bash + e'yi kullanamayacağınızdan, "ssh kullanarak uzak ana bilgisayarda kabuk çalıştır" özelliği için özellikle yararlıdır. Ayrıca hangi komutların derlemede başarısız olmayacağını seçme fikrini de seviyorum.
leeman24

80

Jenkins, /bin/sh -xevarsayılan olarak kullanarak kabuk oluşturma adımlarını yürütüyor . -xçalıştırılan her komutu yazdırmak anlamına gelir. -ekomut dosyasındaki komutlardan herhangi biri başarısız olursa başarısızlıkla çıkmak anlamına gelir.

Sanırım sizin durumunuzda olan, git komutunun 1 ile çıkışınızdır ve varsayılan -eparametre nedeniyle , kabuk 0 olmayan çıkış kodunu alır, betiğin geri kalanını yok sayar ve adımı bir başarısızlık olarak işaretler. Oluşturma adımı komut dosyanızı buraya gönderebilirseniz bunu onaylayabiliriz.

Eğer durum buysa, #!/bin/shbetiğin seçenek olmadan çalıştırılması için koymayı deneyebilirsiniz ; veya set +ebu davranışı geçersiz kılmak için derleme adımının üstüne bir veya benzer bir şey yapın.


Düzenlendi: Unutulmaması gereken bir diğer nokta da, kabuk betiğinizdeki son komut 0 olmayan kod döndürürse , bu kurulumla bile tüm oluşturma adımının hala başarısız olarak işaretleneceğidir. Bu durumda, echobundan kaçınmak için sonuna bir komut koyabilirsiniz .

İlgili başka bir soru


41

Git itmek için hiçbir şey yoksa çıkış durumu 1 döndürür. Kabuk oluşturma adımını çalıştır, sırasıyla başarısız olarak işaretlenir. OR ifadesini kullanabilirsiniz || (çift boru).

git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'

Bu, ilk başarısız olursa ikinci bağımsız değişkeni yürütmek anlamına gelir (çıkış durumu> 0 döndürüldü). İkinci komut her zaman 0 döndürür. Basılacak bir şey olmadığında (çıkış durumu 1 -> ikinci komutu çalıştır) yankı 0 döndürür ve oluşturma adımı devam eder.

Derlemeyi kararsız olarak işaretlemek için, derleme sonrası Jenkins Text Finder adımını kullanabilirsiniz. Konsol çıktısından geçebilir, kalıbı eşleştirebilir (yankınız) ve yapıyı kararsız olarak işaretleyebilir.


27

Jenkins'e başarısız olmamasını söylemenin başka bir yumuşak yolu var. Kaydetmenizi bir derleme adımında izole edebilir ve kabuğu başarısız olmayacak şekilde ayarlayabilirsiniz:

set +e
git commit -m "Bla."
set -e

2
set -eÇıkış kodundan bağımsız olarak çalıştırmak istediğiniz komutun arkasına eklediğinizden emin olun . Aksi takdirde, istemediğiniz komutları çalıştırabilirsiniz. Hatayı kendim halletmek istedim, bu yüzden şöyle bir şey yaptım: `set + e commit -m" bla "EXIT_CODE =" $ {?} "Set -e # handle çıkış kodu
mantığı`

8

Jenkins, bir adımın başarısını / başarısızlığını adımın dönüş değerine göre belirler. Bir kabuk durumunda, son değerin dönüşü olmalıdır. Hem Windows CMD hem de (POSIX) Bash kabukları için, exit 0son komut olarak kullanarak dönüş değerini manuel olarak ayarlayabilmelisiniz .


bu 2 satırı olan bir 'windows bat çalıştır' için işe yaramıyor gibi görünüyor: git commit -m "mesaj" çıkış 0
Ben

@Ben exit 0Windows Jenkins kurulumumda birden fazla derlemede "windows batch komutunu çalıştır" ile birlikte kullanıyorum ve beklendiği gibi çalışıyor. Başka bir şeyler oluyor olmalı. Konsol günlüğünün ilgili bölümünü gönderebilir misiniz?
jwerny

ilk adımınızda git commit -m "blah" ile mi kullanıyorsunuz? Makinede elle bir bat betiği oluşturmayı denedim ve git komutundan sonra bir yankı ve bir çıkış 0 koydum. İşlenecek hiçbir şey olmadığında diğer komutların hiçbiri çalıştırılmaz ...
Ben

@Xiawei'nin cevabına bakın. Jenkins'in varsayılan davranışı, #!/bin/sh -xvherhangi bir hata ile karşılaşıldığında betiğin durdurulmasıyla sonuçlanan bir kabuğu yürütmektir .
Steven the Easyily Amused

8

Burada bulunan cevabı kullanarak bunu çalıştırmayı başardım:

Hata olmadan hiçbir şey kaydetmeme

git diff --quiet --exit-code --cached || git commit -m 'bla'

1
Yukarıdakilerin yaptığı şey şudur: " git diffKomut verin ve bu başarısız olursa, git commitkomut verin. Temelde, yalnızca commit yapacak , eğer git diffişlenecek bir şey bulursa yapar. Ancak @jwerny cevabı doğruydu exit 0ve son ifade olarak ekleyebilmelisiniz Jenkins'in başarılı olarak değerlendirmesini sağlayacak herhangi bir betiğe ... Linux kabuk adımı yapıyor olsaydınız bunun başarısız olacağı bir senaryo düşünebilirim, ancak Batch'te bu her zaman işe
yaramalı

@Ben Jenkins, burada (ortada) /bin/sh -xebelirtildiği gibi varsayılan olarak kabuk oluşturma adımlarını yürütüyor . Böylece , bu davranışı geçersiz kılmak için derleme adımının üstüne bir tane koymayı deneyebilir veya yapabilirsiniz , bu adımın geri kalanını 0 olmayan bir kodla çıkış içindeki bir komut bile devam ettirecektir#!/bin/bashset +e
Xiawei Zhang

8

Başlıktaki (daha genel) soruda - Jenkins'in başarısız olmasını önlemek için çıkış kodu 1'i görmesini engelleyebilirsiniz. Ping için örnek:

bash -c "ping 1.2.3.9999 -c 1; exit 0"

Ve şimdi örneğin ping çıktısını alabilirsiniz:

output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`

Tabii ki yerine ping ...herhangi bir komutu kullanabilirsiniz - dahil git commit.



6

Sen kullanabilirsiniz Metin bulucu Eklentisi . Seçtiğiniz bir ifade için çıktı konsolunu kontrol etmenize ve ardından yapıyı olarak işaretlemenize olanak tanır Unstable.


bu umut verici görünüyordu, ancak bir nedenden dolayı yapıda başarısız olmaya devam etti.
Ben

4

Birden fazla kabuk komutu için, şunları ekleyerek hataları göz ardı ediyorum:

set +e commands true

görüntü açıklamasını buraya girin


Genel olarak rahatsız etmekten vazgeçiriyorum. Belirli bir komutun dönüş değerini göz ardı etmek istiyorsanız, "|| true" veya daha anlamlı olan true değerini döndüren bir şey ekleyebilirsiniz, örneğin: stop-service.sh || echo Service çoktan
kesildi

3

Bu komutları kabuk bloğuna koyarsanız:

false
true

yapınız başarısız olarak işaretlenecektir (en az 1 sıfır olmayan çıkış kodu), bu nedenle yok saymak için (set + e) ​​ekleyebilirsiniz:

set +e
false
true

başarısız olmayacak. Ancak, (set + e) ​​yerinde olsa bile bu başarısız olacaktır:

set +e
false

çünkü son kabuk komutu 0 ile çıkmalıdır.


2

Aşağıdaki , yalnızca değişiklik olması durumunda taahhüt ederek civa için çalışır . Bu nedenle yapı yalnızca commit başarısız olursa başarısız olur.

hg id | grep "+" || exit 0
hg commit -m "scheduled commit"

0

Bazı ipuçlarını içeren başka bir cevap, biri için yararlı olabilir:

Komutlarınızı aşağıdaki kuralla ayırmayı unutmayın :

command1 && command2 - sadece command1 başarılı olursa command2'nin çalıştırılacağı anlamına gelir

command1 ; command2 - komut 1'in sonucuna rağmen komut 2'nin yürütüleceği anlamına gelir

Örneğin:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test ;set -e;echo 0 ", returnStdout: true).trim()
println run_tests 

aşağıdaki kod alınırken başarısız olursa (testleriniz başarısız oldu) set -eve echo 0komutlarıyla başarıyla yürütülecektir gmake test:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test && set -e && echo 0 ", returnStdout: true).trim()
println run_tests 

biraz yanlış ve komutlar set -eve echo 0in ifadesi && gmake test && set -e && echo 0atlanacak println run_tests, çünkü başarısızlık gmake testjenkins yapısını iptal edecektir. Geçici çözüm olarak returnStatus:trueöğesine geçebilirsiniz , ancak daha sonra komutunuzun çıktısını kaçıracaksınız.


0

Bu cevap doğrudur, ancak kabuk komutunu belirtmez || exit 0veya komutun içine|| true girer . İşte daha eksiksiz bir örnek:

sh "adb uninstall com.example.app || true"

Yukarıdakiler işe yarayacak, ancak aşağıdakiler başarısız olacaktır:

sh "adb uninstall com.example.app" || true

Belki başkaları için açıktır, ancak bunu fark etmeden önce çok zaman harcadım.

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.