Kabuk betikleri çalıştırılırken Jenkins'te bir derleme kararsız olarak nasıl işaretlenir


93

Üzerinde çalıştığım bir projede, farklı görevleri yürütmek için kabuk betikleri kullanıyoruz. Bazıları rsync çalıştıran sh / bash betikleri, bazıları ise PHP betikleri. PHP betiklerinden biri JUnit XML'e çıktı veren bazı entegrasyon testleri, kod kapsamı raporları ve benzerleri çalıştırıyor.

Jenkins, çıkış durumuna göre işleri başarılı / başarısız olarak işaretleyebilir . In PHP, 1 ile komut çıkış o testleri çalışması sırasında başarısız olduğunu tespit edip etmediğini. Diğer kabuk komut dosyaları komutları çalıştırır ve bir yapıyı başarısız olarak işaretlemek için bunlardan çıkış kodlarını kullanır.

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

Gelen Jenkins terminoloji , kararsız bir yapı olarak tanımlanır:

Başarılı bir şekilde oluşturulmuşsa ve bir veya daha fazla yayıncı kararsız olduğunu bildirdiyse, yapı kararsızdır. Örneğin, JUnit yayımcısı yapılandırılırsa ve bir test başarısız olursa, yapı kararsız olarak işaretlenir.

Kabuk betikleri çalıştırırken Jenkins'in bir yapıyı yalnızca başarılı / başarısız yerine kararsız olarak işaretlemesini nasıl sağlayabilirim?


Farklı iş adımlarını çalıştırarak ve jenkins eklentilerini kullanarak stackoverflow.com/questions/25442343/…
fantastory

Yanıtlar:


58

Metin bulucu eklentisini kullanın .

Durum 1 ile çıkmak yerine (derleme başarısız olur), şunları yapın:

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

Oluşturma sonrası eylemlerde Metin Bulucuyu etkinleştirdikten sonra, normal ifadeyi yazdırdığınız mesajla eşleşecek şekilde ayarlayın ( TESTS FAILED!) ve bu girişin altındaki "Kararsız" onay kutusunu işaretleyin.


2
Eklenti yüklemeden bir seçenek için aşağıdaki cevaba bakın, çünkü jenkins 2.26 sürümü: stackoverflow.com/a/49676269/1347649
JSoet

63

Modern Jenkins sürümleri (2.26 Ekim 2016'dan beri) bunu çözdü: Bu, Execute kabuk oluşturma adımı için yalnızca gelişmiş bir seçenek!

derleme için çıkış kodu

Sadece gelişigüzel bir çıkış değeri seçebilir ve ayarlayabilirsiniz; eşleşirse, yapı kararsız olacaktır. Yapınızdaki gerçek bir süreç tarafından başlatılması olası olmayan bir değer seçin.


Herhangi bir ek eklenti yüklemenizi gerektirmediği için bu seçeneği seviyorum
mattherman

2
Bu en son Jenkins'te uygulandığından - bu kabul edilmiş bir cevap olmalı
smoke_lp

3
"Modern Jenkins sürümleri", Jenkins 2.26 veya daha yenisi anlamına gelir. Bkz issues.jenkins-ci.org/browse/JENKINS-23786 .
Blue

5
A'da shadım komutunu kullanırken bunu kod aracılığıyla belirtmek mümkün müdür Jenkinsfile? Ayar GUI'de nerede bulunur? Onu bulamıyorum.
bluenote10

1
Bunu ortaya çıkarmak için oluşturma adımının altındaki "Gelişmiş ..." düğmesini tıklamam gerekti. Tek bir seçeneği (ve özellikle gelişmiş olmayan) bir "bir şeyler yapmak için burayı tıklayın" daraltıcısının arkasına gizlemek pek kullanışlı değil, ama bu böyle.
üçlü

57

Sihirli dizeler yazdırmadan ve TextFinder kullanılmadan yapılabilir. İşte bununla ilgili bazı bilgiler.

Temel olarak , kabuk komut dosyalarında bulunan http: // sunucunuz.com / cli adresindeki bir .jar dosyasına ihtiyacınız var , ardından bir yapıyı kararsız olarak işaretlemek için aşağıdaki komutu kullanabilirsiniz:

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

Yapıyı kararsız olarak hata durumunda işaretlemek için şunları kullanabilirsiniz:

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

Sorun jenkins-cli.jar'ın kabuk betiğinden erişilebilir olması gerektiğidir. Erişimi kolay bir yola koyabilir veya işin kabuk betiği aracılığıyla indirebilirsiniz:

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

2
Bu çözümü gerçekten çok beğendim, rak dosyalarımda kolay yeniden kullanım için bunun için bir yakut sınıfı uyguladım. :)
Shire

