GitHub Org Plugin ile bir jenkins boru hattından (jenkinsfile) başka bir işi nasıl tetikleyebilirim?


142

İçinden başka bir işin oluşturulmasını nasıl tetikleyebilirim Jenkinsfile?

Bu işin aynı github organizasyonu altında, zaten kendi Jenkins dosyasına sahip olan başka bir havuz olduğunu varsayıyorum .

Bunu sadece şube adı master ise yapmak istiyorum, çünkü herhangi bir yerel şubenin aşağı akış yapılarını tetiklemek mantıklı değil.

Güncelleme:

stage 'test-downstream'
node {
     def job = build job: 'some-downtream-job-name'
}

Yine de, yürütüldüğünde bir hata alıyorum

Some-downtream-job-name adlı parametrelenmiş iş bulunamadı

Bu işin jenkins'te mevcut olduğundan ve şu ankiyle aynı organizasyon klasörü altında olduğundan eminim. Kendine ait başka bir iş Jenkinsfile.

Bu sorunun, GitHub Kuruluşunuzdan her bir havuz ve şube için otomatik olarak iş oluşturan ve sürdüren GitHub Kuruluş Eklentisine özel olduğunu lütfen unutmayın .

Yanıtlar:


131

Her şeyden önce, buildadımı sarmak için bir yürütücü yuvasının israfıdır node. Memba yöneticiniz sebepsiz yere boşta kalacak.

İkinci olarak, çok şubeli bir projeden, BRANCH_NAMEmantığı geçerli dalda koşullu hale getirmek için ortam değişkenini kullanabilirsiniz .

Üçüncü olarak, jobparametre mutlak veya göreceli bir iş adı alır. Herhangi bir yol kalifikasyonu olmayan bir isim verirseniz, aynı klasördeki başka bir işe atıfta bulunulur, bu da çok şubeli bir proje olması durumunda aynı havuzun başka bir dalı anlamına gelir.

Yani yazmak istediğin şey muhtemelen

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}

2
Teşekkürler! Herhangi bir değişiklikle de bitirmek için beklemeden bu yapıyı nasıl tetikleyeceğinizi biliyorsanız, çift harika olurdu :)
sorin

48
Snippet Jeneratörünü Kontrol Edin :build job: '../other-repo/master', wait: false
Jesse Glick

3
Derleme adımını dinamik bir dal adıyla çağırmanın herhangi bir yolu var mı? Böyle bir şey build job: '../other-repo/$BRANCH_NAME'nerede $BRANCH_NAMEJenkins ortam değişkeni çoklu şube projesini çalışan şube ilişkin nedir?
msteppe91

2
eğer ${BRANCH_NAME}bir ortam değişkeni olarak kullanılabilir, basit dize ikamesi yapacağız. Sadece geçmek için mutlaka "dan 'senin dize alıntı için. ör.build job: "../other-repo/${BRANCH_NAME}"
Cinderhaze

3
API bağlantısı için build job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Katie

123

Yukarıda belirtilen cevaplara ek olarak: İkinci bir boru hattına geçen basit bir parametre ile bir işe başlamak istedim ve cevabı https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow adresinde buldum .

Ben de kullandım:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}

11
Oluşturma işi bir adımda
gömülmelidir

5
buildKomut tarafından çağrılan Jenkins işinin BUILD_NUMBER döndürülüyor mu? BUILD_NUMBER dosyasına aşağıdaki aşamalardan birinde nasıl erişilir? Bu komutun nerede belgelendiğini bilen var mı?
user909481

4
Bu var build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]dan, günümüzde jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży

Ancak bu parametrelerin kullanımı 2. işte geçti
Nazik

2
İlginçtir ki build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] benim için işe yaramadı ama: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] çalıştı
Alberto C

24

buildBoru hattındaki komut , cenkins'teki diğer işleri tetiklemek için var.

Github örneği

İş Jenkins'te mevcut olmalı ve parametrelendirilebilir. Şubeye gelince, sanırım git'ten okuyabilirsiniz


3
Eklemeyi denedim build job: 'jobnameama bu hatayı alıyorum No parameterized job named jobname foundve kuruluş klasöründe aynı adda bir iş olduğunu garanti edebilirim.
sorin

