در حالی که قرار نیست هر پروژه ای به موفقیت بزرگی دست یابد، با این حال، متدولوژی ها و شیوه های نرم افزاری وجود دارد که می تواند شانس موفقیت یک پروژه را به طور چشمگیری افزایش دهد و توسعه را به تجربه لذت بخشی تبدیل کند. یکی از این شیوه ها یکپارچه سازی مستمر (Continuous Integration) است.
در ابتدا به عنوان یک روش برنامه نویسی افراطی پذیرفته شد و هدف اصلی آن جلوگیری و اجتناب از مشکلات یکپارچه سازی است.
بنابراین بیایید بیاموزیم که یکپارچه سازی مستمر چیست و چگونه می تواند به شما کمک کند تا به توسعه دهنده نرم افزار بهتری تبدیل شوید.
در این مقاله، شما یاد میگیرید:
- Continuous Integration چیست؟
- مزایای استفاده از Continuous Integration
- ملزومات
- توضیحات بیشتر در مورد سرورهای Continuous Integration
- مسئولیت شما در زمان استفاده از Continuous Integration
- Continuous Integration در مقابل Continuous Delivery
- مشکلات احتمالی
داشتن این دانش، شما را نسبت به بسیاری از افرادی که کورکورانه وارد دنیای CI میشوند ماهرتر میکند. پس از اینکه اینجا، Continuous Integration را یاد گرفتید، به سراغ ابزارهای برتر Continuous Integration بروید تا بهترین ابزار را برای خودتان انتخاب کنید.
اگر بیشتر به توسعه اپلیکیشن موبایل علاقه دارید، میتوانید فهرست ابزارهای Continuous Integration موبایل را نیز بررسی کنید.
Continuous Integration چیست؟
Continuous Integration عمل یکپارچه سازی مستمر تغییرات ایجاد شده در پروژه و آزمایش آنها بر اساس حداقل به صورت روزانه یا بیشتر میباشد.
مارتین فاولر این را به خوبی بیان کرده است:
Continuous Integration یک روش توسعه نرم افزار است که در آن اعضای یک تیم کار خود را به طور مکرر یکپارچه می کنند، معمولاً هر فرد حداقل به صورت روزانه، کار یکپارچه سازی را انجام میدهد – که منجر به یکپارچگی های متعدد در روز می شود. هریک از یکپارچگی ها توسط یک build خودکار (شامل آزمایش) تأیید می شود تا خطاهای یکپارچه سازی در سریع ترین زمان ممکن شناسایی شوند. بسیاری از تیمها به این مهم رسیدند که این رویکرد منجر به کاهش قابل توجه مشکلات یکپارچهسازی میشود و به تیم این اجازه را میدهد تا نرمافزار منسجمی را با سرعت بیشتری توسعه دهند.
مارتین فاولر
خودکارسازی فرآیندهای ساخت، آزمایش و استقرار میتواند بسیاری از دردسرها و مشکلاتی که معمولاً در پروژهها اتفاق میافتد را کاهش دهد. داشتن یک روش قابل اعتماد برای یکپارچه کردن تغییرات به طور مکرر، این تضمین را میدهد که خطاها پیش از اینکه دیر شود پیدا خواهند شد. اگر بروز یک مشکل انسدادی در پروژه که درست در روز آزمایش، در نتیجه بخشی از کدی که چند ماه قبل آن را پیادهسازی کردهاید ظاهر شود و همچنین فرصت مناسبی نیز برای آزمایش با سایر بخشهای سیستم خود نداشته باشید، اصلا اتفاق خوشایندی نمیباشد.
همه ما این را قبول داریم که داشتن یک مشکل مسدودی در پروژه که درست در نسخه نمایشی ظاهر میشود، تجربه خوشایندی نیست.
CI می تواند در این مورد خیلی به شما کمک کند.
در اینجا نحوه شکلگیری چرخه حیات CI آمده است:
مزایای استفاده از Continuous Integration
استفاده از CI به دلایل زیادی سودمند است.
کاهش ریسک یکپارچه سازی. اغلب اوقات، کار بر روی پروژه ها به این معنی است که افراد متعددی روی task ها یا بخش هایی از کد به طور جداگانه کار می کنند. هر چه تعداد افراد بیشتر باشد، یکپارچگی ریسک بیشتری دارد. بسته به اینکه مشکل واقعا چقدر بد باشد، اشکال زدایی و حل مشکل می تواند واقعاً زجرآور باشد و به طور بالقوه می تواند به معنای تغییرات زیادی در کد باشد. یکپارچه سازی به صورت روزانه یا حتی بیشتر می تواند به حداقل رساندن این نوع مشکلات کمک کند.
کیفیت بالاتر در کد. عدم نگرانی در مورد مشکلات، و تمرکز بیشتر بر روی عملکرد کد، منجر به کیفیت بالاتر محصول می شود.
کارکرد کد در version control. اگر کاری را مرتکب شوید که build را خراب کند، شما و تیمتان فوراً اخطار دریافت میکنید و مشکل قبل از اینکه کسی کد “مورد دار” را دریافت کند (pull)، برطرف میشود.
کاهش اختلاف بین اعضای تیم. وجود یک سیستم بی طرفانه باعث کاهش مشاجرات مکرر بین اعضای تیم می شود.
بهبود کیفیت زندگی آزمایش کنندگان. داشتن نسخهها و build های مختلف کد میتواند به جداسازی و ردیابی مؤثر خطاها کمک کند و زندگی را برای تیم QA آسانتر میکند.
زمان کمتر استقرار. استقرار پروژه ها می تواند بسیار خسته کننده و وقت گیر باشد و خودکار کردن این فرآیند کاملاً منطقی است.
افزایش اعتماد به نفس و روحیه. افرادی که از ترس خراب کردن چیزی کار نمیکنند، به احتمال زیاد نتایج بهتری را ارائه میدهند و میتوانند انرژی و تمرکز خود را به جای نگرانی در مورد عواقب بالقوه اعمال خود، بر روی تولید متمرکز کنند.
یکی از اثرات جانبی همه این مزایا این است که اعضای تیم جدید زمان بسیار آسان تری برای ورود به پروژه خواهند داشت. داشتن یک چشم انداز روشن از فرآیند ساخت می تواند تا حد زیادی سرعت انطباق جدیدترین توسعه دهنده در تیم را افزایش دهد.
ملزومات
اما ممکن است از خود بپرسید که الزامات نصب سیستم CI برای نیازهای شما چیست. اگر می خواهید سرور CI را در محیط شخصی خود نصب کنید، ابتدا به چند چیز نیاز دارید.
اولین نیاز، داشتن سیستم کنترل نسخه یا همان version control system (VCS) است. هیچ راهی برای دور زدن آن وجود ندارد و نباید هم وجود داشته باشد. VCS یک روش قابل اعتماد برای متمرکز کردن و حفظ تغییرات ایجاد شده در پروژه شما را در طول زمان ارائه می دهد.
اگر از راه حل های موجود در محل استفاده می کنید، یکی دیگر از نیازها داشتن یک سرور یا ایستگاه کاری یدکی یا حداقل یک ماشین مجازی است. داشتن یک ماشین تمیز برای ساخت سیستم شما از اهمیت اساسی برخوردار است.
اگر نمیخواهید با سرورها یا ماشینهای مجازی سر و کار داشته باشید، راهحلهای ابزار CI میزبانی شده زیادی وجود دارد که نگهداری کل فرآیند را انتزاعی کرده و مقیاسپذیری آسانتری را ارائه میکند. معایب سیستم های میزبان معمولاً عدم وجود گزینه های پیکربندی است که ابزارهای خود میزبان (self-hosted) ارائه می کنند.
اگر نوع self-hosted را انتخاب کنید، باید بین بسیاری از ابزارهای continuous integration، یکی را نصب کنید.
از نظر فنی، ابزار CI به خودی خود مورد نیاز نیست، مانند IDE که برای توسعه نرمافزار مورد نیاز نیست، اما پیاده سازی continuous integration بدون کمک این ابزار بسیار سختتر خواهد بود.
شناخته شده ترین و مورد استفاده ترین ابزارهای CI عبارتند از Jenkins، TeamCity، Bamboo، Go…
سرورهای Continuous Integration
سرور Continuous Integration (مرسوم به build server یا CI server) یک ابزار نرم افزاری است که تمام عملیات CI شما را متمرکز می کند و یک محیط قابل اعتماد و پایدار برای شما فراهم می کند تا پروژه های خود را بر روی آن بسازید. سرورهای CI بسیار قابل پیکربندی و قابل تنظیم هستند تا بتوانند پروژه های مختلفی را برای پلتفرم های مختلف بسازند. اجرای build ها و تست ها از ویژگی های اساسی هر build server میباشد.
مهم ترین نکته ای که در هنگام استفاده از سرور CI باید در نظر گرفت این است که یک ماشین تر و تمیز برای نصب آن آماده شده باشد. داشتن یک محیط خنثی، مصون از ابزارهای غیر ضروری، متغیرهای محیطی و سایر تنظیمات، برای استفاده موفق از سرور CI و به طور کلی CI بسیار مهم است. اگر امکان نصب ماشین فیزیکی سرور CI وجود ندارد، می توانید یک محیط مجازی راه اندازی کرده و از آن به عنوان آخرین راه حل استفاده کنید.
استفاده از ماشینهای توسعه بدون راهاندازی محیطهای مجازی احتمالاً شما را با فرضیات و نتایج نادرستی مواجه میکند. هنگامی که اپلیکیشن را در ماشین دیگری مستقر می کنید، ممکن است با مشکلات جدیدی مواجه شوید.
به طور معمول سرور CI از یک سیستم version control مانند Subversion یا Git یا هر سیستم دیگری برای دریافت کردن فایل های پروژه شما استفاده می کند. این سرور، repository پروژه شما را رصد کرده و در صورت موفقیت آمیز بودن، تغییرات را اعمال می کند و task هایی را که قبلا برای آن پروژه تعریف کرده بودید را انجام می دهد. پس از تکمیل task ها، سرور CI بازخوردی را با جزئیات build به اعضای پروژه مربوطه ارسال می کند. بررسی آخرین نسخه پروژه، اجرای اسکریپتهای build، اجرای آزمایشها و ارسال اعلانها از اساسیترین قابلیتهای سرورهای CI هستند.
علاوه بر اینها، ویژگی هایی مانند تجزیه و تحلیل کد، cover کردن کد، گزارش های کیفیت کد، pipeline ها،
agent pooling، مقایسه build ها، یکپارچه سازی IDE، پشتیبانی از ابزارهای third-party و خیلی از ویژگیهای دیگر، سرورهای CI را جهت استفاده، بسیار انعطاف پذیر و راحت میسازد.
همه مسئول هستند
حتی مهمتر از نیازهای سختافزاری یا نرمافزاری، توانایی تیم در اتخاذ رویکرد مسئولانه برای پیاده سازی CI است. به منظور استفاده موثر از CI، توسعه دهندگان باید عادات توسعه نرم افزار روزانه خود را تغییر دهند. این عادات روشهای توسعه نرمافزار خوبی هستند که حتی بدون وجود یک سیستم continuous integration، باید از آنها استفاده کنید.
شش روش وجود دارد که به افراد و تیم هایی که CI را در یک پروژه اجرا می کنند کمک می کند:
- Commit کردن مکرر کد
- commit نکردن کدهای مخرب
- نوشتن تستهای واحد
- رفع فوری build های مخرب
- تمام تستها باید پاس شوند
- جلوگیری از break شدن کد
این بدان معناست که نباید آخرین تغییرات را درست قبل از وقت ناهار یا درست قبل از رفتن به خانه بررسی کنید. برای اطمینان از موفقیت آمیز بودن build ، باید منتظر گزارش build باشید و اگر اینطور نیست، شما باید آن را رفع کنید.
از سوی دیگر، همیشه باید مراقب build هایی که منجربه break شدن پروژه میشوند باشید، حتی اگر تقصیر شما نبوده باشد، زیرا بررسی break build یا ریز شدن روی آن میتواند روند رفع مشکل را طولانیتر کند.
Continuous Delivery و Continuous Deployment
به طور معمول چرخه عمر CI، شامل build کردن پروژه، تست واحد، استقرار در مرحله و تست پذیرش است. هنگامی که پروژه با موفقیت تمام این مراحل را پشت سر گذاشت، آماده استقرار در محیط production است.
تحویل پروژه به محیط production می تواند مانند بقیه مراحل به صورت خودکار انجام شود. اما به دلیل نگرانی های مربوط به business، ممکن است انجام آن به صورت دستی مناسب تر باشد. در مورد اول، ما در مورد Continuous Delivery و در مورد دوم، در مورد Continuous Deployment صحبت می کنیم.
نمودار زیر تفاوت بین این سه عبارت را نشان می دهد:
مشکلات احتمالی
نگرانی هایی وجود دارد که ممکن است افراد را از استفاده از CI در پروژه های خود منصرف کند.
- افزایش سربار نگهداری پروژه.
شما در حال حاضر نیاز به build، تست و استقرار سیستم های خود دارید. اگر این فرآیندها را با CI مدیریت نکنید، توسط این فرآیندها مدیریت خواهید شد. هنگامی که پروژه به پیچیدگی خاصی می رسد، مدیریت آن فوق العاده سخت می شود.
2. تغییر خیلی زیاد.
افراد ممکن است تمایلی به ایجاد تغییرات زیادی برای اجرای CI در سیستم قدیمی خود نداشته باشند. اگر اینطور است، می توانید به راحتی هر بار CI را به سیستم معرفی کنید. هنگامی که اعضای تیم با نتایج مشکلی نداشتند، CI را می توان به قسمت های دیگر نیز معرفی کرد.
3. هزینه های سخت افزار و نرم افزار.
هزینه های اجرای یک CI ممکن است توسط توسعه دهندگان و مدیریت پروژه غیرضروری تلقی شود. اما این هزینهها در مقایسه با هزینههای نگهداری و یافتن مشکلات بعدی، هزینه های حاشیهای به حساب می آیند.
4. توسعه دهندگان در حال حاضر تمام این عملیات را انجام می دهند.
اما مطمئنا آنها می توانند زمان بیشتری را برای ایجاد عملکرد و حل مشکلات business سرمایه گذاری کنند. ماشینها در انجام وظایف تکراری بهطور قابلاطمینانی برتر هستند.
5. پروژه خیلی کوچک است.
حتی کوچکترین پروژه ها نیز می توانند از CI بهره مند شوند. مخصوصاً با انبوهی از ابزارهای آنلاین Continuous Integration که راه اندازی آنها بسیار آسان است.
حتی کوچکترین پروژه ها نیز می توانند از شفافیت فرآیند توسعه و متمرکزسازی منابع پروژه و build ها بهره مند شود.
نتیجه گیری
شیوه های Agile و Continuous Integration دست به دست هم می دهند. دیگر نمی توانید بدون استفاده از CI کار یا تجارت خود را جدی بدانید.
انتشارهای به ندرت نرم افزار، چیزی مربوط به گذشته است و بسیاری از شرکت های پیشرو و موفق در حال حاضر به طور فعال از این تکنیک ها با نتایج خوب استفاده می کنند، آمازون با ایجاد تغییرات در تولید هر 11.6 ثانیه یکی از پیشتازان این عرصه است (May 2011).
راه اندازی سیستم continuous integration برای پروژه شما می تواند یک کار بالقوه پرهزینه و وقت گیر باشد. اما بدهی فنی ناشی از عدم استفاده از CI می تواند چندین برابر بیشتر باشد.