3
+1 - bu, kabul edilen yanıttan daha iyi bir çözümdür çünkü Metin Bulucu iş başına yalnızca bir dize arayabilir, böylece yapı durumunu yalnızca iki değerden birine ayarlayabilirsiniz.
gareth_bowles

4
İlginç çözüm. Ancak Jenkins'iniz kimlik doğrulaması gerektiriyorsa, yapılandırmasında ortak anahtar kimlik doğrulaması ayarlamanız gerekir, aksi takdirde herhangi bir jenkins-cli komutu AccessDeniedException ile başarısız olur.
Tom De Leu

2
Ana bilgisayara web erişimi olmayan bir köle kullanıyorsanız bu işe yaramaz. Örneğin, Jenkins bağımlı birimi sunucuya bir HTTP veya HTTPS bağlantısı oluşturamazsa.
Steve HHH

3
Bu çözümü kullanmak istedi, ancak set-build-resultönerilmemektedir olmuştur jenkins-cli.
DrLime2k10

28

Derleme betiğinizi sarmak için Jenkinsfile kullanmalı ve basitçe mevcut yapıyı UNSTABLE olarak işaretlemelisiniz currentBuild.result = "UNSTABLE".

   sahne {
      status = / * inşa komutunuz buraya gelecek * /
      eğer (durum === "KARARSIZ OLARAK İŞARETLE") {
        currentBuild.result = "KARARSIZ"
      }
   }

3
Neden bu yanıtın daha fazla olumlu oyu yok? Bunda bir sorun mu var ("sihirli" dizenin kullanımı dışında UNSTABLE)? Diğer cevaplardan daha basit görünüyor.
Kevin

2
Soru, serbest stil işleri soruyordu, bu cevap ise Boru Hattı işleri hakkındaydı. Pipeline yanıtı serbest stil işleri için geçerli değil
Mark Waite

Bu nasıl çalışıyor? Bir hata alıyorum: Expected one of "steps", "stages", or "parallel" for stagecurrentBuild.result'u doğrudan bir sahne içinde ayarlamaya çalıştığımda.
dokaspar


6

İş betiğimde aşağıdaki ifadeler var (bu iş yalnızca Jenkins ana bilgisayarında çalışır):

# 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

Bunu ve derleme durumlarını belirleme hakkında daha fazla bilgiyi Jenkins wiki'de görebilirsiniz: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI


4
  1. Xml junit raporu üretmek için PHP derlemesini yapılandırın

    <phpunit bootstrap="tests/bootstrap.php" colors="true" >
       <logging>
           <log type="junit" target="build/junit.xml" 
               logIncompleteSkipped="false" title="Test Results"/>
       </logging>
    
       ....
    
     </phpunit>
    
  2. 0 durumuyla komut dosyası oluşturmayı tamamlayın

    ...
    exit 0;
    
  3. Derleme sonrası eylem ekle Test raporu XML'leri için JUnit test sonucu raporu yayınlayın . Bu eklenti, test başarısız olduğunda Kararlı yapıyı Kararsız olarak değiştirecektir.

    **/build/junit.xml
    
  4. Konsol çıktı taraması ve işaretlenmemiş seçeneklerle Jenkins Metin Bulucu eklentisi ekleyin . Bu eklenti, önemli bir hata nedeniyle tüm derlemede başarısız oldu.

    PHP Fatal error:
    

3

Bunu yapmanın en esnek yolunu, harika post build eklentisindeki bir dosyayı okumaktır. görüntü açıklamasını buraya girin

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

Dosya içeriği 'true' ise, yapı kararsız olarak ayarlanacaktır. Bu, yerel ana bilgisayarda ve işi çalıştırdığınız herhangi bir ikincil bilgisayarda ve diske yazabilen her tür komut dosyası için çalışır.


Bunun gerçekten "çalışma alanında build.properties adlı bir dosya varsa" kararsız olarak işaretlendiğini varsayıyorum. bu doğru mu? Groovy'de yeniyim, bu açıklamayı biraz daha kırabilir misin?
uchuugaka

