एक बार बिल्ड, डाइजेस्ट से प्रमोशन: रोलबैक योग्य डिलीवरी पाइपलाइन
एक संदर्भ डिलीवरी रास्ता जिसमें staging में टेस्ट हुआ आर्टिफ़ैक्ट ठीक वही है जो प्रोडक्शन में है, और रोलबैक पिछले डाइजेस्ट का दोबारा डिप्लॉय है।
उदाहरण सामान्य और व्याख्यात्मक हैं। वे किसी क्लाइंट के एनवायरनमेंट से नहीं लिए गए हैं: थ्रेशोल्ड और सेटिंग्स को अपने सिस्टम के अनुसार ढालें।
हर एनवायरनमेंट के लिए दोबारा बिल्ड करने की समस्या
जो पाइपलाइन हर एनवायरनमेंट के लिए ऐप दोबारा बिल्ड करती हैं, वे एक आर्टिफ़ैक्ट टेस्ट करती हैं और दूसरा भेजती हैं। डिपेंडेंसी अलग तरह से रिज़ॉल्व होती हैं, बेस इमेज बदल जाती है, कोई बिल्ड फ़्लैग अलग होता है — और प्रोडक्शन वाला वर्ज़न कहीं भी टेस्ट नहीं हुआ। एक बार बिल्ड करें, आर्टिफ़ैक्ट को अपरिवर्तनीय पहचान दें और उसी पहचान को आगे बढ़ाएँ।
संदर्भ रास्ता
कमिट से प्रोडक्शन तक एक सामान्य रास्ता। हर चरण या तो वही आर्टिफ़ैक्ट आगे बढ़ाता है या उसे रोक देता है।
- 01कमिटरिव्यू और ज़रूरी जाँचों के साथ पुल रिक्वेस्ट।
- 02बिल्डहर कमिट पर एक बिल्ड; इमेज पुश होती है और उसका डाइजेस्ट दर्ज होता है।
- 03सत्यापनटेस्ट, डिपेंडेंसी और इमेज स्कैन, सिग्नेचर।
- 04Stagingडाइजेस्ट डिप्लॉय होता है; स्मोक और इंटीग्रेशन टेस्ट चलते हैं।
- 05प्रोडक्शनवही डाइजेस्ट, धीरे-धीरे रोलआउट।
- 06निगरानीएरर बजट और अलर्ट तय करते हैं: जारी रखें या रोलबैक करें।
टैग नहीं, डाइजेस्ट
latest या v2 जैसे टैग बदलने योग्य लेबल हैं; डाइजेस्ट (sha256:…) इमेज की सामग्री का हैश है। डिप्लॉयमेंट मैनिफ़ेस्ट को डाइजेस्ट का संदर्भ देना चाहिए, और पाइपलाइन इसी एक मान को बदलकर किसी एनवायरनमेंट को प्रमोट करती है — बेहतर होगा कि डिप्लॉयमेंट रिपॉज़िटरी में कमिट के रूप में, ताकि हर रिलीज़ एक रिव्यू किया हुआ, वापस लिया जा सकने वाला बदलाव हो।
# build once and record the digest
docker buildx build --push --metadata-file meta.json \
-t registry.example.com/api:"$GIT_SHA" .
DIGEST=$(jq -r '."containerimage.digest"' meta.json)
# promote: every environment receives the same digest
kustomize edit set image api=registry.example.com/api@"$DIGEST"
डेटाबेस बदलाव: पहले फैलाएँ, फिर समेटें
कोड का रोलबैक तभी आसान है जब स्कीमा अब भी पिछले वर्ज़न के अनुकूल हो। असंगत माइग्रेशन को ऐसे चरणों में बाँटें जिनमें हर चरण चल रहे कोड के अनुकूल हो: नया कॉलम या टेबल जोड़ें, दोनों में लिखने वाला कोड डिप्लॉय करें, पुराना डेटा भरें, रीड बदलें, और पुरानी संरचना केवल किसी बाद के रिलीज़ में हटाएँ।
प्रोग्रेसिव डिलीवरी और रोलबैक
- पहले ट्रैफ़िक या रेप्लिका के एक हिस्से पर रोलआउट करें, और एरर दर व लेटेंसी की तुलना मौजूदा वर्ज़न से करें।
- फ़ैसले को SLO से जोड़ें: रोलआउट के दौरान तेज़ बर्न रेट प्रमोशन को अपने-आप रोक देता है।
- रोलबैक पिछले डाइजेस्ट का दोबारा डिप्लॉय है — वही पहले से टेस्ट किया हुआ रास्ता — दबाव में लिखा गया हॉटफ़िक्स नहीं।
- कॉन्फ़िगरेशन और सीक्रेट को इमेज से बाहर रखें, ताकि वही आर्टिफ़ैक्ट हर एनवायरनमेंट में चले।