1
Evet, bir iş var, ancak bu iş parametreli değil. GitHub kuruluş eklentisi tarafından oluşturulan bir işi nasıl parametrelendirmeye çalıştığımı anlamaya çalışıyorum
yiwen

6
İş adı formatı:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja

2
@SahilAhuja Bu tamamen keyfi ve Jenkins düzeninize dayanmaktadır ve mutlak bir yol kullanmak istiyorsanız a ile başlamanız gerekir /. Göreli yollar iyidir; sorin'in problemi muhtemelen iş aramasının buildçok şubeli bir iş olmasıydı, yani aynı işin jobnamedalını oluşturmaya çalışacak bir yol anlamına geliyordu jobname; bunun ../jobname/branchnameyerine olması gerekiyor
Michael Mrozek

Bu iyi çalışıyor, ancak belirtilen dal mevcut değilse ne olur?
Jaime Alcántara Arnela

17

Jenkins Pipeline'dan (Minimum Jenkins gereksinimi: 2.130) build jobadımı kullanabilirsiniz .

buildAdım için tam API : https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Nasıl kullanılır build:

  • job: İnşa edilecek bir alt işin adı. Başka bir Pipeline işi olabilir, ancak daha yaygın olarak serbest stil veya başka bir proje olabilir.
    • İş, bu akış yukarı Pipeline işi ile aynı klasördeyse basit bir ad kullanın ;
    • Bunun yerine aşağıdaki gibi göreli yollar kullanabilirsiniz../sister-folder/downstream
    • Veya aşağıdaki gibi mutlak yollar kullanabilirsiniz/top-level-folder/nested-folder/downstream

Şube param olarak kullanarak başka bir işi tetikleme

Şirketimde şubelerimizin birçoğu "/". Herhangi bir "/" örneğini "% 2F" ile değiştirmelisiniz (işin URL'sinde göründüğü gibi).

Bu örnekte göreli yollar kullanıyoruz

    stage('Trigger Branch Build') {
        steps {
            script {
                    echo "Triggering job for branch ${env.BRANCH_NAME}"
                    BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
                    build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
            }
        }
    }

Yapı numarasını param olarak kullanarak başka bir işi tetikle

build job: 'your-job-name', 
    parameters: [
        string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
        string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
    ]

Birçok işi paralel olarak tetikleyin

Kaynak: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/

Paralel hakkında daha fazla bilgi için: https://jenkins.io/doc/book/pipeline/syntax/#parallel

    stage ('Trigger Builds In Parallel') {
        steps {
            // Freestyle build trigger calls a list of jobs
            // Pipeline build() step only calls one job
            // To run all three jobs in parallel, we use "parallel" step
            // https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
            parallel (
                linux: {
                    build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                mac: {
                    build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                windows: {
                    build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                failFast: false)
        }
    }

Veya alternatif olarak:

    stage('Build A and B') {
            failFast true
            parallel {
                stage('Build A') {
                    steps {
                            build job: "/project/A/${env.BRANCH}", wait: true
                    }
                }
                stage('Build B') {
                    steps {
                            build job: "/project/B/${env.BRANCH}", wait: true
                    }
                }
            }
    }

3

Jenkins dosyasındaki diğer işleri tetiklemek için bu görev için derleme işi eklentisi kullanın . Yürütmenize paralel, düğüm ve aracı seçenekleri ve harici işleri tetikleme adımları gibi çeşitli mantık ekleyebilirsiniz. Bunun için okuması kolay bir yemek kitabı örneği verdim.

1. koşullu örnekle jenkins dosyasından harici işi tetiklemek için örnek:

if (env.BRANCH_NAME == 'master') {
  build job:'exactJobName' , parameters:[
    string(name: 'keyNameOfParam1',value: 'valueOfParam1')
    booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
 ]
}

2. koşullu örneklerle jenkins dosyasından birden fazla işi tetikleyen örnek:

 def jobs =[
    'job1Title'{
    if (env.BRANCH_NAME == 'master') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
        booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
     ]
    }
},
    'job2Title'{
    if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam3',value: 'valueOfParam3')
        booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
        booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
     ]
    }
}

Ancak 2. işte parametreleri almak ve kullanmak
Nazik

2
@Gentle. Geçilen parametreye params.systemname olarak erişebilirsiniz
Pankaj Shinde
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.