Bagaimana cara membangun pipa Jenkins paralel yang kompleks?

17

Saya telah tertarik untuk mengubah integrasi Jenkins kami yang dipesan lebih dahulu menjadi pipa. Namun, sepertinya saya tidak tahu bagaimana melakukannya.

Adakah yang bisa membantu saya dengan skrip Jenkins yang dapat melakukan hal berikut?

1---2---3-----------9---10
    |           |
    |---4-------|
    |           |
    |---5---6---|
        |       |
        |---7---|

1: Start pipeline
10: End pipeline
5: Build some files
   * needed by 6, 7,
   * needed as artifacts at the end
2, 3, 4, 6, 7: Have jUnit result files, should be available at end of
   test (somewhere), even if one failed

Apakah ini mungkin? Atau haruskah saya bergabung setelah 3, 4, 5? Seperti ini:

1---2---3-------6-------9---10
    |       |   |   |
    |---4---|   7---|
    |       |
    |---5---|
Bert Goethals
sumber
1
Saya akan memilih opsi kedua, terdengar lebih kecil kemungkinannya untuk pecah dan lebih mudah diperpanjang jika perlu.
Tensibai
2
mungkin padat, tetapi saya belum mengerti apa yang ditambahkan versi yang lebih kompleks. dapatkah Anda mendokumentasikan apa yang "9" lakukan dan bergantung pada apa? tidak ada 8, jika Anda ingin merevisi dan menambahkannya. :)
burnettk
1
@BertGoethals Anda dapat menggunakan Pipeline dan masih memiliki pekerjaan yang berbeda. Mungkin saja saya melewatkan sesuatu di sini.
avi
1
Saya mencoba melakukan sesuatu yang serupa beberapa hari yang lalu. Saya bisa membuatnya bekerja dengan parallelperintah bersarang , tetapi alirannya tidak terlihat benar di BlueOcean.
lawnmowerlatte
1
@BertGoethals Tidak bisakah Anda memulai pipa lain dengan melakukan 5 dan kemudian 6 dan 7 dari pipa utama Anda?
Tensibai

Jawaban:

9

Berdasarkan komentar untuk pertanyaan saya, dan beberapa pengujian dasar berikut ini sepertinya berfungsi:

Bert Goethals
sumber
4

Saya memiliki situasi serupa di mana saya ingin membuat sarang pekerjaan paralel lainnya di dalam paralel lainnya. Kode ini berfungsi untuk saya:

def performDeploymentStages(String node, String app) {
    stage("build") {
        echo "Building the app [${app}] on node [${node}]"
    }
    stage("deploy") {
        echo "Deploying the app ${app}] on node [${node}]"
    }
    stage("test") {
        echo "Testing the app [${app}] on node [${node}]"
    }
}

pipeline {
    agent {
        label 'master'
    }
    parameters {
        string(name: 'NODES', defaultValue: '1,2,3', description: 'Nodes to build, deploy and test')
        choice(name: 'ENV', choices: 'qa', description: 'Environment')
        string(name: 'APPS', defaultValue: 'app01,app02', description: 'App names')
    }

    stages {
        stage('parallel stage') {
            steps {
                script {
                    def nodes = [:]
                    for (node in params.NODES.tokenize(',')) {
                        def apps = [:]
                        for (app in params.APPS.tokenize(',')) {
                            performDeploymentStages(node, app)
                        }
                        parallel apps
                    }
                    parallel nodes
                }
            }
        }
    }
}

Untuk memanfaatkan sepenuhnya dari menjalankan paralel, ingatlah untuk menetapkan cukup banyak pelaksana.

biniosuaf
sumber
Apakah potongan ini berfungsi tanpa menetapkan nilai ke nodesdan appsvariabel?
jellenberger
@ jellenberger tidak akan berfungsi jika vars ini akan kosong (null / string kosong). Tapi boleh saja untuk mengirimkan item tunggal (aplikasi tunggal, atau node) tanpa koma.
biniosuaf