Continuous Integration یا به اختصار CI که میتوان معادلهایی همچون «ادغام مداوم» یا «یکپارچهسازی مستمر» برایش در نظر گرفت به مجموعهای از اقدامات گفته میشود که طی آنها تغییرات جدید در سورسکدی که روی سیستم تکتک توسعهدهندگان قرار دارد با ریپازیتوری اصلی ادغام یا یکپارچه میشوند به طوری که هر تغییری در سورسکد در سریعترین زمان ممکن و همچنین به صورت خودکار چند بار در روز تست و بیلد میگردد. لازم به یادآوری است که CI ارتباط تنگاتنگی با CD دارد که دو تعریف از آن وجود دارد که عبارتند است از:
- Continuous Delivery یا به اختصار CD این تضمین را ایجاد میکند که نرمافزار حاوی هیچگونه مشکلی نبوده در هر لحظهای میتواند روی سرورهای اصلی دیپلوی گردد.
- Continuous Deployment یا به اختصار CD به صورت خودکار آخرین تغییرات صورت گرفته روی سورسکد را پس از اطمینان حاصل شدن از کارکرد صحیح نرمافزار روی سرور اصلی دیپلوی میکند.
با این توضیحات میتوان گفت که خروجی Continuous Integration که نسخهای یکپارچه از کلیهٔ تغییرات است از طریق Continuous Delivery به پکیجی آماده جهت دیپلوی روی سرور مبدل میگردد و Continuous Deployment هم این امکان را برایمان فراهم میآورد تا این کار را به صورت خودکار انجام دهیم.
آشنایی با تاریخچهٔ CI
پیش از سال 2000 نیز ایدهٔ «ادغام مداوم» مطرح بود به طوری که در متودولوژی Extreme Programming یا به اختصار XP به کار گرفته میشد اما در این سال Martin Fowler، برنامهنویس مشهور بریتانیایی، در مقالهای تحت عنوان Continuous Integration به خوبی اهمیت این موضوع را در صنعت توسعهٔ نرمافزار خاطر نشان ساخت و سال بعد (2001) اولین ابزار در این حوزه تحت عنوان CruiseControl به صورت اپنسورس به بازار عرضه شد و از آن موقع به بعد ابزارهای رایگان و غیررایگان بیشماری در این حوزه در اختیار تیمهای مهندسی قرار گرفت.
CI چه ارتباطی با Agile دارد؟
در فرآیند توسعهٔ نرمافزار به روش سنتی هرگز مشخص نمیشد که فیچرهای جدیدی که به سورسکد اضافه میشدند در چه بازههای زمانی میبایست با ریپازیتوری اصلی یکپارچه گردند و هر کدام از توسعهدهندگان با کمترین میزان تعامل با دیگران به کار خود میپرداخت غافل از اینکه در آینده با چه مسائل و مشکلاتی ممکن بود مواجه گردد اما در تیمهایی که با متودولوژی اجایل (چابک) کار میکنند باید این تضمین ایجاد گردد که نسخههای جدید نرمافزار در سریعترین زمان ممکن اما در عین حال با بیشترین میزان اعتماد نسبت به کارکرد صحیح آنها ایجاد میگردند مضاف بر اینکه هر گونه مانعی که بر سر راه تعامل مابین افراد درگیر پروژه و حتی مشتری باشد باید حذف گردد به علاوه اینکه تغییرات مورد نیاز باید در سریعترین زمان ممکن پیادهسازی شوند و اینجا است که Continuous Integration میتواند نقش بسیار مهمی ایفا کند.
در حقیقت، با توجه به اینکه از طریق CI میتوان این تضمین را ایجاد کرد که نسخهٔ مختلف از یک سورسکد در تیمی از دولوپرها بدون هیچ مشکلی با یکدیگر یکپارچه میشوند، تیمهای اجایل میتواند با خیال راحت همواره نسخهای نهایی از نرمافزار را داشته باشند که به درستی و بدون هیچگونه کانفیلیکت (مغایرت) مابین تغییرات اِعمالشده توسط تکتک توسعهدهندگان بیلد شده است و آمادهٔ دیپلوی روی سرور اصلی است.
با این تفاسیر، «ادغام مداوم» به تکتک اعضای تیم کمک میکند تا خیلی سریعتر نسبت به تغییرات دیگران فیدبک بگیرند و از آنجا که در این پروسه نیاز است تا یکسری Unit Test به منظور اطمینان حاصل کردن از درست کار کردن پروژه نوشته شود، در نهایت اعضای تیم مهندسی با پروژهای تعامل خواهند داشت که هیچگونه فیچر جدیدی که حاوی حتی کوچکترین باگ باشد به پروژه اضافه نخواهد شد.
CI چه ارتباطی با DevOps دارد؟
دوآپس بیش از هر چیزی با فرهنگ سازمانی مرتبط است بدین صورت که دربرگیرندهٔ تکنیکهایی است که موانع موجود مابین همکاری روان مابین بخشهای عملیاتی و مهندسی را به حداقل میرساند به طوری که اعضای تیمها و دپارتمانهای مختلف قادر خواهند شد تا با حداقل چالش با یکدیگر به همکاری بپردازند که چنین فرهنگی در نهایت همراستا با متودولوژی اجایل شده و پروسهٔ توسعهٔ نرمافزار را تسهیل میکند. اساساً در چنین فرهنگی همهٔ اعضای تیم مسئول هستند و کسی از مشکلات احتمالی موجود شانه خالی نخواهد کرد.
در چنین فضایی، CI میتواند پروسهٔ بازخورد دادن و بازخورد گرفتن یا به عبارتی ارتباطات مابین اعضای تیم توسعهٔ نرمافزار را تسهیل کند بدین گونه که توسعهدهندگان در سریعترین زمان ممکن تَسکهایی که به ایشان واگذار شده را پس از اطمینان حاصل کردن از کارکردن صحیحشان و موفقیتآمیز بودن پروسهٔ بیلد، روی ریپازیتوری اصلی میفرستند و این در حالی است که نسخهای که روی این ریپازیتوری قرار دارد حاوی هیچگونه مشکلی نیست و همین میشود که تعامل مابین تیمهای توسعه و عملیاتی (دوآپس) بسیار شفاف خواهد شد.
CI چه مزیتهایی دارا است؟
با توجه به اینکه انجام CI چند بار در روز و در بازههای زمانی کوتاهمدت صورت میگیرد، این تضمین ایجاد میگردد تا در تیمهایی که چندین دولوپر مختلف روی سورسکدی واحد کار میکنند توسعهدهندگان بتوانند با حداقل مشکل به توسعهٔ سورسکد پرداخته و مشکلات احتمالی در سریعترین زمان ممکن یافته شوند که با مد نظر قرار دادن آنچه تاکنون گفته شد، میتوان اهداف «ادغام مداوم» را به صورت زیر خلاصه نمود:
- فیدبک (بازخورد) گرفتن سریع
- یافتن زودهنگام باگهای نرمافزاری
- تسهیل همکاری مابین اعضای تیم توسعهٔ نرمافزار
- به حداقل رساندن هرگونه بدهی فنی
- به حداقل رساندن تلاش مورد نیاز و همچنین زمان لازم در هر بار یکپارچهسازی تغییرات روی ریپازیتوری اصلی
- برخورداری مداوم از نسخهای کارا از نرمافزار
- امکان بازگشت به نسخهٔ قبلی در صورت کارا نبودن نسخهٔ جدید با استفاده از ورژن کنترل
به طور کلی، میتوان گفت برای اینکه بتوانیم یکپارچهسازی مداوم سورسکدهای مختلف با ریپازیتوری اصلی را به بهترین شکل ممکن پیادهسازی کنیم، دائماً میباید آنالیز سورسکد، انجام یونیت تست، کامپایل/بیلد پروژه و در نهایت گزارشدهی از روند انجام این مراحل صورت گیرد و مسلماً Continuous Integration کمک بسیاری در این حوزهها خواهد نمود.