استقرار نرمافزار در فرایند توسعه نرمافزار پس از ماهها تلاش و کدنویسی، بالاخره محصول آماده عرضه میشود. اما چطور میتوان محصول را به بهترین شکل به دست کاربران رساند؟ اینجاست که مفهوم استقرار نرمافزار (Software Deployment) مطرح میشود. در مطلب پیشرو شما را با استراتژیهای استقرار نرمافزار و مراحل پیادهسازی آن آشنا میکنیم.
استقرار نرمافزار به فرآیند انتشار، نصب و راهاندازی نرمافزار روی سرور یا سیستم کاربر نهایی گفته میشود. این فرآیند شامل مراحل مختلفی از جمله کپی فایلها، پیکربندی پایگاه داده، تنظیمات سرور و تستهای نهایی است. در واقع استقرار نرمافزار پلی است که کدهای نوشته شده را به یک محصول قابل استفاده برای کاربران تبدیل میکند. فرآیند استقرار نرمافزار به صورت دستی یا خودکار انجام شده و بسته به نوع نرمافزار و محیط استقرار، پیچیدگیهای خاص خود را دارد.
استراتژی استقرار نرمافزار نقشه راهی است که مشخص میکند چگونه، چه زمانی و با چه روشی نرمافزار به دست کاربران خواهد رسید. این استراتژی با در نظر گرفتن عوامل مختلفی مانند نوع نرمافزار، زیرساخت موجود، مخاطبان هدف و نیازهای کسبوکار تدوین میشود. یک استراتژی استقرار مناسب میتواند ریسکهای احتمالی را کاهش داده، زمان استقرار را به حداقل رسانده و در نهایت به تجربه کاربری بهتر منجر شود. انتخاب استراتژی مناسب مانند انتخاب مسیر درست در یک سفر است. مسیری که میتواند ما را سریعتر، ایمنتر و با کمترین هزینه به مقصد برساند.
بدون فرایند استقرار، عملا نرمافزاری وجود نخواهد داشت که کاربر بتواند از آن استفاده کنند. کد نوشته شده تا زمانی که مستقر نشود، تنها مجموعهای از فایلها روی کامپیوتر است. این استقرار نرمافزار است که کدها را به یک محصول کاربردی تبدیل کرده و در دسترس کاربران قرار میدهد. نیاز به استقرار نرمافزار مانند نیاز به چاپ کتاب پس از نوشتن آن است. تا زمانی که کتاب چاپ و منتشر نشده، کسی نمیتواند از محتوای آن بهرهمند شود.
انواع استراتژی استقرار نرمافزار استقرار نرمافزار با استراتژیهای مختلفی انجام میشود که بر اساس ویژگیهای نرمافزار، گروه هدف و سیستم انتخاب میشوند. استراتژیهای استقرار نرمافزار به دو دسته پایه و پیچیده تقسیم میشوند. رایجترین روشهای پایه Recreate و Rolling هستند که میتوان آنها را باهم ترکیب و راهبردهای جدیدی ایجاد کرد. از استراتژیهای پیچیدهتر باید به موارد زیر اشاره کرد:
استراتژیهای پایه رویکردی ساده و کارآمد دارند که در ادامه به توضیح آن میپردازیم.
در استراتژی استقرار Recreate تمام نسخههای فعلی نرمافزار به طور کامل از محیط تولید حذف شده و نسخه جدید جایگزین آنها میشود. در واقع تیم توسعه مشابه زمانی عمل میکند که نرمافزار برای اولین بار نصب و مستقر میشود.
این نوع استقرار مناسب زمانی است که نرمافزار نیاز به استقرار ساده و بدون پیچیدگی داشته و قطع موقت سرویس برای کاربران مشکلی ایجاد نکند. در پروژههای کوچک، تیمهای با منابع محدودی یا مواردی که بهروزرسانی به ندرت انجام میشود، میتوان از این روش استفاده کرد.
در استراتژی استقرار Rolling به جای غیرفعالسازی همزمان نسخههای قبلی، بهروزرسانی به صورت تدریجی و گامبهگام انجام میشود. در این روش تا زمانی که نسخه جدید به طور کامل جایگزین شود، چند سرور یا نمونه از نسخه قدیمی فعال میمانند. بدین ترتیب در طول فرآیند استقرار، سرویسدهی به کاربران همچنان ادامه خواهد داشت.
این روش برای سیستمهای حساس و پیچیدهای ایدهآل است که باید بدون وقفه در دسترس باشند. همچنین اجرای همزمان نسخههای قدیمی و جدید به شما اجازه میدهد در صورت وقوع مشکل به سرعت به نسخه قبلی بازگردید.
مراحل پیادهسازی استراتژی استقرار Rolling بسته به نوع نرمافزار و زیرساخت متفاوت است اما معمولا شامل این مراحل میشود:
این چرخه استقرار تا بهروزرسانی کامل سیستم ادامه پیدا میکند.
روشهای قدیمی استقرار نرمافزار در زمان خود کارایی مناسبی داشتند اما با پیچیدهتر شدن سیستمها، معایب ریز و درشت آنها آشکار شده است. در ادامه به بررسی مهمترین مشکل استقرار به روش قدیمی یعنی رانش پیکربندی و راهحل آن میپردازیم.
رانش پیکربندی یا Configuration Drift به تغییرات ناخواسته یا پیشبینینشده در تنظیمات سرورها و زیرساخت (محیط توسعه، تست و تولید) اشاره دارد. در این وضعیت پیکربندی محیطهای مختلف به مرور زمان و به دلایلی مثل عدم مستندسازی یا توجهنکردن به جزئیات از هم متفاوت میشوند. این تفاوت میتواند باعث ناسازگاری و خطا در سیستمها شده و عیبیابی و رفع مشکل را دشوار کند. تیم توسعه با بهکارگیری ابزارهایی مثل Chef ،Puppet و Ansible در مدیریت پیکربندی، میتواند از رانش پیکربندی جلوگیری کند.
Immutable Server به سرورهای ایستایی گفته میشود که پس از استقرار، دیگر تغییر نمیکنند. هر گونه بهروزرسانی یا تغییر پیکربندی بهجای اعمال مستقیم بر روی سرور با جایگزینی سرور قدیمی با سرور جدید انجام میشود. این رویکرد تا حد زیادی از ایجاد رانش پیکربندی جلوگیری میکند چون پیکربندیها ثابت و بدون تغییر باقی میمانند.
استقرار نرم افزار فرایندی چند مرحلهای است که از آمادهسازی محیط تا نظارت بر عملکرد نرم افزار را شامل میشود. در ادامه این مراحل را با هم مرور میکنیم.
بهترین استراتژیهای استقرار مزایا و معایب خاص خود را دارند و باید بر اساس نیازهای تیم توسعه و کاربران نهایی انتخاب شوند. تیم توسعه برای به حداقل رساندن ریسکها و مشکلات پس از استقرار میتواند از فرآیندهایی استفاده کند که در ادامه توضیح میدهیم.
هیچ پروژه نرمافزاری بدون نقشه راه به سرانجام نمیرسد. چک لیست استقرار، حکم همین نقشه راه را دارد و تضمین میکند که هیچکدام از مراحل حیاتی از قلم نیوفتد. از آمادهسازی سرورها گرفته تا تستهای نهایی، همه چیز باید دقیقاً طبق برنامه پیش برود. با داشتن یک چک لیست دقیق میتوان از بروز خطاهای انسانی و سیستمی جلوگیری کرده و فرآیند استقرار را بهینه کرد.
ادغام مداوم به تیمهای توسعه اجازه میدهد تا کدهای جدید را به صورت مکرر و با سرعت بالا به مخزنهای مرکزی اضافه کنند. هربار که کدی به مخزن اضافه میشود، تستهایی از پیش تعریفشده به صورت خودکار اجرا میشوند. این فرآیند به کاهش ریسک کمک میکند زیرا با تستهای خودکار و مداوم، مشکلات به سرعت شناسایی و پیش از استقرار نهایی رفع میشوند. از جمله ابزارهای محبوب ادغام مداوم میتوان به Jenkins، GitLab CI/CD، CircleCI و Travis CI اشاره کرد.
اگر ادغام مداوم را رهبر ارکستر در نظر بگیریم، تحویل مداوم حرفهایترین نوازنده گروه است که قطعه نهایی را اجرا میکند. این فرایند استقرار نرمافزار را خودکارسازی کرده و تضمین میکند که نسخه جدید، به سرعت و بدون دردسر در اختیار کاربران قرار گیرد. مکانیزم CD به تیمها کمک میکند تا با اطمینان بیشتری نرمافزار را به محیطهای عملیاتی منتقل کرده و ریسکهای ناشی از استقرار دستی را کاهش دهند.
محیطهای عملیاتی استاندارد (SOE) به تیمهای توسعه و عملیات کمک میکنند تا برای استقرار نرمافزار محیطهای یکسان و قابل پیشبینی داشته باشند. با این کار احتمال بروز خطاهای محیطی کاهش یافته و استقرار نرمافزار در شرایط پایدار و قابل پیشبینی انجام میشود.
در فرایند توسعه زمان ارزشمندترین دارایی تیم است و نباید صرف مواردی مثل تنظیم دستی سرور شود. استفاده از ابزارهای خودکار برای ساخت محیطها مانند Terraform یا CloudFormation به تیمها امکان میدهد تا محیط عملیاتی را با دقت و سرعت بیشتری ایجاد کنند. این ابزارها نه تنها به صرفهجویی در زمان کمک میکنند، بلکه ریسک خطای انسانی را هم به حداقل میرسانند.
ابزارهای مدیریتی مانند Puppet یا Chef به تیمها کمک میکنند تا پیکربندی سیستمها و نرمافزارها را به صورت خودکار و متمرکز مدیریت کنند. این ابزارها با کاهش پیچیدگیهای مدیریت دستی و هماهنگی بیشتر بین تیمها، ریسکهای مربوط به ناسازگاری پیکربندی را کاهش میدهند. همچنین در صورت بروز مشکل به تیم کمک میکنند تا به سرعت به نسخه قبلی برگردند.
ارتباط موثر بین اعضای تیم، رمز موفقیت است. پلتفرمهای ارتباطی مثل اسلک این ارتباط را تسهیل کرده و تضمین میکنند که همه اعضای تیم از آخرین تغییرات و وضعیت پروژه باخبر هستند.
گاهی اوقات، با وجود تمام تلاشها برای استقرار بدون مشکل نرمافزار خطاهایی رخ میدهد. در این موارد باید سیستم هشداری وجود داشته باشد که تیم مسئول را به سرعت از مشکل ایجاد شده مطلع کند. هشدارها باید بهصورت خودکار و در لحظه ارسال شوند تا تیم بتواند در اولین فرصت مشکل را بررسی و حل کند.
برای استقرارها فعالسازی قابلیت بازگشت به عقب خودکار (Rollback) برای کاهش ریسک در صورت بروز خطاهای غیر منتظره بسیار حیاتی است. این قابلیت مثل یک دکمه جادویی سیستم را به سرعت به حالت پایدار قبلی برمیگرداند.