宣言型パイプラインを使用して動的な並列アクションを適切に実現する方法は?


19

現在、ディレクトリ内のすべてのファイルを検索し、見つかったすべてのファイルに対して並列タスクを開始する必要がある実装が必要になります。

宣言的なパイプラインを使用してこれを達成することは可能ですか?

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

並列ではなく複数のステップを連続して実行したい場合はどうすればよいですか?
フランクエスコバル

回答:


21

次のコードでそれを解決できました:

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

また、公式のパイプラインの例をチェックしてください- jenkins.io/doc/pipeline/examples/#parallel-multiple-nodes
phedoreanu

@phedoreanu宣言型パイプラインを使用しています...
thclpr

@phedoreanu編集を拒否しました。コードの編集には十分な理由があるはずです。あなたのコメントだけでは、自己解決策である回答に対してこの種の編集を許可することはできません。この編集を行う前に、回答の作成者と問題について話し合うためにコメントしておくべきだと思います。
天柴iba

@phedoreanuあなたはあなたがより良い派生作品を持っていると思うので、あなた自身の答えを書いて、代わりにそれが(エラー処理、テンプレートなどで)なぜ良いのか説明してください。
Tensibai

こんにちは、いくつかの失敗した試行の後、同じことを理解しました。現時点で私の唯一の問題は、何らかの理由で2つのステージ{..}セクションをノード内に配置すると、ワークフローステージチャートとBlu Oceanが混乱することです。たとえば、ワークフローステージチャートではNaNy NaNdを取得し、ブルーオーシャンでは第1ステージのみを取得します。
ジュゼッペ

6

Declarative Pipelineスペース内に滞在したい場合にもこれは機能します

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

各並列タスクを異なるJenkinsノードに割り当てる場合はnode {}、次のようにアクションをブロックに 単純にラップしますtests[f] = { node { echo f.toString() } }
。– primetheus

1

任意のGroovyを使用できるため、スクリプト化されたパイプラインを使用する方がはるかに簡単ですが、findFilesステップを使用して宣言的パイプラインでこれを行うことができるはずです。


1

動的なビルドステップは、他のジョブを呼び出すときなど、一部のビルドステップで問題を引き起こす可能性があることに注意してください。

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
                }
            }
        }       
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.