مفهوم Continuous Delivery (CD) و در کل CI/CD، اصطلاحاتی هستند که به کرات در حوزه DevOps مورد استفاده قرار می گیرند. CI/CD به سازمان ها اجازه می دهد تا نرم افزار هایشان را به سرعت و به شکلی کار آمد به کابرانشان منتقل کنند. CI/CD فرآیند مؤثری را برای عرضه سریع تر محصولات به بازار ارائه می دهد.
قبل از ظهور سیستم های توزیع شده (مانند مایکروسرویس ها)، اکثر بخش های فرآیند تولید نرم افزار به صورت دستی انجام می شد ولی با ترند شدن این سیستم ها، اعمال دستی تغییرات روی تک تک مولفه ها، امری دشوار و حتی غیرممکن شد. به همین دلیل مهندسان نرم افزار به دنبال رویکردی بودند که در سریع ترین زمان ممکن و با کمترین هزینه، نرم افزار را انتشار و تحویل دهند. در ادامه با بوجود آمدن شیوه های جدید Deployment مانند استقرار های مبتنی بر Container و Container Orchestration، خودکار سازی بخش های مختلف فرآیند تولید نرم افزار، آسان تر و سریع تر شد.
در این مقاله سعی ما بر این است که مفهوم CD را به صورت کامل شرح دهیم. اما اصولا در DevOps بیشتر CI همراه با CD استفاده می شود و CI/CD کنار یکدیگر مورد بحث قرار می گیرند. CI به فرآیندی اشاره دارد که از آن طریق فیچرهای جدید به صورت خودکار در مخزن (Repository) اصلی ادغام می شوند اما CD به فرآیندی اشاره می کند که از آن طریق نرم افزار دائماً آماده استقرار روی سرورها می شود.
به طور کلی، مفاهیم CI/CD ارتباط تنگاتنگی با فرهنگ Agile دارند که در آن تمرکز اصلی فرآیند های تولید نرمافزار روی بهبود مستمر و انتشار قابلیت های جدید در بازه های زمانی بسیار کوتاه است.
تحویل مستمر (CD) توانایی دریافت انواع تغییرات، از جمله افزودن فیچرهای جدید، تغییرات در پیکربندی ها، رفع باگ ها و آزمون ها می باشد که در تولید ایمن، سریع و پایدار نرم افزار کمک زیادی می کند. CD در ادامهی فرآیند CI می باشد که در آن تغییرات کد به صورت خودکار در قالب فرآوردههای Build (مانند jar فایل یا فرمتهای اجرایی دیگر) برای استقرار آماده می شوند. این فرآوردههای (Artifacts) آماده را می توان در محیط های آزمایشی برای آزمایش های بیشتر مستقر کرد یا در محیط تولید برای بهره برداری مستقر کرد. تمامی این فرآیند تضمین می کند که کد تغییر داده شده به طور کامل تست می شود و همیشه آماده استقرار می باشد.
در واقع CD این تضمین را ایجاد می کند که تیم مهندسی در هر لحظهای که اراده کند، نسخه جدید نرم افزار باید قابل انتشار باشد و بهره برداران بدون هیچ گونه مشکل و به صورت پایداری از سرویسها توسعه داده شده استفاده کنند.
یکی از طرز فکرهای اشتباهی که در بحث CD وجود دارد این است که اگر می خواهیم نرمافزار را به دفعات بیشتری مستقر کنیم، باید سطوح پایینتری از پایداری (stability) و قابلیت اطمینان (reliability) را در سیستم های خود بپذیریم. اما در واقعیت، تحقیقات نشان می دهند که این طرز فکر درست نیست و تیم های با عملکرد بالا به طور مداوم و مستمر سرویسها را سریعتر و قابل اطمینان تر از رقبای کم عملکرد خود ارائه می دهند. دقت شود که این موضوع حتی در حوزه های بسیار پیچیده و پیشرفته مانند حوزههای مالی و دولتی نیز صادق می باشد. بنابراین وجود تحویل مستمر پایدار و مطمئن، مزیت رقابتی باورنکردنی را برای سازمان هایی که مایل به سرمایه گذاری در حوزه DevOps هستند، فراهم می کند.
در واقع به نظر من یکی از مزیت های اصلی CD این است که فرآیند دریافت بازخورد (feedback) از کاربران را سریعتر می کند. یعنی هنگامی که توسعه دهندگان با سرعت بالایی فیچر های جدید را در معرض استفاده کاربران نهایی نرمافزار یا اپلیکیشن قرار میدهند، به همان میزان هم سریعتر میتوانند از آن ها بازخورد بگیرند و در صورت نیاز بلافاصله دست به اِعمال تغییرات بزنند. به طور کلی، دیگر مزیت های CD عبارتند از:
در ادبیات DevOps اغلب دو اصطلاح تحویل مستمر (Continuous Delivery) و استقرار مستمر (Continuous Deployment) به جای یکدیگر استفاده می شوند ولی در واقعیت این دو اصطلاح به مفاهیم متفاوتی اشاره دارند. Continuous Deployment یعنی این که هر تغییری در نرم افزار به صورت خودکار (یا بر اساس یک زمان بندی از قبل تعیین شده) در محیط عملیات (Production Environment) منتشر شود. ولی Continuous Delivery به این معنی است که هر تغییر در نرم افزار، آماده انتشار در هر محیطی می باشد. دقت شود در Continuous Delivery ممکن است تغییرات به دلایل مختلفی آماده انتشار باشند ولی منتشر نشوند (مثلا به خاطر تصمیم گیری ها و سیاست های کسب و کاری ممکن است از انتشار یک نسخه خاص جلوگیری شود).
در تصویر ۱ میتوانید تفاوت هر سه اصطلاح Continuous Integration و Continuous Deployment و Continuous Delivery را به صورت شماتیک مشاهده کنید:
دقت شود که در نبود CD، انتشار نرم افزار به عنوان یک گلوگاه برای تیم ها و نهایتاً برای محصول عمل می کند. مراحل دستی و غیر خودکار، باعث می شود که انتشارها نا مطمئن، با تاخیر و پر از خطا باشند.
مجموعه ابزار و تکنولوژی هایی که ممکن است توسط یک تیم برای تحویل مستمر انتخاب شود به عوامل متعددی بستگی دارد. این عوامل می تواند شامل هزینه (به عنوان یک عامل اصلی)، محدودیت های سمت مشتری (عامل مهم دیگری است) یا ... باشد که باید آن ها را نیز در نظر گرفت. بنابراین، ابتدا باید نیاز های خاص و اکوسیستم را تحلیل کرد و سپس بر اساس آن ها نوع ابزار را انتخاب کرد.
در این بخش چندین مورد از ابزارها و تکنولوژی های متنباز CD که در دنیا معروف و پر کاربرد هستند را بررسی میکنیم و درباره هر کدام به صورت مختصر توضیحاتی را ارائه میدهیم. البته باید دقت کرد که بعضی ابزار ها و تکنولوژی ها مربوط به مراحل مختلف تحویل مستمر می باشد و به خودی خود کاربرد مجزایی دارند:
ابزار Argo CD یک ابزار تحویل مستمر GitOps برای Kubernetes است. Argo CD یک پروژه متن باز است که در حال حاضر در بنیاد CNCF در وضعیت توسعه و رفع باگ قرار دارد. این ابزار از مخازن Git برای ذخیره وضعیت برنامه های اجرا شده در Kubernetes استفاده می کند، همچنین برنامه ها را مانیتور می کند و می تواند خوشه های Kubernetes را به حالت دلخواه و Customize، مجدداً همگام سازی کند. رویکرد نوآورانه ای که این ابزار دارد به شما امکان می دهد چندین حالت دلخواه یک برنامه Kubernetes را با استفاده از branch ها و tag ها و به کمک commit Git ذخیره کنید. Argo CD یک محیط انعطاف پذیر را برای مدیریت پیکربندی های Kubernetes در طول فرآیند تولید نرم افزار فراهم می کند.
ابزار CircleCI ابزاری متن باز برای CI/CD می باشد و شامل ویژگی هایی برای همنواسازی job ها (یعنی می توان چندین تسک مختلف را برای رسیدن به یک هدف خاص orchestracte کرد)، پیکربندی منابع، ذخیره سازی، اشکال زدایی، امنیت و گزارش های داشبورد می باشد. CircleCI با ابزارهای مختلفی از جمله GitHub، Heroku، Slack و Docker یکپارچه می شود. ابزار CircleCI در سه سطح موجود است که یکی از آن ها رایگان بوده و شما می توانید آن را در فضای ابری یا سرورهای لینوکسی، ویندوز و مک استفاده کنید.
محصول Jenkins X نسخه به روز شده Jenkins معروف می باشد و در این محصول از نسخه های جدیدتر جاوا و maven پشتیبانی می شود. همچنین این محصول بر پایه ی ویژگی های موجود در Jenkins و با قابلیت های متناسب با گردش کار Kubernetes و Docker تولید شده است. Jenkins X شامل ویژگی هایی برای pipelines از پیش ساخته شده، پشتیبانی یکپارچه با GitOps، محیط های پیش نمایش خودکار و یکپارچه سازی بازخورد ها می باشد (یعنی محیط هایی را فراهم کرده است که به صورت خودکار در مورد commit ها، خطاها و درخواست های pull پیش نمایشی به کاربر نشان داده و در مورد هر کدام کامنت مناسبی ارائه دهد). Jenkins X قابلیت یکپارچه سازی با Tekton، Prow، Helm، Knative و Skaffold را نیز دارد. می توانید از آن در سیستم عامل های لینوکس، مک یا ویندوز بهره ببرید.
در بین شرکت های ایرانی که در آن ها از ابزارهای تحویل مستمر بهره برده میشود، می توان به شرکت های زیر اشاره کرد:
شرکت ابر آروان (یا در اصل شرکت نویان ابر آروان) عرضه کنندهی زیرساخت یکپارچه ابری در ایران می باشد که همگام با دانش روز دنیا، طراحی و پیادهسازی شده است. هم اکنون طیف گستردهای از پر بازدیدترین و شناخته شده ترین وب سایت ها و کسب و کارهای آنلاین در کنار سامانه های حساس دولتی و بانک ها از راهکار های ابری آروان بهره می برند.
ابرآروان محصولات و خدمات مختلفی اعم از شبکهی توزیع محتوا (CDN)، DNS ابری (DNS Cloud)، امنیت ابری (Cloud Security)، زیرساخت ابری (IaaS)، فضای ابری (Cloud Storage)، پلتفرم ویدیو و پخش زنده (VoD & Live Streaming) و... را در اختیار مشتریان خود قرار می دهد. یکی از اصلی ترین ابزار هایی که این شرکت از آن بهره می برد، تحویل مستمر و در کل CI/CD می باشد. مطابق تصویر زیر می توانید معماری CI/CD را از دید پلتفرم ابری آروان مشاهده کنید.
یکی دیگر از شرکتهای ایرانی که از ابزار CI/CD و به صورت خاص تحویل مستمر به خوبی توانسته بهره ببرد، شرکت ابر زس می باشد. یکی از موضوعاتی که شرکت ابر زس درباره آن صحبت کرده است، بهره بردن از سازوکارهای هوش مصنوعی برای بهبود pipeline های CI/CD و افزایش سرعت زیرساخت های استقرار نرم افزار می باشد.
برای جمع بندی باید این نکته را اضافه کنم که فرایند Continuous Delivery و Infrastructure as Code و Monitoring به طور قابل ملاحظه ای مکمل یکدیگر هستند. از تحویل مستمر برای کنترل تغییرات در محیط عملیاتی استفاده می شود و اصولا در آن از استراتژی های استقرار مانند Blue-Green Deployment و همچنین تکنیک Feature Flags (یا Feature Toggles) نیز پشتیبانی می شود.
با توجه به ارزش هایی که CD برای شرکت ها و سازمان ها ایجاد می کند، آن را به یک نیاز ضروری تبدیل کرده است. در نتیجه برای رساندن ارزش به مشتریان نهایی، باید محصول را به طور پیوسته و بدون خطا منتشر کرد. Pipeline های انتشار پیشرفته به توسعه دهندگان این اجازه را می دهد که فیچرهای جدید را سریع و مطمئن منتشر کنند. با کمک CD، رفع خطاها در محیط عملیات و اضافه کردن فیچرهای جدید بسیار سریع تر و با اطمینان بالاتر انجام خواهد شد و به دست مشتری خواهد رسید.
این مقاله، بخشی از تمرینهای درس معماری نرم افزار در دانشگاه شهید بهشتی میباشد