یکپارچهسازی مداوم و تحویل پیوسته (CI/CD) رویکرد نسبتا تازهای در روش توسعه نرمافزار است که هدف اصلی آن بالا بردن سرعت ساخت نرمافزار و بهبود کارایی آن بهصورت همزمان است. بخشهای اصلی این مدل، شامل یکپارچهسازی مداوم کدها، انجام تستها بهصورت خودکار و در ادامه توسعه مستمر نرمافزار در فرآیند ساخت تا لحظه تحویل به مشتری است.
مدل آبشاری و مشکلات آن
پیش از ایجاد CI/CD، مدل عام و رایج برای توسعه نرمافزارهای مختلف، «مدل آبشاری» بود. در مدل آبشاری، هر کدام از توسعهدهندگان نرمافزار در محیط ایزوله خود، بهتنهایی کار میکردند. در این حالت، هر مرحله از نرمافزار بهصورت مجزا ساخته شده و پس از اتمام، ساخت مرحله بعدی شروع میشد. در این روش قدیمی، معمولا توسعه و ساخت نرمافزار شامل مراحل مختلفی مثل جمعآوری نیازمندیها، طراحی نرمافزار، کدنویسی، اجرای تستهای مختلف و در نهایت اجرا و ساخت نرمافزار بود. در مدل آبشاری گاهی چند هفته زمان میبرد تا یک فیچر توسعه پیدا کند و به دست مشتری برسد.
مدل آبشاری معایب مختلفی داشت که چند مورد از مهمترین آنها شامل موارد زیر هستند:
- اجرای کند مراحل مختلف: از آنجا که در این مدل، مراحل باید بهنوبت و پشت سر هم اجرا میشدند، سرعت انتشار مراحل مختلف نرمافزار کمتر میشد و پاسخگویی به نیاز کاربر و ایجاد تغییرات مختلف بر اساس نیازهای او، بسیار سختتر بود.
- نرخ شکست بالا: در مدل آبشاری، احتمال بهنتیجه نرسیدن نرمافزار و شکست پروژه، به دلیل نبود تستهای خودکار، بسیار بیشتر بود. در واقع همه توسعهدهندهها باید بهصورت دستی، کدها را تست میکردند و این موضوع، احتمال وقوع خطا و ایجاد باگ در نرمافزار را افزایش میداد.
- همکاری محدود: امکان هماهنگی و همکاری بین بخشهای مختلف پروژه مثل بخش توسعهدهندهها، تستکنندگان و سهامداران، در مدل آبشاری بسیار کم و محدود بود و به همین دلیل، یافتن خطا و رفع خطاهای موجود به یک کار بسیار پیچیده و سخت تبدیل میشد.
- هزینه بالا: حالت سنتی و دستی توسعه نرمافزار، هزینه بالایی داشت و بخش عمده بودجه به بخش تست، یافتن باگها و رفع خطا تعلق میگرفت.
- کاهش سرعت و چابکی: روش قبلی توسعه نرمافزار کاملا خطی بود و به همین دلیل، امکان ایجاد تغییر سریع در نرمافزار و یا پاسخگویی به نیازهای جدید کاربر وجود نداشت.
CI/CD چیست؟
حالا و با این توضیحات اولیه، این سوال مهم ایجاد میشود که یکپارچه سازی مداوم یا همان CI و تحویل پیوسته یا همان CD به چه معنا است؟ در توضیح این دو باید بگوییم که بهصورت کلی CI/CD، روشی از توسعه نرمافزار است که با استفاده از آن، ساخت بخشهای جدید نرمافزار و بهروزرسانیهای آن در هر زمان از مراحل ساخت و انتشار، بهصورت کاملا قابل اطمینان و بدون آسیبزدن به بخشهای دیگر، قابل انجام است. وقتی در بخش کدنویسی، تغییرات بهصورت مستمر اتفاق میافتند، چرخههای توسعه نرمافزار هم بهصورت مداوم و سریعتری منتشر شده و به مرحله اجرا میرسند.
اصطلاح «CI/CD» ترکیبی از مخفف دو عبارت اصلی این مدل یعنی یکپارچه سازی مداوم یا Continuous Integration (CI) و تحویل پیوسته یا همان Continuous Delivery (CD) است. اصطلاح CI/CD علاوه بر معنای لغوی خود، نشاندهنده یک فرهنگ سازمانی و اصول اجرایی است. در زمان استفاده از CI/CD، تمام اعضای تیم توسعه عادت میکنند که همه تغییرات انجامشده روی کدهای خود را در بازههای زمانی کوتاهتر و به شکل پایدارتری روی سرور اصلی ثبت کنند.
برای انواع تیمهای اجرایی و عملیاتی (DevOps) و البته متدولوژی چابک، روش CI/CD بهترین رویکرد عملی است. در CI/CD دو فرآیند مهم یکپارچهسازی و اجرای نرمافزار بهصورت اتوماتیک انجام میشود و تیمهای توسعه نرمافزار با خیال راحت میتوانند نیازمندیهای سازمان را در نظر گرفته و نرمافزارهایی باکیفیت و امنیت بالا طراحی و تولید کنند.
برای استفاده از قابلیتهای CI/CD در کنسول همروش میتوانید راهنمای استفاده از Github Actions در مستندات همروش را مطالعه کنید.
عملکرد CI/CD چگونه است؟
بهصورت کلی باید بگوییم که CI/CD یک فرآیند خودکار است که سه فعالیت اصلی یعنی یکپارچهسازی و هماهنگی کدها را انجام میدهد، تستها را بهصورت خودکار اجرا کرده و تغییرات ادامهدار انجامشده در فرآیند توسعه نرمافزار تا لحظه رسیدن به تحویل نهایی محصول را برعهده میگیرد. اجازه دهید که این سه گام را کمی بیشتر توضیح دهیم:
یکپارچهسازی کدها
اولین بخش در فرآیند CI/CD، مرحله یکپارچه کردن کدها است. در این گام، هر کدام از توسعهدهندههای نرمافزار، کدهای خود را در یک سرور یا همان ریپازیتوری مثل گیتهاب، گیتلب یا بیتباکت، ثبت (Commit) میکنند. در اینجا، همه کدهای ثبتشده توسط کاربران مختلف پروژه، با هم ترکیب شده و در یک پایگاه داده مرکزی، بهصورت هماهنگ و یکپارچه قرار میگیرند.
هدف اصلی این کار، تضمین وجود یکپارچگی در بین بخشهای مختلف کد است. در واقع با این کار، فرآیند به شکل پایداری انجام شده و این اطمینان حاصل میشود که کدهای جدید، باعث تخریب بخشهای قبلی نشده و هماهنگی میان اجزای مختلف را از بین نمیبرند.
تست خودکار
بهمحض اینکه کدها با هم ترکیب و ادغام شدند، مرحله بعدی یعنی انجام خودکار تستها شروع میشود. این مرحله شامل اجرای چند مرحله ارزیابی و تست است که از طریق این تستها، این اطمینان ایجاد شود که تغییرات انجام شده در بخش قبلی، کارایی لازم را داشته باشد، کیفیت کدها در حد استاندارد تعریف شده باشد و از همه مهمتر اینکه کدها بدون خطا، اجرا شوند. این گام باعث میشود که خطاهای موجود در بخشهای مختلف کدنویسی، قبل از اجرای نهایی و در همین مراحل اولیه توسعه مشخص شوند تا بهراحتی بتوان آنها را رفع کرد.
استقرار پیوسته
بعد از اینکه تغییرات انجام شده بر روی کدها، از مرحله قبلی هم با موفقیت عبور کرد، به مرحله نهایی و به مرحله «استقرار پیوسته» میرسد. در این گام، همه تغییرات و کدهای جدید بهصورت خودکار به محیط اصلی نرمافزار افزوده شده و برای تستهای بیشتر آماده میشوند. اجرای این مرحله، این تضمین را ایجاد میکند که نرمافزار بهصورت مداوم با آخرین کدهای نوشته شده بهروز میشود و بخشهای کاربردی هم بهسرعت و با قابلیت اطمینان بالا به دست کاربران میرسند.
استقرار در Production
آخرین مرحله از روش CI/CD، بخش Production Deployment است. در این مرحله، همه تغییرات نرمافزار به دست کاربر نهایی میرسد. این مرحله هم شامل بخشهای مختلفی مثل نظارت بر محیط اجرای نرمافزار، اطمینان یافتن از اجرای راحت و بدون خطای آن و یافتن و رفع خطاهای احتمالی در بخشهای گوناگون است.
چهار گام روش CI/CD در کنار هم فعالیت کرده و تضمین میکنند که همه تغییرات نرمافزار با هم یکپارچه شده، تست میشوند و بهصورت کاملاً خودکار و بدون دخالت عوامل انسانی، در محیط نهایی نرمافزار اجرا شده و ثبت میشوند. این فرآیند خودکار باعث کاهش خطا خواهد شد، میزان کارایی را افزایش داده و باعث بهبود کلی کیفیت نرمافزار میشود.
با توجه به همه این مزایا، میتوان گفت که با استفاده از روش CI/CD، تیمهای توسعه نرمافزار میتوانند خیلی سریعتر مراحل مختلف و چرخههای نرمافزار را منتشر کنند، احتمال وجود خطاهای داخلی نرمافزار را کاهش دهند و تجربه بسیار بهتری در اختیار کاربران نهایی بگذارند.
البته توجه کنید که این مراحل در فرآیند CI/CD در پروژههای مختلف یا حتی در پروژههای مشابه ولی در سازمانهای مختلف، میتوانند متفاوت باشند. برای مثال، شاید در بعضی تیمها از تستهای خودکار استفاده نکنند، در برخی تیمها همه این مراحل چهارگانه را داشته باشند یا اصلا از این مرحلهبندیها استفاده نکنند. پس این روش توسعه نرمافزار، در هر محیط میتواند شکل تازهای به خود بگیرد و در همهجا، دقیقا به یک شکل اجرا نمیشود.
با وجود این، دو بخش مهم و کلیدی CI/CD، دو عامل یکپارچهسازی و Deployment هستند. بنابراین برای اینکه بگوییم یک تیم یا نرمافزار از روشCI/CD استفاده کردهاند، باید حتما کدها بهصورت مستمر و مداوم، در یک ریپازیتوری راه دور ثبت شده و این کدها باید بهصورت دائم و پس از هر یکپارچهسازی، در محیط اصلی اجرا شده باشند. حالا و پس از این توضیحات، یک سوال مهم دیگر هم ایجاد میشود:
تفاوت میان CI و CD چیست؟
یکپارچهسازی مداوم یا همان CI، شامل این بخش بسیار ساده و در عین حال خیلی مهم است که هر توسعهدهنده پس از ایجاد هر تغییر خیلی کوچک و جزئی در کدهای خود، تغییرات انجام شده را به کدهای اصلی اضافه کند. با توجه به حجم نیازمندیهای این کار و تعداد گامهایی که در این حالت ایجاد میشوند، فرآیند یکپارچهسازی مداوم در مدل CI باعث میشود که تیمها با خیال راحت کارهای ساخت، تست و جمعبندی نرمافزارهای خود را بهصورت مستمر و به شکلی کاملا تضمین شده و اتوماتیک، انجام دهند.
CI به سادهشدن فرآیند تغییر کدها کمک میکند و به همین خاطر، توسعهدهندهها با خیال راحت، میتوانند زمان خود را به بهبود کیفیت نرمافزار و ایجاد تغییرات بیشتر، اختصاص دهند.
حالا و بعد از این توضیحات، باید بدانیم که تحویل پیوسته یا همان CD دقیقا شامل چه چیزهایی میشود. تحویل پیوسته فرآیندی است که از طریق آن، کدهای کاملشده بهصورت کاملا خودکار به محیطهای مختلف مثل بخش تست یا توسعه، تحویل داده میشوند. در واقع CD یک فرآیند مستمر و کاملا خودکار فراهم میکند که کدها به هر کدام از محیطهای تست و توسعه برسند.
«استقرار پیوسته»، مرحله بعد از تحویل پیوسته است. هر تغییری که با موفقیت از بخش تستهای خودکار گذر کند، بهصورت اتوماتیک در بخش اجرایی نرمافزار جایگذاری خواهد شد و این فرآیند پیوسته و همیشگی، استقرار پیوسته را به وجود میآورد. سازمانهایی که تحت نظارت رگولاتوری یا دیگر سازمانهای کنترل کیفی نیستند، باید تحویل پیوسته را بهعنوان هدف اصلی و مهم سازمان خود در نظر بگیرند.
بهصورت ساده و خلاصه باید بگوییم که CI مجموعه فعالیتهایی است که توسعه دهندگان در زمان نوشتن کدها، آنها را انجام میدهند و CD، مجوعه فعالیتهایی است که بعد از اینکه کد کامل شد، بهصورت خودکار اجرا خواهند شد.
پایپلاین CI/CD چیست؟
یک پایپلاین CI/CD، فرآیند تحویل نرمافزارتان را بهصورت اتوماتیک اجرا میکند. پایپلاین کدها را میسازد و تستها را اجرا میکند (CI)، و بهصورت کاملا امن یک نسخه جدیدی از اپلیکیشن را منتشر میکند (CD).
پایپلاینهای خودکار میتوانند خطاهای انسانی را از بین ببرند، چرخههای بازخورد استانداردشده در اختیار توسعهدهندگان بگذارند و فرآیند مداوم بررسی کیفیت محصول را سرعت ببخشند.
مزایای CI/CD چیست؟
بهصورت کلی، CI/CD این مزایا را دارد:
- تستهای خودکار، امکان تحویل پیوسته را فراهم میکند که با وجود این قابلیت فوقالعاده، کیفیت بالای نرمافزار، امنیت و افزایش سوددهی کدها در مسیر تولید، تضمین میشوند.
- پایپلاینهای CI/CD باعث معرفی و بازاریابی بسیار سریعتر محصولات جدید شده، تجربه بسیار بهتری در اختیار کاربران نهایی میگذارد و بخش مهمی از فشار کاری بر دوش توسعهدهنده را از بین میبرد.
- افزایش فوقالعاده سرعت ساخت با استفاده از پایپلاین CI/CD، سرعت تحویل محصول به مشتری را افزایش داده و قابلیتهای رقابتی سازمانها را نیز بهبود میبخشد.
- اتوماتیکبودن بخش اعظم کارها باعث میشود که اعضای تیم توسعهدهنده، زمان بیشتری در اختیار داشته باشند و این زمان را به ساخت قابلیتهای متنوع و کدنویسی اختصاص دهند.
- سازمانهای دارای پایپلاین CI/CD موفق، میتوانند نیروهای بااستعداد و آمادهای را جذب کنند. با دور شدن سازمانها از مدل سنتی آبشاری، مهندسها و توسعهدهندهها، دیگر درگیر فعالیتهای تکراری که غالبا اتمام آن به تمامشدن دیگر بخشهای بستگی دارد، نشده و میتوانند بهسرعت پیشرفت کنند.
CI/CD و دواپس
DevOps مجموعهای از فعالیتها است که هدف آن این است که به سازمانها کمک کند تا بتوانند سریعتر از حالت سنتی، نرمافزارها و سرویسهای مختلف را تولید کنند. سازمانها پس از استفاده از دواپس، میتوانند خیلی سریعتر و بهتر به مشتریان خود سرویس داده و بهتر از همیشه در بازار رقابتی فعالیت کنند. در محیط DevOps، سازمانهای موفق در همه فازهای فعالیت خود، امنیت را در هر کدام از چرخههای حیات توسعه نرمافزار در نظر میگیرند و به این روش کاری آنها، DevSecOps میگویند.
نکته کلیدی DevSecOps این است که در همه فازهای ساخت نرمافزار، امنیت بهصورت یکپارچه با سایر بخشها ادغام میشود. با اجرای فعالیتهای امنیتی در همان فازهای اولیه پس از ساخت هر بخش از نرمافزار و بهصورت مستمر، سازمانها میتوانند با قابلیت اطمینان بالایی بخشهای آسیبپذیر محصول خود را در سریعترین زمان ممکن بیابند. به این شکل میتوانند بهسرعت تصمیمگیری کرده و میزان خطای نرمافزار خود را به شکل قابل توجهی کاهش دهند.
بررسی امنیت نرمافزار در حالتهای سنتی، تنها در زمان استقرار محصول نهایی انجام میشد. روش قدیمی در حال حاضر، قابلیت رقابت با رویکرد DevOps را ندارد و نمیتواند خود را با سرعت و چابکی این روش، مطابقت دهد.
در حال حاضر ابزارهای امنیتی باید بهصورت کامل و دقیق در جریان کاری توسعهدهندهها و پایپلاین CI/CD ادغام شوند تا بتوانند با دوآپس هماهنگ شده و سرعت توسعه نرمافزار را کاهش ندهند.
پایپلاین CI/CD یک بخش کوچک از فریمورک DevOps/DevSecOps است. برای اجرای موفق پایپلاین CI/CD، سازمانها به ابزارهای مختلفی نیاز دارند تا با استفاده از آن ابزارها، بتوانند از ایجاد نقاط اصطکاک جلوگیری کرده و موانع مختلف در مسیر یکپارچهسازی و تحویل محصول نهایی را از بین ببرند. برای رسیدن به این هدف، تیمها به زنجیرهای از ابزارها و تکنولوژیهای مختلف نیاز دارند تا توسعه مبتنی بر همکاری و بدون موانع مختلف برای آنها تسهیل شود و بتوانند بهراحتی فرآیند توسعه را دنبال کنند.
ابزارهای CI/CD
برای پیادهسازی و استفاده بهینه از CI/CD ابزارهای مختلفی ساخته شده است. این ابزارها در خودکارسازی فرایندها، پیادهسازی درست پایپلاین CI/CD، ادغام و یکپارچهسازی با ابزارهای مختلف و… به شما کمک میکنند. در ادامه ۳ مورد از محبوبترین ابزارهای CI/CD معرفی شده است:
۱. Jenkins
Jenkins یکی از محبوبترین ابزارهای CI/CD است که قابلیت اتوماسیون ساخت، تست و استقرار برنامهها را فراهم میکند. این ابزار متنباز بوده و به راحتی قابل پیکربندی است و پلاگینهای زیادی برای آن وجود دارد که میتوان برای سفارشیسازی فرآیندها استفاده کرد.
ویژگیها:
- متنباز و رایگان
- دارای بیش از ۱۰۰۰ پلاگین برای انواع وظایف
- قابل یکپارچهسازی با ابزارهای متنوع
۲. GitLab CI/CD
GitLab شامل ابزارهای CI/CD به عنوان بخشی از پلتفرم خود است. با استفاده از GitLab CI، توسعهدهندگان میتوانند کدهای خود را به سادگی و به صورت مداوم آزمایش، یکپارچه و استقرار دهند.
ویژگیها:
- یکپارچه با GitLab (کنترل نسخه، مدیریت پروژه)
- قابلیت پیادهسازی در محیطهای مختلف (ابری، محلی)
- پشتیبانی از pipelineهای سفارشی
۳. CircleCI
CircleCI یک ابزار اتوماسیون CI/CD قدرتمند است که به توسعهدهندگان کمک میکند تا فرآیندهای ساخت و تست خود را به صورت خودکار در زمان کم انجام دهند. این ابزار هم به صورت ابری و هم به صورت محلی در دسترس است.
ویژگیها:
- سرعت بالا در اجرای pipelineها
- ادغام آسان با GitHub و Bitbucket
- پشتیبانی از انواع زبانهای برنامهنویسی
برای آشنایی با ابزارهای بیشتر میتوانید مطلب «آشنایی با ۷ ابزار CI/CD در کوبرنتیز» را مطالعه کنید.
جمعبندی
CI/CD یکی از رویکردهای مدرن در دنیای توسعه و استقرار نرم افزار بوده و بسیاری از شرکتهای دنیا از این رویکرد برای ساخت محصولاتشان استفاده میکنند. به همین دلیل در این مطلب از وبلاگ همروش سعی کردیم تا شما را با چیستی CI/CD، عملکرد، مزایا و… آن آشنا شویم. حتما در آینده کاری خود روی یادگیری کامل CI/CD سرمایهگذاری کنید.
برای استفاده از قابلیتهای CI/CD در کنسول همروش میتوانید راهنمای استفاده از Github Actions در مستندات همروش را مطالعه کنید.