কীভাবে সঠিকভাবে একটি ঘোষিত পাইপলাইন সহ গতিশীল সমান্তরাল ক্রিয়া অর্জন করবেন?


22

বর্তমানে, আমি একটি বাস্তবায়ন প্রয়োজন যা অবশ্যই ডিরেক্টরিতে থাকা সমস্ত ফাইল খুঁজে পাওয়া এবং পাওয়া প্রতিটি ফাইলের জন্য একটি সমান্তরাল কাজ শুরু করতে হবে।

ঘোষিত পাইপলাইন ব্যবহার করে কি এটি অর্জন করা সম্ভব?

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

আমি যদি একাধিক পদক্ষেপ পর্যায়ক্রমে চালাতে চাই এবং সমান্তরাল না হয়ে কীভাবে করব?
ফ্রাঙ্ক এসকোবার

অবশ্যই, তবে সেইভাবে আপনি গতিময়ভাবে সমান্তরাল কাজগুলি তৈরি করতে পারবেন না, উদাহরণস্বরূপ, সংগ্রহস্থলের কিছু ফাইলের উপর নির্ভর করে।
রাউল সালিনাস-মন্টেইগুডো

উত্তর:


23

এটি নিম্নলিখিত কোড সহ সমাধান করার জন্য পরিচালিত:

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/piplines/example/#parallel-
বহুগুণ-

@ ফেডোরানু আমি ঘোষিত পাইপলাইন ব্যবহার করছি ...
thclpr

@ ফেদোরানু আমি আপনার সম্পাদনা প্রত্যাখ্যান করেছি, সম্পাদনার কোডের ভাল কারণ থাকতে হবে, আপনার মন্তব্য আমার পক্ষে যথেষ্ট নয় যে একটি উত্তর হিসাবে এই জাতীয় সম্পাদনা করার অনুমতি দেওয়া যা একটি স্ব-সমাধান ছিল। আমি মনে করি আপনার এই সম্পাদনাটি করার আগে উত্তর লেখকের সাথে বিষয়টি নিয়ে মন্তব্য করার উচিত ছিল।
তেনসিবাই

@ ফেডোরানু আমি আপনার মনে করি আপনার আরও ভাল ডেরাইভেটিভ কাজ রয়েছে, তবে দয়া করে আপনার নিজের উত্তর লিখুন এবং এর পরিবর্তে এটি কেন ভাল (ত্রুটি পরিচালনা, টেম্পলেট ইত্যাদি) ব্যাখ্যা করুন explain
তেনসিবাই

হাই, কয়েকটা ব্যর্থ চেষ্টার পরেও আমি একই বিষয়টি আবিষ্কার করেছি। আমার এখনই একমাত্র সমস্যা হ'ল যদি আমি কোনও কারণে নোডের ভিতরে দুটি স্তরের {..} বিভাগগুলি রাখি তবে ওয়ার্কফ্লো স্টেজ চার্ট এবং ব্লু মহাসাগর বিভ্রান্ত হয়। উদাহরণস্বরূপ ওয়ার্কফ্লো স্টেজ চার্টে আমি NaNy NaNd পাই এবং নীল মহাসাগরে আমি কেবল প্রথম পর্যায়ে পাই।
জিউসেপ

7

এটি যদি আপনার 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
                }
            }
        }       
    }
}

1
আপনি যদি প্রতিটি সমান্তরাল কাজটি বিভিন্ন জেনকিন নোডগুলিতে বরাদ্দ করতে চান তবে কেবল একটি node {}ব্লকের ক্রিয়াগুলি কেবল মোড়ানো করুন : tests[f] = { node { echo f.toString() } }
প্রাইমথিয়াস

1

এটি করার জন্য স্ক্রিপ্টযুক্ত পাইপলাইনগুলি ব্যবহার করা আরও সহজ কারণ আপনি স্বেচ্ছাসেবী গ্রোভিকে ব্যবহার করতে পারেন তবে 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.