مفهوم CI/CD و توسعه زیرساخت
در حوزهٔ دوآپس CI/CD دو سرواژهای هستند به دفعات استفاده میشوند و در این مقاله قصد داریم تا به بررسی تفاوتهای آنها بپردازیم. Continuous Integration یا به اختصار CI به طور خلاصه به پروسهای اشاره دارد که از آن طریق فیچرهای جدید به صورت خودکار با ریپازیتوری اصلی ادغام میشوند اما CD هم مخفف واژگان Continuous Delivery است و هم به Continuous Deployment اشاره دارد به طوری که اصطلاح اول به فرآیندی اشاره میکند که از آن طریق نرمافزار دائماً آماده دیپلوی است اما اصطلاح دوم سازوکاری است که به صورت خودکار کدهای آماده را روی سرور/سرورهای اصلی منتشر میکند (به طور کلی، این مفاهیم ارتباط تنگاتنگی با فرهنگ اجایل دارند که در آن تمرکز روی بهبود مستمر و انتشار قابلیتهای جدید در بازههای زمانی بسیار کوتاه است.)
Continuous Integration چیست؟
امروزه بسیار مرسوم است که گروهی از توسعهدهندگان روی ویژگیهای مختلف یک برنامه مشغول به کار باشند. در این حالت، شیوهی هماهنگی بین این توسعهدهندگان اهمیت زیادی پیدا میکند. ایجاد تغییر در نرمافزار توسط یک توسعهدهنده ممکن است با تغییرات همزمان سایر توسعهدهندگان در تعارض باشد. به این شکل، اگر تعداد دفعات ادغام کردن کدها پایین باشد، تیم دچار اتلاف وقت و انرژی خواهد شد.
CI با بالا بردن تعداد دفعههای ادغام کدها (حتی بهشکل روزانه) به توسعهدهندگان کمک میکند تا از بروز مشکل ایجاد شده، هر چه سریعتر آگاه شوند. هر زمان یک توسعهدهنده تغییری در کد ایجاد و با شاخهی اصلی کد ادغام کند، این تغییرات بهشکل خودکار با ساختن برنامه و اجرای سطوح مختلف تست ارزیابی میشوند تا از نبود مشکل بهدلیل اعمال تغییرات جدید، اطمینان حاصل شود.
Continuous Delivery چیست؟
در ادامهی CI/CD و به دنبال CI، فرایند Continuous Delivery انتشار تغییرات کد به مخزن مشترک را خودکار میکند. این موارد شامل خودکارسازی تست و انتشار کد است. همانگونه که ذکر شد، هدف اصلی Continuous Delivery آن است که یک مجموعه کد داشته باشیم که همیشه برای پیادهسازی و انتشار محصول توسط تیم عملیات آماده است.
Continuous Deployment چیست؟
مرحلهی پایانی یک CI/CD Pipeline قدرتمند، Continuous Deployment است. Continuous Deployment پس از مرحلهٔ قبل صورت میگیرد بدین شکل که هر تغییری که در سورسکد اِعمال میشود و با موفقیت تستهای مختلف را پشت سر بگذارد به صورت خودکار توسط سیستم روی سرور دیپلوی میشود و هرگز برای این کار نیازی به دخالت عاملِ انسانی نخواهد بود و تنها در صورتی این کار متوقف میگردد که سورسکد نتواند از پسِ تستها به صورت موفقیتآمیزی برآید. روی هم رفته میتوان گفت که از مزایای CD این است که توسعهدهندگان میتوانند تمرکز خود را روی کدنویسی گذاشته و انتشار خلاقیتهایی که به خرج میدهند را به سیستمهای کامپیوتری واگذار کنند.
آشنایی با مزایای Continuous Integration
پیش از آنکه به مزایای CI بپردازیم لازم به یادآوری است که برای این کار دولوپرها باید برای هر فیچر جدیدی که به نرمافزار یا اپلیکیشن اضافه میکنند و یا باگی را فیکس میکنند یک تست جداگانه بنویسند مضاف بر اینکه نیاز به یک سرور مجزا برای اجرای این فرآیند خواهیم داشت تا بتوان از آن طریق به محض کامیت کردن فیچرهای جدید، تستها را به صورت خودکار اجرا کرده و همچنین ریپازیتوری اصلی را مانیتور کرد (در این فرآیند توصیه میشود که تمامی اعضای تیم مهندسی تغییراتی که روی محیط لوکال خود اِعمال کردهاند را حداقل روزی یک بار با ریپازیتوری اصلی ادغام نمایند.)
با این تفاسیر، نیاز به توضیح نیست که اگر هم باگی در سورسکد وجود داشته باشد، در این فرآیند و با حضور تستهای مختلف تا حد ممکن جلوی آن گرفته خواهد شد و کلیهٔ مشکلات احتمالی در مراحل اولیه شناسایی شده و خیلی سریع توسط فردی که آن را ایجاد شده رفع میشوند به علاوه اینکه دیگر نیازی به تست دستی سورسکد نیست چرا که این کار به صورت خودکار توسط سروری که برایش در نظر گرفته شده است انجام خواهد شد و تیم تضمین کیفیت نیز زمان کمتری را معطوف به تست کردن قابلیتهای بدیهی کرده و میتواند تمرکز خود را روی بخشهای کلیدیتر بگذارد. در این فرآیند تستهای مختلفی به کار گرفته میشوند که مهمترین آنها عبارتند از:
– Unit Test: در این نوع تست یکسری فانکشنهایی وجود دارند که این وظیفه را دارند تا عملکرد سایر فانکشنها را تست کنند.
– Integration Test: این تست اطمینان حاصل میکند که کامپوننتهای مختلف به خوبی با یکدیگر سازگار هستند.
– Acceptance Test: این تست همچون مورد قبل است با این تفاوت که بیشتر از بُعد تجاری نرمافزار را محک میزند.
– UI Test: این تست تضمین میدهد که وقتی رابط کاربری در اختیار کاربران قرار گیرد، همانطور که از آن انتظار میرود کار خواهد کرد.
آشنایی با مزایای Continuous Delivery
همانطور که پیش از این اشاره کردیم، این فرآیند پس از CI صورت میگیرد بدین صورت که در هر زمانی که مشتری و یا تیم مهندسی تمایل داشته باشد، میتوان نسخهٔ جدید نرمافزار را روی سرور اصلی منتشر کرد مضاف بر اینکه با سرعت بیشتری میتوان فیچرهای جدید را در معرض دید کاربران نهایی نرمافزار قرار داده و بالتبع از ایشان برای اِعمال تغییرات یا بهبود بیشتر فیدبک گرفت.
همچنین نکتهای که در ارتباط با این فرآیند باید همواره مد نظر قرار داده شود آن است که کیفیت نرمافزار تحت هیچ عنوان نباید فدای سرعت انتشار آن گردد! به عبارت دیگر، گرچه CD این امکان را در اختیار تیمهای مهندسی نرمافزار میگذارد تا همواره آمادهٔ عرضهٔ آخرین نسخه از نرمافزار خود باشند، اما در عین حال داشتن اطمینان کامل از کارکرد صحیح بیلد یک باید است.
آشنایی با مزایای Continuous Deployment
این گام که آخرین مرحله از مراحل سهگانهٔ است از حساسیت بسیار بالایی برخوردار میباشد چرا که قرار است کلیهٔ تغییرات به صورت خودکار و بدون دخالت عامل انسانی صورت گیرند و اینجا است که باید از درست تست شدن سورسکد کاملاً اطمینان پیدا کنیم به طوری که هرچه تستها قابلاعتمادتر باشند، نسخهٔ ریلیس نهایی که به صورت خودکار دیپلوی میشود نیز از قابلیت اعتماد بیشتری برخوردار خواهد بود.
وقتی Continuous Deployment به فرآیند توسعهٔ نرمافزار ورود پیدا میکند، تیم توسعه با خیال راحت میتواند بر کدنویسی خود متمرکز باشد زیرا کدهایی که ایشان مینویسند قرار است ابتدا به صورت کامل توسط سیستم تست شده سپس به صورت خودکار روی سرور اصلی و بدون نیاز به دخالت ایشان دیپلوی شوند مضاف بر اینکه از دید کاربران نهایی نیز این مزیت شکل میگیرد که دائماً بهبودهایی را به صورت روزانه یا هفتگی در نرمافزار مورد استفادهٔ خود شاهد هستند و دیگر نیازی نیست تا روزها، هفتهها و یا ماهها برای انتشار نسخهٔ جدید نرمافزار یا اپلیکیشن صبر نمایند.