Làm thế nào để đạt được hành động song song động với một đường ống khai báo?


19

Hiện tại, tôi sẽ cần một triển khai phải tìm tất cả các tệp trong một thư mục và bắt đầu một tác vụ song song cho mọi tệp được tìm thấy.

Có thể đạt được điều này bằng cách sử dụng các đường ống khai báo?

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

Làm thế nào tôi có thể làm nếu tôi muốn chạy nhiều bước liên tục và không song song?
Frank Escobar

Câu trả lời:


21

Quản lý để giải quyết nó với mã sau đây:

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

Ngoài ra, vui lòng xem các ví dụ về Đường ống chính thức - jenkins.io/doc/pipeline/examples/#abul-multipl-nodes
phedoreanu

@phedoreanu Tôi đang sử dụng đường ống khai báo ...
thclpr

@phedoreanu Tôi đã từ chối chỉnh sửa của bạn, mã chỉnh sửa nên có lý do chính đáng, nhận xét của bạn không đủ để tôi cho phép chỉnh sửa loại này trên một câu trả lời là một giải pháp tự. Tôi nghĩ bạn nên bình luận để thảo luận vấn đề với tác giả câu trả lời trước khi thực hiện chỉnh sửa này.
Tensibai

@phedoreanu Tôi nghĩ rằng bạn có một công việc phái sinh tốt hơn, sau đó vui lòng viết câu trả lời của riêng bạn và giải thích lý do tại sao nó tốt hơn (trong xử lý lỗi, mẫu, v.v.) thay vào đó.
Tensibai

Xin chào, tôi đã tìm ra điều tương tự sau một vài lần thất bại. Vấn đề duy nhất của tôi bây giờ là nếu tôi đặt hai phần {..} trong một nút vì một số lý do thì biểu đồ giai đoạn công việc và Blu Ocean bị lẫn lộn. Ví dụ, trong biểu đồ giai đoạn công việc tôi nhận được NaNy NaNd và trong Blue Ocean tôi chỉ nhận được giai đoạn đầu tiên.
Giuseppe

6

Điều này cũng hoạt động, nếu bạn muốn ở trong Declarative Pipelinekhông gian

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

Nếu bạn muốn phân bổ từng tác vụ song song cho các nút Jenkins khác nhau thì chỉ cần bọc các hành động trong một node {}khối, như sau: tests[f] = { node { echo f.toString() } }
primetheus

1

Sử dụng Pipelines theo kịch bản dễ dàng hơn nhiều để làm điều này vì bạn có thể sử dụng Groovy tùy ý, nhưng bạn vẫn có thể làm điều này với Pipelines khai báo bằng findFilesbước này.


1

Xin lưu ý rằng các bước xây dựng động có thể gây ra một số vấn đề trong một số bước xây dựng, ví dụ như khi bạn gọi một công việc khác:

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
                }
            }
        }       
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.