آشنایی با Continuous Delivery

مقدمهتحویل مستمر یا Continuous Delivery که به اختصار CD نیز نامیده می شود، رویکردی در مهندسی نرم افزار است که تیم ها را قادر می سازد نرم افزار تولید شده را به روشی سریع و مطمئن برای تحویل آماده کنند. Continuous Delivery توانایی اعمال تغییرات در محیط عملیات در هر لحظه با روشی سریع و مطمئن و به طور کاملا پایدار می باشد. این تغییرات می تواند از هر نوعی باشد و شامل تغییرات پیکربندی در نرم افزار، زیر ساخت و پلتفرم، افزودن ویژگی های جدید و رفع باگ ها و خطاها می شود.در ادامه به توضیحات بیشتر در مورد Continuous Delivery می پردازیم.توضیح Continuous Delivery و کاربرد آنتحویل مستمر بخشی از CI/CD را تشکیل می دهد. CI/CD در واقع روشی برای ارائه ی مکرر نرم افزار با خودکار سازی برخی از مراحل توسعه برنامه به حساب می آید."CI" در CI/CD به ادغام پیوسته(Continuous Integration) اشاره دارد. با یکپارچه سازی مداوم، تغییرات کد جدید در یک برنامه به طور منظم ساخته، آزمایش و در یک مخزن مشترک ادغام می شوند. این موضوع یک راه حل برای مشکل داشتن branch های بیش از حد یک برنامه در حال توسعه به طور همزمان است که ممکن است با یکدیگر تضاد داشته باشند."CD" در CI/CD به تحویل مستمر اشاره دارد که روش هایی را برای خودکارسازی مراحل بعدی pipeline مربوط به CI/CD توصیف می کند.در واقع Continuous Delivery توانایی پذیرش انواع تغییرات از جمله اضافه شدن امکانات جدید به برنامه، تغییرات پیکربندی و رفع خطاها به روشی سریع و پایدار است. در این رویکرد هدف این است که تیم توسعه ی نرم افزار همیشه آماده باشد تا جدیدترین نسخه ی نرم افزار تولیدی خود را در هر زمانی منتشر کند. همچنین حتی اگر تیم های توسعه متشکل از افراد زیادی باشند یا نرم افزار ما توزیع شده باشد، با استفاده از CD فرایند ارائه ی نرم افزار بصورت ساده و قابل پیش بینی و روتین تبدیل می شوند.شکل ۱- pipeline مربوط به CI/CDفرایند CD که معادل فارسی " تحویل مداوم یا مستمر" را می توان برای آن در نظر گرفت، یک رویکرد در توسعه و تولید نرم افزار می باشد که بر اساس آن تیم توسعه نرم افزار بصورت سریع و مطمئن، همواره آماده است تا جدیدترین نسخه از نرم افزار تولیدی را در هر زمانی منتشر کند. این فرایند از زمان اضافه شدن یا تغییر کد در سرور سورس کنترل شروع می شود و شامل بیلد، تست، پیکربندی و انتشار در محیط های گوناگون تستی یا عملیاتی می باشد. اهمیتی ندارند که تیم های توسعه چه تعداد بزرگ باشند و یا نرم افزاری که مد نظر است توزیع شده باشد یا خیر، با استفاده از CD فرایندهای شرح داده شده بصورت ساده و قابل پیش بینی و روتین تبدیل می شوند.تفاوت Continuous Delivery و Continuous Deploymentتحویل مستمر (Continuous Delivery) و استقرار مستمر (Continuous Deployment)، در حالی که مفاهیم نزدیک به هم مرتبط هستند، گاهی اوقات به طور جداگانه برای تعیین میزان اتوماسیون در حال وقوع استفاده می شوند.تحویل مستمر معمولاً به این معنی است که تغییرات انجام شده توسط تیم توسعه به شکل خودکار از نظر داشتن باگ بررسی شده و سپس در یک مخزن (مانند GitHub) آپلود می‌شوند و سپس می توانند توسط تیم عملیات در یک محیط عملیاتی مستقر شوند. این مفهوم در واقع پاسخی برای رفع مشکل ارتباط ضعیف بین تیم توسعه‌دهنده و کسب‌وکار است و باعث می‌شود زحمت پیاده‌سازی تغییرات جدید به حداقل برسد.استقرار پیوسته مربوط به انتشار خودکار تغییرات از مخزن تا مشاهده ی آن توسط کاربر است.این مفهوم راهی برای حل مشکل ایجاد سربار زیاد برای تیم عملیات، به‌دلیل تنظیمات دستی مربوط به انتشار است که سرعت تحویل نرم‌افزار را کاهش می‌دهد.شکل ۲- Continuous Integration , Continuous Delivery, Continuous Deploymentچرا از Continuous Delivery استفاده می کنیم؟اغلب فرض بر این است که اگر می‌خواهیم نرم‌افزار را به دفعات بیشتری مستقر کنیم، باید سطوح پایین‌تری از ثبات و قابلیت اطمینان را در سیستم‌های خود بپذیریم. اما در واقع این طرز فکر صحیح نیست.تحقیقات انجام‌شده نشان می دهد تیم‌های با عملکرد بالا به طور مداوم خدمات را سریع‌تر و قابل اطمینان‌تر از سایر تیم های با عملکرد پایین تر ارائه می کنند. از مزایای تحویل مستمر می توان به موارد زیر اشاره کرد:انتشار نرم افزار با ریسک پایین تر: هدف اولیه از تحویل مستمر این است که پیاده‌سازی نرم‌افزار را بدون دردسر و با ریسک کمتر انجام داد. در نتیجه انتشار نرم افزار قابل اعتمادتر خواهد بود.زمان سریعتر برای بازاریابی: در فرایند تحویل سنتی نرم افزار ممکن است مرحله ی ادغام و تست محصول هفته ها یا ماه ها طول بکشد. با استفاده از رویکرد CD تیم ها فرایند های یکپارچه سازی و تست رگرسیون را در برنامه ی روزانه ی خود می گنجانند و حجم زیاد دوباره کاری اجتناب می شود. کیفیت بالاتر: با استفاده از ابزارهای خودکار و سریع برای کشف رگرسیون ها توسط توسعه دهندگان وقتی توسعه‌دهندگان، تیم های توسعه وقت بیشتری خواهند داشت تا بر سطوح تست بالاتر مانند تست اکتشافی (exploratory testing)، تست قابلیت استفاده (usability testing)، و تست عملکرد (performance testing) و امنیت (security testing) تمرکز کنند. با ساخت یک خط لوله استقرار (deployment pipeline)، این فعالیت ها می توانند به طور مداوم در طول فرآیند تحویل انجام شوند و اطمینان حاصل شود که محصول با کیفیتی ارائه می شود.هزینه های پایین تر: هر محصول یا خدمات نرم افزاری موفقی در طول عمر خود به طور قابل توجهی تکامل می یابد. با سرمایه‌گذاری در ساخت، تست، استقرار و اتوماسیون محیطی، ما با حذف بسیاری از هزینه‌های ثابت مرتبط با فرآیند انتشار، هزینه ایجاد و ارائه تغییرات تدریجی در نرم‌افزار را به‌طور قابل ملاحظه‌ای کاهش می‌دهیم.محصولات بهتر: تحویل مستمر باعث تحویل محصول به صورت خرد خرد می شود. این بدان معنی است که ما می توانیم در طول چرخه ی عمر تحویل نرم افزار بر اساس نرم افزار کار از کاربران بازخورد دریافت کنیم. تکنیک‌هایی مانند تست A/B ما را قادر می‌سازد تا رویکردی مبتنی بر فرضیه را برای توسعه محصول در پیش بگیریم که به موجب آن می‌توانیم ایده‌ها را با کاربران قبل از ایجاد ویژگی‌های کامل آزمایش کنیم. این بدان معناست که می‌توانیم متوجه شویم کدام امکانات ارزش صفر یا منفی به کسبب و کارمان می دهد و از ارائه ی آن ها اجتناب کنیم. تیم های شادتر: بررسی ها نشان داده است که تحویل مستمر باعث کاهش فرسودگی تیم می شود. علاوه بر این، تعدد دفعات انتشار نرم افزار باعث می شود که تیم های تحویل نرم افزار به طور پویا و موثر با کاربران در تعامل باشند و متوجه شوند استفاده از کدام ایده ها مناسب بوده است و کدام نه و خروجی کار خود را ببیند. با حذف فعالیت‌های فرسایشی کم‌ارزش مرتبط با تحویل نرم‌افزار، می‌توانیم روی چیزی که بیش از همه به آن اهمیت می‌دهیم تمرکز کنیم و کاربران را نیز خوشحال کنیم.تحویل مستمر چگونه با DevOps مرتبط است؟این دو مفهوم از جهاتی به هم نزدیک هستند اما تفاوت هایی نیز با هم دارند. DevOps مفهومی است که شیوه های توسعه و عملیات را با هم ترکیب می کند و علاوه بر خودکارسازی فرایند تحویل نرم افزار، تغییرات فرهنگی به خصوص ارتباط بین تیم های مختلف که در جریان آماده سازی و تحویل محصول نرم افزاری هستند را نیز در برمی گیرد و هدف آن افزایش ارزش کسب‌وکار و پاسخگویی از طریق ارائه خدمات سریع و با کیفیت بالا است.اما Continuous Delivery روشی برای خودکار سازی فرایند تحویل محصول است و بر این موضوع تمرکز دارد که فرایند های مرتبط در کنار هم طوری اجرا شود که منجر شود محصول نرم افزاری به دفعات متعدد و با سرعت بیشتر، امنیت بیشتر و ریسک کمتر به دست مشتری برسد. نتیجه اصلی اجرای DevOps یک خط لوله CI/CD است که توسط تیم های توسعه و عملیاتی که با یکدیگر با استفاده از یک روش چابک (agile) کار می کنند پشتیبانی می شود.شکل ۳- ارتباط تحویل مستمر با DevOpsابزارها و فناوری های متن باز حوزه ی Continuous Delivery از جمله ابزار های مطرح Continuous Delivery می توان به CircleCI، Jenkis و GoCD اشاره کرد. در ادامه به بررسی این ابزارها می پردازیم.ابزار Jenkisیک ابزار خودکار سازی منبع باز است که ساخت مرکزی و فرآیند یکپارچه سازی مستمر در آن انجام می شود. این ابزار یک برنامه مستقل مبتنی بر جاوا است که قابل استفاده روی سیستم عامل های مختلف است. Jenkis به کاربران امکان می دهد pipeline مربوط به CI/CD را با پلاگین ها و رابط کاربری گرافیکی و همچنین کد ایجاد کنند. این ابزار از ساخت، استقرار و خودکارسازی پروژه های توسعه نرم افزار پشتیبانی می کند. ویژگی های کلیدی این ابزار عبارت است از:رابط کاربری آسان و ساده پسندنصب و ارتقاء آسان در سیستم عامل های مختلفپشتیبانی از ساخت های توزیع شده با معماری master-slaveاطلاع رسانی از وضعیت ساخت (build)از اجرای دستورات شل و ویندوز در مراحل پیش ساخت پشتیبانی می کند.اطلاعات بیشتر در مورد این ابزار از این لینک قابل مشاهده است.شکل ۴- ابزار Jenkisابزار CircleCIاین ابزار یک ابزار CI/CD است که از توسعه و انتشار سریع نرم افزار پشتیبانی می کند. CircleCI امکان اتوماتیک سازی در سراسر خط لوله (pipeline)، از ساخت کد، تست تا استقرار را فراهم می کند.می‌توانید CircleCI را با GitHub ادغام کرد. از ویژگی های این ابزار می توان به موارد زیر اشاره کرد:بیلدها را با استفاده از کانتینر یا ماشین مجازی اجرا می کنداشکال زدایی آسانموازی سازی خودکارراه اندازی و تست های سریع قابلیت بالای شخصی سازیاستقرار مستمر و خاص برای هر branchاطلاعات بیشتر در مورد این ابزار در این لینک قابل دسترسی است.شکل ۵- ابزار circleciابزار GoCDاین ابزار نیز یک ابزار متن باز برای ساخت و انتشار نرم افزار است که از زیرساخت های مدرن در CI/CD پشتیبانی می کند. از ویژگی های این نرم افزار می توان به موارد زیر اشاره کرد:پیکربندی راحت به منظور دریافت سریع بازخوردها و انجام استقرارهای درخواستی انتشار محصول قابل اعتماداستقرار هر نسخه در هر زمانکنترل گردش کار و ردیابی تغییرات از commit کردن تا استقراراطلاعات بیشتر درباره ی GoCD را در این لینک ببینید.شکل ۶- ابزار GOCDشرکت های ایرانی ارائه دهنده خدمات در حوزه ی Continuous Deliveryاز جمله شرکت های ایرانی فعال در این زمینه می توان به شرکت لاراهاست اشاره کرد.لاراهاست در زمینه ی ارائه ی تکنولوژی های روز دنیا در حوزه میزبانی وبسایت فعالیت می کند. در سایت این شرکت در مورد تحویل مستمر متن زیر آورده شده است:برای بسیاری از برنامه نویسان و متخصصین Devops، ارائه محصول به صورت دوره ای از اهمیت ویژه ای برخوردار است.ما در لاراهاست برآن شدیم که با ارائه سرویس Continuous Delivery، به این نیاز کاربران ارج نهیم که بتوانند محصول خود را در سریع ترین زمان ممکن به محیط های Staging, Production برسانند.از جمله دیگر شرکت های فعال در این زمینه کوالاتک است.مجموعه کوالاتک، ارائه دهنده خدمات تخصصی تست نرم افزار و تضمین کیفیت می باشد. این شرکت خدمات CI/CD خود را اینگونه توصیف کرده است:ما در شرکت کوالاتک با بهره‌گیری از متخصصان ارشد حوزه QA و انجام ده‌ها پروژه مختلف آماده کمک به سازمان‌های مختلف برای راه اندازی فرایند CI/CD می‌باشیم.شکل ۷- ویژگی های CI/CD ارائه شده شرکت کوالاتکهمچنین شرکت ابرآروان نیز از دیگر شرکت های ارائه کننده خدمات در این زمینه است.«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»منابع1- https://continuousdelivery.com2- https://www.redhat.com/en/topics/devops/what-is-continuous-delivery3- https://www.katalon.com/resources-center/blog/ci-cd-tools/4- https://searchitoperations.techtarget.com/tip/5-open-source-continuous-delivery-tools-to-trial5- https://aws.amazon.com/devops/continuous-delivery/6- http://lara-host.ir/continuous-delivery/7- https://qualatech.ir/ci-cd/