Bagaimana saya bisa memicu pekerjaan lain dari pipeline jenkins (jenkinsfile) dengan GitHub Org Plugin?

156

Bagaimana saya bisa memicu pembangunan pekerjaan lain dari dalam Jenkinsfile?

Saya berasumsi bahwa pekerjaan ini adalah repositori lain di bawah organisasi github yang sama , yang sudah memiliki file Jenkins sendiri.

Saya juga ingin melakukan ini hanya jika nama cabang adalah master, karena tidak masuk akal untuk memicu build hilir dari cabang lokal mana pun.

Memperbarui:

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

Tetap saja, saat dijalankan saya mendapatkan error

Tidak ditemukan pekerjaan berparameter bernama some-downtream-job-name

Saya yakin bahwa pekerjaan ini ada di jenkins dan berada di bawah folder organisasi yang sama dengan yang sekarang. Ini adalah pekerjaan lain yang memiliki pekerjaannya sendiri Jenkinsfile.

Harap diperhatikan bahwa pertanyaan ini khusus untuk GitHub Organization Plugin yang secara otomatis membuat dan memelihara pekerjaan untuk setiap repositori dan cabang dari Organisasi GitHub Anda.

sorin
sumber

Jawaban:

139

Pertama-tama, ini adalah pemborosan slot pelaksana untuk menyelesaikan buildlangkah node. Pelaksana hulu Anda hanya akan duduk diam tanpa alasan.

Kedua, dari proyek multibranch, Anda dapat menggunakan variabel lingkungan BRANCH_NAMEuntuk membuat logika bersyarat pada cabang saat ini.

Ketiga, jobparameter menggunakan nama pekerjaan absolut atau relatif. Jika Anda memberi nama tanpa kualifikasi jalur apa pun, itu akan merujuk ke pekerjaan lain dalam folder yang sama, yang dalam kasus proyek multibranch berarti cabang lain dari repositori yang sama.

Jadi yang Anda maksud mungkin adalah menulis

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}
Jesse Glick
sumber
2
Terima kasih! Jika dengan perubahan apa pun Anda juga tahu tentang cara memicu build ini tanpa menunggu selesai, itu akan sangat luar biasa :)
sorin
50
Periksa Snippet Generator :build job: '../other-repo/master', wait: false
Jesse Glick
3
Apakah ada cara untuk memanggil langkah pembangunan dengan nama cabang dinamis? Sesuatu seperti di build job: '../other-repo/$BRANCH_NAME'mana $BRANCH_NAMEvariabel lingkungan Jenkins yang berkaitan dengan cabang yang menjalankan proyek Multibranch?
msteppe91
3
jika ${BRANCH_NAME}tersedia sebagai variabel lingkungan, substitusi string sederhana akan dilakukan. Pastikan untuk beralih ke "dari 'untuk mengutip string Anda. misalnyabuild job: "../other-repo/${BRANCH_NAME}"
Cinderhaze
5
Tautan API untuk build job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Katie
131

Selain jawaban yang disebutkan di atas: Saya ingin memulai pekerjaan dengan parameter sederhana yang diteruskan ke pipeline kedua dan menemukan jawabannya di http://web.archive.org/web/20160209062101/https://dzone.com/ refcardz / continuous-delivery-with-jenkins-workflow

Jadi saya menggunakan:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
FrankIJ
sumber
11
Pekerjaan pembuatan harus disematkan dalam sebuah langkah (dimulai dengan versi 0.5)
rhoerbe
6
Apakah BUILD_NUMBER tugas Jenkins yang dipanggil oleh buildperintah dikembalikan? Bagaimana cara mengakses BUILD_NUMBER dalam salah satu tahapan berikut? Ada yang tahu di mana perintah itu didokumentasikan?
pengguna909481
5
Sekarang build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")], dari jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży
Tapi bagaimana menggunakan parameter ini diteruskan di pekerjaan kedua
Lembut
2
Yang cukup menarik build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] tidak berhasil bagi saya tetapi: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] bekerja
Alberto C
25

Perintah builddi pipeline ada untuk memicu pekerjaan lain di jenkins.

Contoh di github

Pekerjaan harus ada di Jenkins dan dapat diukur. Adapun cabangnya, saya rasa Anda bisa membacanya dari git

Flo
sumber
3
Saya mencoba menambahkan build job: 'jobnametetapi saya mendapatkan kesalahan ini No parameterized job named jobname founddan saya dapat meyakinkan Anda bahwa ada pekerjaan dengan nama ini di tingkat yang sama di folder organisasi.
sorin
1
Ya, ada pekerjaan, tetapi pekerjaan itu tidak diparameterisasi. Saya mencoba memahami cara membuat parameter pekerjaan yang dibuat oleh plugin organisasi GitHub
yiwen
6
Format nama pekerjaan adalah:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja
2
@SahilAhuja Itu benar-benar sewenang-wenang dan berdasarkan tata letak Jenkins Anda, dan jika Anda ingin menggunakan jalur absolut, Anda harus mulai dengan a /. Jalur relatif baik-baik saja; Masalah sorin mungkin bahwa panggilan pekerjaan buildadalah pekerjaan multibranch, yang berarti jalan seperti jobnameakan mencoba membangun cabang jobnamedari pekerjaan yang sama; itu harus menjadi ../jobname/branchnamegantinya
Michael Mrozek
Ini berfungsi dengan baik tetapi, apa yang terjadi jika cabang yang ditentukan tidak ada?
Jaime Alcántara Arnela
24

Anda dapat menggunakan build joblangkah dari Jenkins Pipeline (Persyaratan Jenkins minimum: 2.130).

Berikut API lengkap untuk buildlangkahnya: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Bagaimana cara menggunakan build:

  • job: Nama tugas downstream yang akan dibuat. Mungkin pekerjaan Pipeline lain, tetapi lebih umum gaya bebas atau proyek lain.
    • Gunakan nama sederhana jika pekerjaan berada di folder yang sama dengan pekerjaan Pipeline upstream ini;
    • Sebagai gantinya, Anda dapat menggunakan jalur relatif seperti../sister-folder/downstream
    • Atau Anda dapat menggunakan jalur absolut seperti/top-level-folder/nested-folder/downstream

Picu pekerjaan lain menggunakan cabang sebagai param

Di perusahaan saya, banyak cabang kami menyertakan "/". Anda harus mengganti setiap "/" dengan "% 2F" (seperti yang muncul di URL pekerjaan).

Dalam contoh ini kami menggunakan jalur relatif

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

Picu pekerjaan lain menggunakan nomor build sebagai parameter

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))
    ]

Memicu banyak pekerjaan secara paralel

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

Info lebih lanjut tentang Paralel di sini: 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)
        }
    }

Atau sebagai alternatif:

    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
                    }
                }
            }
    }
Katie
sumber
3

Gunakan plugin pekerjaan build untuk tugas itu untuk memicu pekerjaan lain dari file jenkins. Anda dapat menambahkan berbagai logika ke eksekusi Anda seperti opsi paralel, node dan agen, serta langkah-langkah untuk memicu pekerjaan eksternal. Saya memberikan beberapa contoh buku masak yang mudah dibaca untuk itu.

1. contoh untuk memicu pekerjaan eksternal dari file jenkins dengan contoh bersyarat:

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

2. contoh memicu banyak pekerjaan dari file jenkins dengan contoh kondisional:

 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')
     ]
    }
}
avivamg.dll
sumber
Tetapi bagaimana menerima dan menggunakan parameter di pekerjaan kedua
Lembut
2
@Lemah lembut. Anda dapat mengakses parameter yang lewat sebagai params.systemname
Pankaj Shinde