تحویل مستمر (Continuous Delivery)

مقدمهمفهوم Continuous Delivery (CD) و در کل CI/CD، اصطلاحاتی هستند که به کرات در حوزه DevOps مورد استفاده قرار می‌ گیرند. CI/CD به سازمان‌ ها اجازه می‌ دهد تا نرم‌ افزار هایشان را به سرعت و به شکلی کار آمد به کابرانشان منتقل کنند. CI/CD فرآیند مؤثری را برای عرضه سریع‌ تر محصولات به بازار ارائه می‌ دهد.قبل از ظهور سیستم‌ های توزیع شده (مانند مایکروسرویس‌‌ ها)، اکثر بخش‌ های فرآیند تولید نرم‌ افزار به صورت دستی انجام می‌ شد ولی با ترند شدن این سیستم‌ ها، اعمال دستی تغییرات روی تک‌ تک مولفه‌ ها، امری دشوار و حتی غیرممکن شد. به همین دلیل مهندسان نرم‌ افزار به دنبال رویکردی بودند که در سریع‌ ترین زمان ممکن و با کمترین هزینه، نرم‌ افزار را انتشار و تحویل دهند. در ادامه با بوجود آمدن شیوه‌ های جدید Deployment مانند استقرار‌ های مبتنی بر Container و Container Orchestration، خودکار سازی بخش‌ های مختلف فرآیند تولید نرم‌ افزار، آسان‌ تر و سریع‌ تر شد.در این مقاله سعی ما بر این است که مفهوم CD را به صورت کامل شرح دهیم. اما اصولا در DevOps بیشتر CI همراه با CD استفاده می‌ شود و CI/CD کنار یکدیگر مورد بحث قرار می‌ گیرند. CI به فرآیندی اشاره دارد که از آن طریق فیچرهای جدید به صورت خودکار در مخزن (Repository) اصلی ادغام می‌ شوند اما CD به فرآیندی اشاره می‌ کند که از آن طریق نرم‌ افزار دائماً آماده استقرار روی سرور‌ها می‌ شود.خط لوله نفت (oil pipeline) در شمال چینبه طور کلی، مفاهیم CI/CD ارتباط تنگاتنگی با فرهنگ Agile دارند که در آن تمرکز اصلی فرآیند‌ های تولید نرم‌افزار روی بهبود مستمر و انتشار قابلیت‌ های جدید در بازه‌ های زمانی بسیار کوتاه است.تشریح تحویل مستمرتحویل مستمر (CD) توانایی دریافت انواع تغییرات، از جمله افزودن فیچرهای جدید، تغییرات در پیکربندی ها، رفع باگ‌ ها و آزمون ها می‌ باشد که در تولید ایمن، سریع و پایدار نرم افزار کمک زیادی می‌ کند. CD در ادامه‌ی فرآیند CI می‌ باشد که در آن تغییرات کد به صورت خودکار در قالب فرآورده‌های Build (مانند jar فایل یا فرمت‌های اجرایی دیگر) برای استقرار آماده می شوند. این فرآورده‌های (Artifacts) آماده را می توان در محیط های آزمایشی برای آزمایش های بیشتر مستقر کرد یا در محیط تولید برای بهره برداری مستقر کرد. تمامی این فرآیند تضمین می کند که کد تغییر داده شده به طور کامل تست می‌ شود و همیشه آماده استقرار می‌ باشد.در واقع CD این تضمین را ایجاد می‌ کند که تیم مهندسی در هر لحظه‌ای که اراده کند، نسخه جدید نرم‌ افزار باید قابل‌ انتشار باشد و بهره برداران بدون هیچ گونه مشکل و به صورت پایداری از سرویس‌ها توسعه داده شده استفاده کنند.چرا تحویل مستمر؟یکی از طرز فکر‌های اشتباهی که در بحث CD وجود دارد این است که اگر می خواهیم نرم‌افزار را به دفعات بیشتری مستقر کنیم، باید سطوح پایین‌تری از پایداری (stability) و قابلیت اطمینان (reliability) را در سیستم های خود بپذیریم. اما در واقعیت، تحقیقات نشان می دهند که این طرز فکر درست نیست و تیم های با عملکرد بالا به طور مداوم و مستمر سرویس‌ها را سریعتر و قابل اطمینان تر از رقبای کم عملکرد خود ارائه می دهند. دقت شود که این موضوع حتی در حوزه های بسیار پیچیده و پیشرفته مانند حوزه‌های مالی و دولتی نیز صادق می باشد. بنابراین وجود تحویل مستمر پایدار و مطمئن، مزیت رقابتی باورنکردنی را برای سازمان هایی که مایل به سرمایه گذاری در حوزه DevOps هستند، فراهم می کند.مزایای تحویل مستمردر واقع به نظر من یکی از مزیت های اصلی CD این است که فرآیند دریافت بازخورد (feedback) از کاربران را سریع‌تر می‌ کند. یعنی هنگامی که توسعه دهندگان با سرعت بالایی فیچر های جدید را در معرض استفاده کاربران نهایی نرم‌افزار یا اپلیکیشن قرار می‌دهند، به همان میزان هم سریع‌تر می‌توانند از آن ها بازخورد بگیرند و در صورت نیاز بلافاصله دست به اِعمال تغییرات بزنند. به طور کلی، دیگر مزیت‌ های CD عبارتند از:انتشار نرم‌افزار کم خطر: هدف اولیه از تحویل مستمر این است که استقرار نرم‌افزار بدون هیچ دردسری و با ریسک کمی، در هر زمان و بر اساس تقاضای مشتری انجام شود. با استفاده از الگوهایی مانند استقرارهای سبز - آبی (BlueGreenDeployment)، می‌ توان به انتشار‌های بدون وقفه دست یافت که کاربران متوجه این تغییرات نشوند.کمترین زمان برای تحویل به بازار: همانطور که می‌ دانید عادی می‌ باشد که مراحل یکپارچه‌سازی (integration)، آزمون و برطرف کردن خطا‌ها در انتشار و تحویل‌ های سنتی نرم افزار، هفته ها یا حتی ماه ها طول بکشد. اما در CD توسعه‌ دهندگان مراحل ساخت، استقرار، آماده سازی محیط ها و انجام فرآیندهای آزمون integration و regression را در کار‌های روزانه خود می‌ گنجانند و دیگر نیازی نیست که تیم عملیات (Operation) این مراحل را جداگانه انجام دهد (یعنی در روال سنتی تیم های توسعه و عملیات برای انجام مراحل ذکر شده هزینه زمانی بسیار زیادی صرف می کردند ولی انجام این مراحل توسط تک تک توسعه‌ دهندگان باعث می‌ شود که هزینه زمانی رفت و برگشت بین تیم ها کاهش چشم‌گیری یابد). همچنین به واسطه CD می توان از حجم زیادی از دوباره کاری ها اجتناب کرد.کیفیت بالاتر: با توجه به اینکه توسعه‌ دهندگان ابزارهای خودکاری دارند که در عرض چند دقیقه regression ها را کشف می‌ کنند، تیم‌ها زمان بیشتری می یابند تا تلاش خود را بر روی آزمون های سطح بالاتر مانند آزمون اکتشافی (Exploratory Testing)، آزمون قابلیت استفاده (Usability Testing)، آزمون کارایی (Performance Testing) و آزمون امنیتی (Security Testing) متمرکز کنند. بنابراین با ایجاد یک خط لوله استقرار، این فعالیت ها می توانند به طور مداوم در طول فرآیند تحویل انجام شوند و از همان ابتدا اطمینان حاصل شود که محصولات و سرویس های تولیدی از بالاترین کیفیت برخوردار هستند.هزینه های پایین تر: هر محصول یا سرویس نرم افزاری موفقی در طول عمر خود به طور قابل توجهی تکامل می یابد و چرخه های متعددی دارد. با خودکارسازی مراحل ساخت، آزمایش، استقرار و مهیاسازی محیط‌ها بسیاری از هزینه‌های ثابت مرتبط با فرآیند انتشار، هزینه ایجاد و ارائه تغییرات تدریجی در نرم‌افزار به‌طور قابل ملاحظه‌ای کاهش می یابند و این امکان بوجود می‌ آید که هزینه های صرف جویی شده در مراحل دیگر مورد استفاده قرار گیرند.تیم های شادتر: تحقیقات انجام شده نشان می دهد که تحویل مستمر باعث کاهش فشار و کاهش فرسودگی تیم ها می شود. علاوه بر این، هنگامی که نرم افزار به دفعات بیشتری منتشر می شود، تیم های تحویل نرم افزار می توانند فعالانه تر با کاربران درگیر شوند، یاد بگیرند که کدام ایده ها کارآمدتر هستند و کدام نه، و همچنین نتایج کاری را که انجام داده اند، از نزدیک ببینند. با حذف فعالیت‌های دردناک و کم‌ارزش مرتبط با تحویل نرم‌افزار، می‌توانیم بر روی چیزهایی که از اهمیت بیشتری برخوردار هستند، تمرکز کنیم و به طور مداوم تیم‌ ها و کاربران خود را خوشحال کنیم.تفاوت تحویل مستمر و استقرار مستمردر ادبیات DevOps اغلب دو اصطلاح تحویل مستمر (Continuous Delivery) و استقرار مستمر (Continuous Deployment) به جای یکدیگر استفاده می شوند ولی در واقعیت این دو اصطلاح به مفاهیم متفاوتی اشاره دارند. Continuous Deployment یعنی این که هر تغییری در نرم افزار به صورت خودکار (یا بر اساس یک زمان بندی از قبل تعیین شده) در محیط عملیات (Production Environment) منتشر شود. ولی Continuous Delivery به این معنی است که هر تغییر در نرم افزار، آماده انتشار در هر محیطی می‌ باشد. دقت شود در Continuous Delivery ممکن است تغییرات به دلایل مختلفی آماده انتشار باشند ولی منتشر نشوند (مثلا به خاطر تصمیم‌ گیری ها و سیاست‌ های کسب و کاری ممکن است از انتشار یک نسخه خاص جلوگیری شود).در تصویر ۱ می‌توانید تفاوت هر سه اصطلاح Continuous Integration و Continuous Deployment و Continuous Delivery را به صورت شماتیک مشاهده کنید:تصویر ۱: تفاوت یکپارچه‌سازی مداوم، تحویل مداوم و استقرار مداومدقت شود که در نبود CD، انتشار نرم افزار به عنوان یک گلوگاه برای تیم ها و نهایتاً برای محصول عمل می کند. مراحل دستی و غیر خودکار، باعث می شود که انتشارها نا مطمئن، با تاخیر و پر از خطا باشند.ابزار‌ ها و تکنولوژی های متن بازمجموعه ابزار و تکنولوژی هایی که ممکن است توسط یک تیم برای تحویل مستمر انتخاب شود به عوامل متعددی بستگی دارد. این عوامل می تواند شامل هزینه (به عنوان یک عامل اصلی)، محدودیت های سمت مشتری (عامل مهم دیگری است) یا ... باشد که باید آن ها را نیز در نظر گرفت. بنابراین، ابتدا باید نیاز های خاص و اکوسیستم را تحلیل کرد و سپس بر اساس آن ها نوع ابزار را انتخاب کرد.در این بخش چندین مورد از ابزارها و تکنولوژی های متن‌باز CD که در دنیا معروف و پر کاربرد هستند را بررسی می‌کنیم و درباره هر کدام به صورت مختصر توضیحاتی را ارائه می‌دهیم. البته باید دقت کرد که بعضی ابزار‌ ها و تکنولوژی ها مربوط به مراحل مختلف تحویل مستمر می‌ باشد و به خودی خود کاربرد مجزایی دارند:ابزار Argo CDابزار Argo CD یک ابزار تحویل مستمر GitOps برای Kubernetes است. Argo CD یک پروژه متن باز است که در حال حاضر در بنیاد CNCF در وضعیت توسعه و رفع باگ قرار دارد. این ابزار از مخازن Git برای ذخیره وضعیت برنامه های اجرا شده در Kubernetes استفاده می کند، همچنین برنامه ها را مانیتور می کند و می تواند خوشه های Kubernetes را به حالت دلخواه و Customize، مجدداً همگام سازی کند. رویکرد نوآورانه ای که این ابزار دارد به شما امکان می‌ دهد چندین حالت دلخواه یک برنامه Kubernetes را با استفاده از branch ها و tag ها و به کمک commit Git ذخیره کنید. Argo CD یک محیط انعطاف پذیر را برای مدیریت پیکربندی های Kubernetes در طول فرآیند تولید نرم افزار فراهم می کند.تصویر ۲: معماری سطح بالای ابزار Argo CDابزار CircleCIابزار CircleCI ابزاری متن باز برای CI/CD می باشد و شامل ویژگی هایی برای همنواسازی job ها (یعنی می توان چندین تسک مختلف را برای رسیدن به یک هدف خاص orchestracte کرد)، پیکربندی منابع، ذخیره سازی، اشکال زدایی، امنیت و گزارش های داشبورد می باشد. CircleCI با ابزارهای مختلفی از جمله GitHub، Heroku، Slack و Docker یکپارچه می شود. ابزار CircleCI در سه سطح موجود است که یکی از آن ها رایگان بوده و شما می‌ توانید آن را در فضای ابری یا سرور‌های لینوکسی، ویندوز و مک استفاده کنید.تصویر ۳: معماری سطح بالای CircleCIمحصول Jenkins Xمحصول Jenkins X نسخه به روز شده Jenkins معروف می باشد و در این محصول از نسخه‌ های جدیدتر جاوا و maven پشتیبانی می شود. همچنین این محصول بر پایه ی ویژگی های موجود در Jenkins و با قابلیت های متناسب با گردش کار Kubernetes و Docker تولید شده است. Jenkins X شامل ویژگی هایی برای pipelines از پیش ساخته شده، پشتیبانی یکپارچه با GitOps، محیط های پیش نمایش خودکار و یکپارچه سازی بازخورد ها می باشد (یعنی محیط هایی را فراهم کرده است که به صورت خودکار در مورد commit ها، خطا‌ها و درخواست‌ های pull پیش نمایشی به کاربر نشان داده و در مورد هر کدام کامنت مناسبی ارائه دهد). Jenkins X قابلیت یکپارچه سازی با Tekton، Prow، Helm، Knative و Skaffold را نیز دارد. می‌ توانید از آن در سیستم‌ عامل های لینوکس، مک یا ویندوز بهره ببرید.تصویر ۴: معماری محصول نرم‌افزاری Jenkins Xشرکت‌ های ایرانیدر بین شرکت‌ های ایرانی که در آن ها از ابزار‌های تحویل مستمر بهره برده می‌شود، می‌ توان به شرکت‌ های زیر اشاره کرد:شرکت ابرآروانشرکت ابر آروان (یا در اصل شرکت نویان ابر آروان) عرضه‌ کننده‌ی زیرساخت یکپارچه ابری در ایران می باشد که همگام با دانش روز دنیا، طراحی و پیاده‌سازی شده است. هم اکنون طیف گسترده‌ای از پر بازدیدترین و شناخته‌ شده‌ ترین وب‌ سایت‌ ها و کسب‌ و کارهای آنلاین در کنار سامانه‌ های حساس دولتی و بانک‌ ها از راهکار های ابری آروان بهره می‌ برند.ابرآروان محصولات و خدمات مختلفی اعم از شبکه‌ی توزیع محتوا (CDN)، DNS ابری (DNS Cloud)، امنیت ابری (Cloud Security)، زیرساخت ابری (IaaS)، فضای ابری (Cloud Storage)، پلتفرم ویدیو و پخش زنده (VoD & Live Streaming) و... را در اختیار مشتریان خود قرار می دهد. یکی از اصلی ترین ابزار‌ هایی که این شرکت از آن بهره می‌ برد، تحویل مستمر و در کل CI/CD می باشد. مطابق تصویر زیر می توانید معماری CI/CD را از دید پلتفرم ابری آروان مشاهده کنید.تصویر ۵: نقش pipeline یکپارچه‌سازی و تحویل مستمر در پلتفرم شرکت ابرآروانشرکت ابر زسیکی دیگر از شرکت‌های ایرانی که از ابزار CI/CD و به صورت خاص تحویل مستمر به خوبی توانسته بهره ببرد، شرکت ابر زس می باشد. یکی از موضوعاتی که شرکت ابر زس درباره آن صحبت کرده است، بهره بردن از سازوکار‌های هوش مصنوعی برای بهبود pipeline های CI/CD و افزایش سرعت زیرساخت‌ های استقرار نرم‌ افزار می‌ باشد.جمع‌ بندیبرای جمع بندی باید این نکته را اضافه کنم که فرایند Continuous Delivery و Infrastructure as Code و Monitoring به طور قابل ملاحظه ای مکمل یکدیگر هستند. از تحویل مستمر برای کنترل تغییرات در محیط عملیاتی استفاده می شود و اصولا در آن از استراتژی های استقرار مانند Blue-Green Deployment و همچنین تکنیک Feature Flags (یا Feature Toggles) نیز پشتیبانی می شود.با توجه به ارزش هایی که CD برای شرکت ها و سازمان ها ایجاد می کند، آن را به یک نیاز ضروری تبدیل کرده است. در نتیجه برای رساندن ارزش به مشتریان نهایی، باید محصول را به طور پیوسته و بدون خطا منتشر کرد. Pipeline های انتشار پیشرفته به توسعه دهندگان این اجازه را می دهد که فیچرهای جدید را سریع و مطمئن منتشر کنند. با کمک CD، رفع خطاها در محیط عملیات و اضافه کردن فیچرهای جدید بسیار سریع تر و با اطمینان بالاتر انجام خواهد شد و به دست مشتری خواهد رسید.این مقاله، بخشی از تمرین‌های درس معماری نرم‌ افزار در دانشگاه شهید بهشتی می‌باشدمنابعhttps://continuousdelivery.comhttps://medium.com/driven-by-code/the-journey-to-ci-cd-b1872927c36bhttps://towardsdatascience.com/continuous-integration-continuous-delivery-myths-pitfall-and-practical-approach-aaec22edacc5https://www.softwaretestinghelp.com/best-continuous-delivery-toolshttps://jenkins-x.iohttps://argo-cd.readthedocs.io/en/stablehttps://circleci.comhttps://devops.com/7-popular-open-source-ci-cd-toolshttps://xaas.irhttps://www.arvancloud.com/docs/%d9%be%d8%a7%db%8c%d9%be%d9%84%d8%a7%db%8c%d9%86-cicd-%d9%81%d8%b1%d9%88%d8%b4%da%af%d8%a7%d9%87-%d8%a2%d9%86%d9%84%d8%a7%db%8c%d9%86-paas-%d8%a7%d8%a8%d8%b1%d8%a2%d8%b1%d9%88%d8%a7%d9%86https://pvlearn.com/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D9%87%D8%A7%DB%8C-jenkins-%D9%88-circleci