Deklaratif bir boru hattı ile dinamik paralel eylem nasıl doğru şekilde elde edilir?


22

Şu anda, bir dizindeki tüm dosyaları bulmalı ve bulunan her dosya için paralel bir görev başlatması gereken bir uygulamaya ihtiyacım olacak.

Bunu bildirimsel boru hatları kullanarak başarmak mümkün mü?

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

Paralel değil, birden çok adımı sırayla çalıştırmak istersem nasıl yapabilirim?
Frank Escobar

Elbette, ancak bu şekilde, örneğin depodaki bazı dosyalara bağlı olarak paralel görevleri dinamik olarak oluşturamazsınız.
Raúl Salinas-Monteagudo

Yanıtlar:


23

Aşağıdaki kodla çözmeyi başardı:

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

Lütfen resmi Boru Hattı örneklerine de göz atın
jenkins.io/doc/pipeline/examples/#parallel-multiple-nodes

@phedoreanu Bildirici boru hattı kullanıyorum ...
thclpr

@phedoreanu Düzenlemenizi reddettim, düzenleme kodunun iyi nedenleri olmalı, yorumunuz kendiliğinden bir çözüm olan bir cevapta bu tür bir düzenlemeye izin vermem için yeterli değil. Bu düzenlemeyi yapmadan önce konuyu cevap yazarı ile görüşmek için yorum yapmış olmanız gerektiğini düşünüyorum.
Tensibai

@phedoreanu Daha iyi bir türev çalışmanız olduğunu düşünüyorum, lütfen kendi cevabınızı yazın ve bunun neden daha iyi olduğunu (hata işleme, şablonlar vb.) açıklayın.
Tensibai

Merhaba, birkaç başarısız denemeden sonra aynı şeyi anladım. Şu anki tek sorunum, iki nedenden oluşan {..} bölümleri bir nedenden dolayı bir düğümün içine koyarsam, iş akışı sahne şeması ve Blu Ocean'ın kafası karışır. Mesela iş akışı aşama grafiğinde NaNy NaNd ve Mavi Okyanusta sadece ilk aşamayı alıyorum.
Giuseppe

7

Eğer dahilinde kalmak istiyorsanız bu da işleri Declarative Pipelineboşluk

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

1
Her bir paralel görevi farklı Jenkins düğümlerine node {}tests[f] = { node { echo f.toString() } }
atamak istiyorsanız

1

Keyfi Groovy kullanabildiğiniz için bunu yapmak için komutlu Boru Hatları kullanmak çok daha kolaydır, ancak yine de findFilesadımı kullanarak bildirimsel Boru Hatları ile bunu yapabilmeniz gerekir .


1

Dinamik oluşturma adımlarının bazı oluşturma adımlarında, örneğin başka bir işi aradığınızda bazı sorunlara neden olabileceğini unutmayın:

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