একবার বিল্ড, ডাইজেস্ট দিয়ে প্রমোশন: রোলব্যাকযোগ্য ডেলিভারি পাইপলাইন
একটি রেফারেন্স ডেলিভারি পথ যেখানে 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-এর সঙ্গে যুক্ত করুন: রোলআউটের সময় দ্রুত বার্ন রেট প্রমোশন স্বয়ংক্রিয়ভাবে থামিয়ে দেয়।
- রোলব্যাক হলো আগের ডাইজেস্ট আবার ডিপ্লয় করা — একই, আগে থেকে পরীক্ষিত পথ — চাপের মধ্যে লেখা হটফিক্স নয়।
- কনফিগারেশন ও সিক্রেট ইমেজের বাইরে রাখুন, যাতে একই আর্টিফ্যাক্ট প্রতিটি এনভায়রনমেন্টে চলে।