@uchuugaka evet, bir dosya varsa ve bu içeriğe sahipse. Dosya adı ve içeriği keyfidir. Davanıza uyan her şeyi kullanın.
jeremyjjbrown

Teşekkürler! çok yararlı. Groovy Postbuild oldukça dolaylıdır ve Groovy Java'dan bu kadar çok şey emer ve daha fazlasını ekler ... bu benim için yeni bir numara.
uchuugaka

@uchuugaka Bunun groovy ile ilgili bir sorun olduğunu sanmıyorum :)
jeremyjjbrown

Hiç sorun değil. Sadece eğilmek için bir meydan okuma!
uchuugaka

2

TextFinder yalnızca iş durumu BAŞARILI iken BAŞARISIZ veya DURDURULDU olarak değiştirilmediyse işe yarar. Bu tür durumlarda, PostBuild adımında harika bir komut dosyası kullanın:

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

Bununla ilgili yazdığım bir gönderide daha fazla ayrıntı görün: http://www.tikalk.com/devops/JenkinsJobStatusChange/


2

Cevabımı buradan tekrar ediyorum çünkü bunu aramak için biraz zaman harcadım:

Bu artık Jenkins'in daha yeni sürümlerinde mümkün, bunun gibi bir şey yapabilirsiniz:

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

Ardışık Düzen Sözdizimi oluşturucu, bunu gelişmiş sekmede gösterir:

Ardışık Düzen Sözdizimi Örneği


2

Benzer bir şey arayan insanlar için başka bir cevap göndereceğimi düşündüm.

Yapım işimizde, yapının devam etmesini istediğimiz, ancak istikrarsız olarak işaretlenmesini istediğimiz durumlar var. Bizim için sürüm numaralarıyla ilgili.

Bu yüzden, yapıda bir koşul belirlemek ve bu koşul karşılanırsa yapıyı kararsız olarak ayarlamak istedim.

Kullandığım Koşullu adım (tek) bir yapı adımı olarak seçeneği.

Sonra Execute system Groovy betiğini , bu koşul karşılandığında çalışacak derleme adımı olarak kullandım.

Groovy Command'ı kullandım ve komut dosyasını aşağıdaki gibi ayarladım

import hudson.model.*

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

return

Bu oldukça iyi çalışıyor gibi görünüyor.

Burada çözüme rastladım

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


1

Mevcut yanıtlara daha hafif bir alternatif olarak , Groovy komut dosyası konsolu REST API'sine erişmek için derleme sonucunu basit bir HTTP POST ile ayarlayabilirsiniz :

    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

Avantajlar:

  • büyük bir jar dosyasını indirip çalıştırmaya gerek yok
  • Bazı genel durumların ayarlanması ve okunması için kludaj yok (konsol metni, çalışma alanındaki dosyalar)
  • eklenti gerekmez (Groovy dışında)
  • BAŞARILI veya BAŞARISIZ durumlarında gereksiz olan fazladan bir oluşturma adımı yapılandırmaya gerek yoktur.

Bu çözüm için ortamınızın şu koşulları karşılaması gerekir:

  • Jenkins REST API'ye slave'den erişilebilir
  • Slave, Jenkins Groovy komut dosyası REST API'sine erişime izin veren kimlik bilgilerine erişime sahip olmalıdır.

0

Bir yapıyı kararsız olarak ayarlamanın kolay bir yolu, "kabuğu çalıştır" bloğunuzdadır. exit 13


-3

"Çıkış 1" i çağırabilirsiniz ve yapı o noktada başarısız olur ve devam etmez. Bunu benim için halletmek için bir geçiş yapma işlevi yapmaya başladım ve bina yapmak yerine güvenli yapma işlevini çağırdım:

function safemake {
  make "$@"
  if [ "$?" -ne 0 ]; then
    echo "ERROR: BUILD FAILED"
    exit 1
  else
    echo "BUILD SUCCEEDED"
  fi
}

11
Çıkış 1, bildiğim kadarıyla sadece yapının başarısız olmasına neden olacak. Yapının başarısız olmasını istemiyorum, kararsız olarak işaretlenmesini istiyorum.
HNygard

1
Ayrıca bkz. Stackoverflow.com/questions/36313216/… - basit çözüm sadeceif make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi
üçlü
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.