हमारे समाधान में एक दूसरे को कॉल करने और समर्थन करने वाली कुछ माइक्रोसर्विसेज शामिल हैं।

सरल बनाने के लिए, कृपया इस निर्भरता ग्राफ पर विचार करें:

 MS1 --> MS2
     --> MS3 --> MS4
  • MS1 MS2 और MS3 पर निर्भर करता है
  • MS3 MS4 पर निर्भर करता है
  • MS4 स्वतंत्र है

लक्ष्य: परिनियोजन के दौरान शून्य डाउनटाइम

वर्तमान में हम नीचे वर्णित युगल परिदृश्यों को हल करने के संभावित तरीकों का विश्लेषण कर रहे हैं:

  1. यह सुनिश्चित करने के लिए कि सभी एंड-टू-एंड परीक्षण पास हों, सभी माइक्रोसर्विसेज को तैनात करें। इसका मतलब है कि पहले MS4, फिर MS3, MS2, MS1, फिर परीक्षण चलाएं (यह सब स्लॉट में), फिर अगर सब कुछ बीत जाता है तो स्लॉट स्विच करें

  2. किसी भी सेवा को व्यक्तिगत रूप से तैनात करें (अन्य बिल्कुल नहीं बदले हैं), परीक्षण चलाएं (स्लॉट फिर से), फिर सब कुछ सफल होने पर स्लॉट स्विच करें

हमारा पहला दृष्टिकोण एक एकल (बड़ी) पाइपलाइन है जिसमें प्रत्येक माइक्रोसर्विस के अलग-अलग चरण हैं और यह जांचता है कि क्या माइक्रोसर्विस इसे तैनात करने के लिए बदल गया है। यदि माइक्रोसर्विस के लिए कोई परिवर्तन नहीं पाया जाता है, तो हम स्टेज को रद्द करना चाहते हैं और अगले के साथ आगे बढ़ना चाहते हैं। इस पाइपलाइन में प्रत्येक चरण के लिए टेम्पलेट हैं, उदाहरण के लिए:

- stage: MS1
  jobs:
  - job: CheckMS1Changes
    steps:
    - template: templates/ms1-check-changes.yml

  - job: BuildMS1
    dependsOn: CheckMS1Changes
    displayName: Build MS1
    - template: templates/ms1-build.yml

  - job: ReleaseMS1
    dependsOn: BuildMS1
    displayName: Release MS1
    - template: templates/ms1-release.yml

हमें लगता है कि यह वर्णित परिदृश्यों को कवर करेगा। "रद्द करें आदेश" को टेम्प्लेट/ms1-check-changes.yml फ़ाइल के अंदर रखा जाना चाहिए

समस्या यह है कि हमें दस्तावेज़ीकरण में यह नहीं मिला है कि एक पूर्ण चरण को कैसे रद्द किया जाए। जिससे मुझे लगता है कि शायद हमारा पूरा दृष्टिकोण गलत है। हमने यह भी नहीं पाया कि किसी नौकरी या नौकरियों के समूह को कैसे रद्द किया जाए, क्योंकि हमें यह भी संदेह है कि हमारे पास प्रति माइक्रोसर्विस चरण होना चाहिए या नहीं।

आप देख सकते हैं, हम इस सामान के लिए नए हैं।

क्या आप कुछ सलाह दे सकते हैं कि वर्णित परिदृश्यों के लिए एक अच्छी रणनीति क्या हो सकती है?

0
zameb 24 अगस्त 2020, 10:17

1 उत्तर

सबसे बढ़िया उत्तर

आपकी पाइपलाइन के आधार पर। मुझे लगता है कि आप CheckChanges नौकरियों को एक अलग चरण में स्थानांतरित कर सकते हैं। और फिर लॉगिंग कमांड ##vso[task.setvariable variable=MS1;isOutput=true]true एक आउटपुट फ्लैग वैरिएबल (यानी MS1) सेट करने के लिए जो संकेत देता है कि क्या प्रत्येक माइक्रोसर्विस के लिए परिवर्तन पाए गए हैं। फिर आप इन झंडों का उपयोग कंडीशन एक्सप्रेशन dependencies.dependencyStageName.outputs['dependencyStageJobName.taskName.varialbeName'] में कर सकते हैं

आप निम्न चरणों को पूरा कर सकते हैं इस चरण पर निर्भर करता है। और शर्तें इस चरण को छोड़ने या चलाने का निर्णय लेने के लिए। सरल उदाहरण नीचे देखें:

stages:
- stage: ChangeStage
  pool: 
    vmImage:  windows-latest
  jobs:
  - job: ChangeJob
    steps:
    - powershell: |
        echo "##vso[task.setvariable variable=MS1;isOutput=true]true" #set MS1 flag to true if changes made to MS1 
        echo "##vso[task.setvariable variable=MS2;isOutput=true]true"
        echo "##vso[task.setvariable variable=MS3;isOutput=true]true"
      name: ChangeTask

- stage: MS3Stage
  dependsOn: ChangeStage
  condition: eq(dependencies.ChangeStage.outputs['ChangeJob.ChangeTask.MS3'], 'true')
  pool: 
    vmImage:  windows-latest
  jobs:
  - template: ...

- stage: MS2Stage
  dependsOn: 
  - MS3Stage
  - ChangeStage
  condition: |
    and 
    (
     eq(dependencies.ChangeStage.outputs['ChangeJob.ChangeTask.MS2'], 'true'),
     in(dependencies.MS3Stage.result, 'Succeeded', 'Canceled', 'Skipped')
    )
  pool: 
    vmImage:  windows-latest
  jobs:
  - template: ...   

- stage: MS1Stage
  dependsOn: 
  - MS2Stage
  - ChangeStage
  condition: |
     and 
    (
     eq(dependencies.ChangeStage.outputs['ChangeJob.ChangeTask.MS1'], 'true'),
     in(dependencies.MS2Stage.result, 'Succeeded', 'Canceled', 'Skipped')
    )
  pool: 
    vmImage:  windows-latest
  jobs:
  - template: ...  
  

उपरोक्त पाइपलाइन में। शीर्ष चरण (यानी। ChangeStage) पहले चलेगा और जांच करेगा कि क्या माइक्रोसर्विसेज में परिवर्तन किए गए हैं और आउटपुट वैरिएबल को उसके अनुसार सही पर सेट करें।

MS2Stage MS3Stage पर निर्भर करता है। और MS2Stage के लिए शर्त नीचे दी गई है: जिसका अर्थ है कि MS2Stage केवल आउटपुट फ़्लैग की शर्त पर चलेगा MS2 सत्य है और MS3Stage सफल, छोड़ दिया या रद्द कर दिया गया है।

MS3Stage और MS1Stage MS2Stage के समान हैं।

condition: |
    and 
    (
     eq(dependencies.ChangeStage.outputs['ChangeJob.ChangeTask.MS2'], 'true'),
     in(dependencies.MS3Stage.result, 'Succeeded', 'Canceled', 'Skipped')
    )
2
Levi Lu-MSFT 25 अगस्त 2020, 06:14