Bagaimana cara mencapai aksi paralel dinamis dengan benar dengan pipeline deklaratif?

20

Saat ini, saya akan membutuhkan implementasi yang harus menemukan semua file dalam direktori dan memulai tugas paralel untuk setiap file yang ditemukan.

Apakah mungkin untuk mencapai ini menggunakan pipa deklaratif?

pipeline {
    agent any
    stages {
        stage("test") {
            steps {
                dir ("file_path") {
                    // find all files with complete path
                    parallel (
                        // execute parallel tasks for each file found.
                        // this must be dynamic
                        }
                    }
                }
            }
        }
    }
}
thclpr
sumber
Bagaimana saya bisa melakukannya jika saya ingin menjalankan beberapa langkah secara berurutan dan tidak paralel?
Frank Escobar

Jawaban:

22

Berhasil menyelesaikannya dengan kode berikut:

pipeline {
    agent { label "master"}
    stages {
        stage('1') {
            steps {
                script {
                    def tests = [:]
                    for (f in findFiles(glob: '**/html/*.html')) {
                        tests["${f}"] = {
                            node {
                                stage("${f}") {
                                    echo '${f}'
                                }
                            }
                        }
                    }
                    parallel tests
                }
            }
        }       
    }
}
thclpr
sumber
Silakan juga periksa contoh-contoh Pipeline resmi - jenkins.io/doc/pipeline/examples/#parallel-multiple-nodes
phedoreanu
@ phedoreanu saya menggunakan pipa deklaratif ...
thclpr
@ phedoreanu Saya telah menolak suntingan Anda, mengedit kode harus memiliki alasan yang bagus, komentar Anda tidak cukup bagi saya untuk mengizinkan suntingan semacam ini pada jawaban yang merupakan solusi mandiri. Saya pikir Anda harus berkomentar untuk membahas masalah ini dengan penulis jawaban sebelum melakukan pengeditan ini.
Tensibai
@ phedoreanu Saya pikir Anda memiliki karya turunan yang lebih baik, maka silakan tulis jawaban Anda sendiri dan jelaskan mengapa lebih baik (dalam penanganan kesalahan, templat, dll.).
Tensibai
Hai, saya menemukan hal yang sama setelah beberapa upaya gagal. Satu-satunya masalah saya sekarang adalah bahwa jika saya meletakkan dua tahap {..} bagian dalam sebuah node karena beberapa alasan bagan tahapan alur kerja dan Blu Ocean menjadi bingung. Misalnya dalam bagan tahap alur kerja saya mendapatkan NaNy NaNd dan di Blue Ocean saya hanya mendapatkan tahap pertama.
Giuseppe
6

Ini juga berfungsi, jika Anda ingin tetap berada dalam Declarative Pipelineruang

// declare our vars outside the pipeline
def tests = [:]
def files

pipeline {
    agent any
    stages {
        stage('1') {
            steps {
                script {
                    // we've declared the variable, now we give it the values
                    files = findFiles(glob: '**/html/*.html')
                    // Loop through them
                    files.each { f ->
                        // add each object from the 'files' loop to the 'tests' array
                        tests[f] = {
                            // we're already in the script{} block, so do our advanced stuff here
                            echo f.toString()
                        }
                    }
                    // Still within the 'Script' block, run the parallel array object
                    parallel tests
                }
            }
        }       
    }
}
primetheus
sumber
Jika Anda ingin mengalokasikan setiap tugas paralel ke node Jenkins yang berbeda maka cukup bungkus tindakan dalam sebuah node {}blok, seperti ini: tests[f] = { node { echo f.toString() } }
primetheus
1

Jauh lebih mudah untuk menggunakan Pipeline yang ditulis untuk melakukan ini karena Anda bisa menggunakan Groovy yang sewenang-wenang, tetapi Anda tetap bisa melakukan ini dengan Pipeline deklaratif menggunakan findFileslangkah ini.

jayhendren
sumber
1

Perlu diketahui, bahwa langkah-langkah pembangunan dinamis dapat menyebabkan beberapa masalah dalam beberapa langkah-langkah pembangunan, misalnya ketika Anda memanggil pekerjaan lain:

pipeline {
    stages {
        stage('Test') {
            steps {
                script {
                    def tests = [:]
                    for (f in findFiles(glob: '**/html/*.html')) {
                        // Create temp variable, otherwise the name will be the last value of the for loop
                        def name = f
                        tests["${name}"] = {
                            build job: "${name}"
                        }
                    }
                    parallel tests
                }
            }
        }       
    }
}
Christian Gripp
sumber