للتأكيد على أن الوظائف المتوازية قد انتهت جميعها قبل انتهاء الوظيفة الرئيسية في الخط الأنابيب، يتعين عليك استخدام أدوات تحكم تسلسلية لضمان انتظار انتهاء جميع الوظائف المتوازية قبل استكمال العملية. في الحالة الحالية، يبدو أن العمليات تنتهي قبل أن ينتظر البرنامج النصي لانتهائها، مما يؤدي إلى انتهاء البرنامج الرئيسي بسرعة دون انتهاء الوظائف الفرعية.
بدلاً من استخدام الخيار wait: false
في أوامر build
، يمكنك استخدام وظيفة تحكم تسلسلية تسمى parallel
لتنفيذ الوظائف المتوازية والانتظار حتى انتهائها جميعًا. يمكنك تعديل النص البرمجي الخاص بك كما يلي:
node {
stage('Testing') {
def tests = [:]
tests['Foo1'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Foo1')] }
tests['Bar1'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Bar1')] }
tests['Baz1'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Baz1')] }
tests['Foo2'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Foo2')] }
tests['Bar2'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Bar2')] }
tests['Baz2'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Baz2')] }
parallel tests
}
}
بهذا التعديل، يتم تنفيذ الوظائف المختلفة بواسطة parallel
، الذي ينتظر حتى انتهاء جميع الوظائف قبل استئناف النقطة الرئيسية في الخط الأنابيب. هذا يضمن أن الخط الأنابيب لن ينتهي حتى تنتهي جميع الوظائف المتوازية.
عند استخدام هذا النهج، سيتم تنفيذ الوظائف المذكورة (Foo1، Bar1، Baz1، Foo2، Bar2، Baz2) بشكل متزامن وسينتظر البرنامج الرئيسي حتى انتهاء جميعها قبل استئناف تنفيذ الخط الأنابيب.
المزيد من المعلومات
بعد أن قمت بتعديل النص البرمجي ليستخدم وظيفة التحكم التسلسلي parallel، يمكنك أيضًا إضافة خطوة إضافية للتأكد من انتهاء جميع الوظائف المتوازية بنجاح. يمكنك استخدام الأمر waitUntil للانتظار حتى تنتهي جميع الوظائف بنجاح وبعدها استئناف تنفيذ الخط الأنابيب الرئيسي.
قم بتعديل الكود ليبدو كما يلي:
groovynode { stage('Testing') { def tests = [:] tests['Foo1'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Foo1')] } tests['Bar1'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Bar1')] } tests['Baz1'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Baz1')] } tests['Foo2'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Foo2')] } tests['Bar2'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Bar2')] } tests['Baz2'] = { build job: 'Test', parameters: [string(name: 'Name', value: 'Baz2')] } parallel tests waitUntil { tests.every { _, result -> result == 'SUCCESS' } } } }
بهذا التعديل، ستنتظر العملية الرئيسية حتى تنتهي جميع الوظائف المتوازية بنجاح. إذا انتهت أي من الوظائف بفشل، فلن يتم استئناف تنفيذ الخط الأنابيب الرئيسي حتى ينتهي الكل. هذا يوفر لك ضمانًا إضافيًا بأن العمليات تمت بنجاح قبل المتابعة.
باستخدام هذا النهج، يمكنك الآن ضمان أن الخط الأنابيب لن ينتهي حتى يكتمل تنفيذ جميع الوظائف المتوازية بنجاح، مما يوفر لك راحة البال وقابلية لإدارة ومراقبة عملياتك بشكل أكبر وأكثر دقة.