تحویل مدام

مقدمهاگر تجربه‌ی تولید نرم‌افزار و همکاری با یک تیم کوچک و تازه کار را داشته باشید احتمالا به این مسئله برخورده کرده‌اید که برای هر تغییری که در کد نرم‌افزار می‌دهید، کوچک یا بزرگ، برای آنکه آن تغییر برروی سرور قرار بگیرید و وارد محیط محصول شود و در اختیار کاربر قرار گیرد مدتی صبر کنید. این مدت زمان صبر ممکن است از چند ساعت باشد تا چند روز. حتی ممکن است که برای شما یک روز مشخصی را تعیین کنند و بگوید برای آنکه تغییرات در اختیار کاربر قرار گیرد باید تا آن روز تغییرات را انجام داده باشید و کدهای نرم‌افزار آماده‌ی استقرار برروی سرور باشند. دلیل این تاخیر برای قرار دادن تغییرات در محیط محصول می‌توان عدم خودکارسازی فرایندهای تست و استقرار سیستم باشد. به ازای هر تغییری که انجام می‌شود سیستم باید به صورت دستی تست گردد و همین تست دستی توسط توسعه دهندگان یا تسترها زمان‌بر است. همچنین برای مستقر کردن نرم‌افزار برروی سرور نیاز است تا تیم استقرار حضور داشته باشند و خودشان به صورت دستی تنظیمات را انجام دهند و سیستم را آماده‌ی استقرار نمایند. حال کافی است که در روز استقرار محصول یکی از افراد تیم تست یا استقرار نباشند آنگاه فرایند تحویل نرم‌افزار به تعویق خواهد افتاد. در دنیای امروز هر ثانیه‌ای که از دست برود و محصول دیر به دست مشتری برسد می‌تواند ضررهای سنگینی به سیستم وارد کند. بنابراین لازم است که به دنبال یک روشی باشیم که بتواند این فرایند تولید نرم‌افزار را خودکار کند و تغییرات بدون آنکه وابسته به افراد محدود و خاصی باشد برروی محیط محصول قرار گیرد. از این رو یک مفهوم به نام تحویل مدام بوجود آمد.تحویل مدام یا Continues Delivery (CD) روش توسعه‌ی نرم‌افزار است به گونه‌ای که تغییرات مربوط به کد به طور خودکار برای یک انتشار به عنوان محصول نهایی آماده هستند. یک رکن توسعه‌ی برنامه‌ی مدرن است، همچنین CD با یکپارچه سازی مدام (Continues Intgeration یا به اختصار CI) گسترش می‌یابد و معمولا این دو مفهوم به دنبال یکدیگر در قالب CI/CD می‌آیند. این گسترش به وسیله‌ی استقرار تمام تغییرات کد برروی یک محیط تست و محیط محصول پس از مرحله‌ی ساخت است. هنگامی که تحویل مدام به خوبی پیاده‌سازی شده باشد، توسعه‌ دهندگان همواره یک محصول آماده‌ی استقرار دارند که تمام فرایند تست استاندارد را گذرانده است. تحویل مدام این امکان را می‌دهد تا توسعه دهندگان تست‌ها را خودکار کنند. این تست‌ها تنها شامل unit testing نمی‌شود بلکه شامل تست واسط کاربری، تحمل بار سرور، یکپارچه سازی و اطمینان‌پذیری APIنیز می‌شود. همچنین سبب می‌شود تا قبل از استقرار برنامه و استفاده توسط مشتری بروزرسانی‌های جدید از جنبه‌های مختلف را شناخته و تست شوند.در توسعه‌ی نرم‌افزار یک مفهوم دیگری نیز وجود دارد به نام استقرار مدام یا Continues Deployment که معمولا با تحویل مدام اشتباه گرفته می‌شود. در تحویل مدام تمام تغییراتی که در کد برنامه ایجاد می‌شود ساخت، تست و سپس در یک محیط غیر محصول تست می‌شود. یعنی پیش آن که استقرار برنامه در محیط محصول انجام گیرد تست‌های چندگانه که پیشتر ذکر شدند انجام می‌شود. تفاوت تحویل مدام با استقرار مدام را می‌توان در حضور یک مرحله تست که یک حکم تایید دارد مبنی بر آن که تغییرات به درستی انجام شده و اشکالی در برنامه ایجاد نکرده است، دانست. این مرحله در تحویل مدام وجود دارد اما در استقرار مدام چنین نیست و تغییرات کد مستقیم برروی سرور می‌روند. بنابراین تحویل مدام با استقرار مدام یکسان نیستند و دو مفهوم مستقل هستند. درواقع استقرار مدام یک چرخه‌ی کوچک برای استقرار نرم‌افزار است و ربطی به تست نرم‌افزار ندارد.استفاده از سرویس تحویل مدام مزایایی دارد که موارد زیر را می‌توان از جمله مزایای آن دانست:خودکار سازی فرایند انتشار نرم‌افزار: به تیم توسعه این امکان را می‌دهد تا تغییرات کد را به طور خودکار بسازند، تست و آماده‌ی انتشار کنند. بنابراین انتقال سریع‌تر و موثرتر استبهبود بهره‌وری توسعه دهنده: این کار بهره‌وری تیم توسعه را بالا‌تر می‌برد زیرا توسعه دهندگان از انجام برخی کارها مانند تست به صورت دستی آزاد می‌شوند. همین امر سبب می‌شود که تعداد باگ‌ها و خطاهای برنامه هنگام انتشار و استقرار بسیار کاهش پیدا کندیافتن سریع‌تر باگ‌ها و مکان دقیق آن‌ها: تیم توسعه‌دهنده می‌تواند باگ‌ها را تشخیص دهد و مکان‌ رخداد آن‌ها را نیز شناسایی کند، پیش از آنکه به مشکل بزرگ‌تری تبدیل شوند و برروی سایر بخش‌های نرم‌‌افزار را تحت تاثیر قرار دهد. تحویل مدام این اجازه را می‌دهد که تیم توسعه بتواند برروی انواع تست‌های مختلفی وقت بگذارد زیرا انجام تست‌ها به صورت خودکار انجام می‌شود و بعنی ایجاد وقت کافی برای انجام تست سایر بخش‌های کد برنامهتحویل سریع‌تر در بروزرسانی: همان‌گونه که پیشتر اشاره شد، بروزرسانی که قرار است بالا برود بو به مشتری برسد چون فرایند تست‌های استاندارد را گذرانده است با اطمینان بیشتر و خطای کمتری بالا می‌رود و نیاز به تست کاربری را کاهش می‌دهددرواقع تحویل مدام یک روش مهندسی نرم‌افزار است که در آن تیم‌ها در یک چرخه‌ی کوتاه، نرم‌افزار را تولید می‌کنند. این چرخه‌ی خودکار تضمین می‌کند که نرم‌افزار با اطمینان در هر زمانی منتشر می‌شود. این روش هزینه، مدت زمان و خطر تحویل تغییرات را کاهش می‌دهد و با کاهش بروزرسانی در تولید.سازمان‌هایی که یک تیم DevOps دارند می‌توانند این خط تولید را پیاده سازی کنند و به کمک نرم‌افزارهای متن‌باز که وجود دارد از این سرویس استفاده کنند. در ادامه به بررسی دو نرم‌افزار متن باز که امکان ایجاد تحویل مدام را فراهم می‌کنند می‌پردازیم.نرم‌افزارهای متن بازبرای پیاده سازی تحویل مدام نرم‌افزار و سرویس‌هایی وجود دارند که این خدمت را فراهم می‌کنند. که برخی از آن‌ها اشتراکی هستند و برای استفاده از آن باید هزینه‌ای پرداخت شود مانند سرویس AWS. همچنین برخی هم به صورت رایگان و متن باز در اختیار کاربران قرار می‌گیرد مانند: Buddy و JBossنرم‌افزار Buddyیک ابزار هوشمند CI/CDاست که برای توسعه دهندگان وب طراحی شده است. این ابزار از خطوط تحویل برای ساخت، تست و استقرار نرم‌افزار استفاده می‌کند. این خطوط با بیش‌ از ۱۰۰ عمل آماده‌ انجام ساخته شده‌اند که قابلیت تغییر و جابجایی دارند و به طریق‌های مختلفی می‌توان آن‌ها را مرتب کرد. از مزایای استفاده از آن:استفاده‌ی راحت و انجام config در زمان اندکاستقرار سریع و آسان براساس مجموعه‌ی تغییرات ساخت‌ها در کانتینرهای جداگانه با وابستگی‌های کش شده اجرا می‌شوندتمام زبان‌ها، فریم‌ورک‌ها و مدیریت‌های وظیفه را پشتیبانی می‌کند با AWS و گوگل یکپارچه می‌شودنرم‌افزار متن باز دیگری گه گفته شده JBoss است. این نرم‌افزار توسط تیم REDHat ایجاد شده است. یک برنامه‌ی وب سروری است که به صورت کامل برای میزبانی برنامه‌ی تحت جاوا یکپارجه شده است. این برنامه از سرور Apache Http، Servelet Engines، load balancers و کتابخانه‌های native توسط Apache Tomcatتشکیل شده است. JBossاین توانایی را دارد که برروی پلتفرم‌های چندگانه اجرا شود.اما سازمان‌هایی که افرادی ندارند که نقش DevOps را انجام دهند می‌توانند از سرویس‌هایی استفاده کنند که توسط شرکت‌ها به صورت آماده ارائه می‌شود. در ادامه به معرفی دو شرکت داخلی می‌پردازیم که این سرویس را ارائه می‌دهند.ارائه دهندگان سرویس تحویل مدامشرکت‌ها و سایت‌هایی هستند که این خدمت را ارائه می‌دهند و تیم‌های نرم‌افزاری می‌توانند از آن‌ها استفاده کنند مانند CI/CD شرکت‌های Gitlabو Github اما استفاده ازسرویس‌های این شرکت‌ها ممکن است که هزینه‌ای داشته باشد و به دلیل مسائل سیاسی و تحریم مشکلاتی ایجاد شود. اما در ایران شرکت‌هایی هستند که این سرویس را ارائه می‌دهند مانند لاراهاست که سرویس خود را با github یکپارچه کرده است. پس از هر بار push کردن تغییرات کد، به صورت خودکار کدهای تغییر داده شده برروی سرور مستقر می‌شوند. فرایند فعال سازی آن نیز در githubبسیار ساده است که با مراجعه به آدرس سایت لاراهاست می‌توان مراحل فعال سازی این سرویس را مشاهده کرد.شرکت ایرانی دیگری که این سرویس را ارائه می‌دهد لیارا نام دارد. این شرکت در حوزه‌ی ارائه سرویس‌های ابری فعالیت می‌کند و یک سرویس CI/CD نیز ارائه می‌دهد که امکان راه‌اندازی آن به وسیله‌ی هم gitlab و هم github را دارد. برای فعال کردن این سرویس برروی gitlab یا github کافی است که تنظیمات گفته شده در مستندات خود لیارا در پروژه خود انجام دهید و فایل‌های مربوط به تنظیمات تحویل مدام و استقرار مدام را با مشخصات گفته شده ایجاد نمایید.جمع بندیبرای آنکه یک نرم‌افزار در دسترس کاربران و مشتریان قرار گیرد لازم است که برروی سرور مستقر شود. اما مهم‌تر از استقرار نرم‌افزار تغییرات انجام شده در کد، تست آن تغییرات و مدت زمان تحویل برنامه به مشتری است. امروزه با توجه به سرعت پیشرفت تکنولوژی وافزایش نیاز مشتریان به سرویس‌های نرم‌افزاری لازم است تا مراحل تولید نرم‌افزار از انجام تغییرات برروی کد تا استقرار برروی سرور سریع و به صورت خودکار انجام شود. از این رو مفهومی به نام تحویل مدام معرفی شد که در آن پس از هر بار تغییر کد و بروزرسانی به صورت خودکار پروژه ساخته، تست و مستقر برروی محیط محصول می‌شود تا دردسترس کاربر قرار گیرد. این کار ضمن کاهش زمان بروزرسانی و تولید محصول سبب می‌شود تا نرم‌افزار با خطا و باگ کمتر و درنتیجه با اطمینان بیشتری در اختیار کاربر قرار بگیرد. همچنین توسعه دهندگان این فرصت را دارد که برروی انواع تست‌های نرم‌افزاری وقت بگذارند و بخش‌های مختلف کد را بررسی کنند و تست برای آن‌ها بنویسند زیرا تست‌ها دیگر به صورت خودکار در حال اجرا هستند. همچنین در هر مرحله از تست اگر باگی ایجاد شود، توسعه دهندگان سریع متوجه آن خواهند شد و از طرفی می‌دانند که آن باگ در کجا اتفاق افتاده و می‌توانند بروند به همان قسمتی آن باگ رخ داده است. نرم‌افزارهایی هستند که این سرویس را به صورت رایگان و متن باز در اختیار توسعه دهندگان قرار می‌دهند و تیم‌های DevOpsیک سازمان می‌توانند با استفاده از این نرم‌افزارهای CI/CD خود را راه‌اندازی کنند. از جمله‌ی این سیستم‌های متن باز معروف می‌توان به JBossو Buddy است. اما شرکت‌هایی که تیم DevOps ندارد یا افرادی که بتوانند این نقش را بپذیرند می‌توانند از سرویس‌هایی که توسط شرکت‌های دیگر ارائه می‌شود استفاده کنند مانند شرکت‌های ایرانی لیارا و لاراهاست که با فعال کردن سرویس‌ این دو برروی github امکان ایجاد CI/CD فراهم می‌شودمراجعhttps://aws.amazon.com/devops/continuous-delivery/http://lara-host.ir/continuous-delivery/https://www.redhat.com/en/topics/api/what-does-an-api-gateway-dohttps://docs.liara.ir/cicd/gitlabhttps://www.tecmint.com/open-source-api-gateways-and-management-tools/https://virgool.io/@ar.oroumand/%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%D8%B3%D8%B1%D9%88%DB%8C%D8%B3%D9%87%D8%A7-%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-api-gateway-qaaprddghopfاین مطلب، بخشی از تمرین‌های درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است