تعریف CI/CD:
CI/CD یک روش برای تحویلدهی مداوم نرمافزارها به مشتریان است که از طریق اتوماتیکسازی صورت میگیرد. این فرآیند راهحلی کاربردی برای یکپارچهسازی کدهای جدید است که برای تیم توسعه دهنده همواره مشکلساز بوده و هستند و شامل سه بخش ادغام مداوم یا همان CI (Continuous Integration)، تحویل مداوم یا CD (Continuous Delivery) توسعه مداوم(Continuous Development) میشود.
به بیان دیگر، CI/CD فرآیندی اتوماتیک، مداوم و پیوسته برای مدیریت یک محصول نرمافزاری است. این مراحل بهم پیوسته، تحت عنوان "CI/CD pipeline" شناخته میشوند.
ادغام مداوم (CI):
روشی برای یکپارچهسازی و ذخیرهسازی تغییرات کدها در ریپازیتوری(Repository) است.
اگر ما بخواهیم به صورت عادی خطاها و مشکلات کدها را پیدا کنیم و یا تغییراتی در آنها ایجاد کنیم کار بسیار دشواری در پیش خواهیم داشت؛ اما با این روش تشخیص خطاها و ایجاد تغییرات به شکل آسانتری قابل رفعشدن هستند. همچنین این روش به یک محصول نرمافزاری کمک میکند تا با توسعه بیشتر و رفع مشکلات در زمانی کوتاهتر، چرخه عمر طولانیتری داشته باشد.
حتی اگر چند تیم توسعهدهنده نیز باهم برای توسعه یک نرمافزار در حال همکاری باشند بازهم با رفع مشکلات بهطورمداوم و راهاندازی سیستم تست عملکرد و اعتبارسنجی خودکار، میتوان بروز مشکلات کدنویسی را به حداقل رساند.
دومین مزیت بسیار مهم در این زمینه صرفهجویی در زمان است. این مسئله به شما کمک میکند تا در صورت لزوم اگر ایدهای در ذهن خود دارید و یا خطایی رخ دادهاست سریعاً آن را پیادهسازی یا رفع کنید.
چرخه اعتبارسنجی یک کد دستوری معمولی با تجزیهوتحلیل و بررسی کیفیت آن آغاز میشود. بعد از قبول شدن کد در مراحل بررسی استاتیک آنها را پکیج کرده و کامپایل میکنند تا برای تستهای بعدی آماده باشند. فرآیند CI دارای قسمتی است که به کمک آن، تغییرات اعمال شده قابل رهگیری بوده و کدهای استفاده شده به راحتی قابل شناسایی هستند.
تحویل مداوم (CD):
CD یک روش توسعه نرمافزار است و عملکرد آن با CI مرتبط است. هردوی آنها درکنارهم برای آمادهسازی زیرساختها و فرآیند تولید نرمافزار بکارگیری میشوند.
موقعی که یک کد دستوری توسط CI ساخته و امتحان میشود، CD وارد عمل میشود و در مراحل پایانی بررسیهایی انجام میدهد تا اطمینان حاصل شود که این پکیجها تمامی موارد مورد نظر را شامل میباشند و میتوان هر زمان از آنها در محیطها و موقعیتهای مختلف استفاده کرد.
CD همه چیز را از آمادهسازی زیرساختها تا قرار دادن نرمافزار در محیط آزمایش یا تولید را شامل میشود.
توسعه مداوم:
با کمک توسعه مداوم، تیم DevOps یکسری معیارهایی را برای کدهای دستوری طراحی میکنند و زمانی که کدها با این معیارها مطابقت پیدا کردند، سیستم به صورت خودکار و بدون دخالت انسان، نرمافزار را روی سرور بارگذاری میکند. بهرهگیری از این روش خودکارسازی باعث افزایش سرعت در عملکرد و ارائه امکانات بیشتر به کاربران در زمان کمتر میشود.
اهمیت CI/CD:
این فرآیند به تیم DevOps کمک میکند تا کار خود را به صورت کاملاً حرفهای و با بالاترین راندمان ممکن انجام دهند و همچنین باعث پویایی بیشتر و صرفهجویی در زمان میشود. انعطاف بالای CI/CD به تیم DevOps این اجازه را میدهد تا خلاقیت بیشتری را بکار بگیرند.
خودکارسازی باعث میشود بیشتر خطاهای احتمالی قابل پیشبینی باشند و این یعنی بروز خطای کمتر در مقایسه با زمینههایی که انسان به صورت مستقیم به عیبیابی آنها میپردازد. با استفاده از این روش، تیم DevOps بازخوردها را سریعتر دریافت میکنند(خطاها و تغییرات مورد نیاز) و میتوانند با تغییرات کوچک خیلی سریع و آسان از بروز عوامل ساختارشکن جلوگیری کنند.
تمامی این مزایا مانند سرعت بالا، امکان برطرف کردن مشکلات، اضافه نمودن امکانات در زمان کوتاه و بسیاری مزایای دیگر، در نهایت منجر به افزایش طول عمر یک نرمافزار و کاربرپسندتر شدن آن میشود.
مبانی CI/CD:
فرآیند CI/CD دارای اصول هشتگانهای است که به تیم DevOps کمک میکنند تا در جریانکاری خود از سرعت و دقت لازم برای راهاندازی و تحویل نرمافزار استفاده کنند.
در ادامه به شرح هر یک از آنها میپردازیم:
ساختار Single source repository: مدیریت سورس کد (SCM) شامل تمامی فایلها و اسکیریپتهای مورد نیاز برای ساخت buildهاست، از این رو repository باید شامل همه موارد موردنیاز مانند کدهای مرجع، ساختار پایگاهداده، کتابخانهها، فایلهای خاص و کنترل نسخه باشد. همچنین باید شامل اسکریپتهای تست و اسکریپتهایی برای ساخت نرمافزار باشد.
انجام commitهای مداوم: یکپارچهسازی کدهای داخل trunk، mainline یا master branch باید بصورت مداوم و با فاصلههای کوتاه انجام شود، بعلاوه باید از ایجاد branchهای متعدد پرهیز کرده و بیشتر کدنویسی روی branch اصلی انجام شود. از تکه کدهای کوچک استفاده کنید و آنها را به صورت مکرر در اولین فرصت ممکن با شاخه اصلی ادغام کنید و از اضافه کردن چندین تکه کد به صورت یکجا پرهیز کنید.
خودکارسازی buildها: اسکریپتها باید دارای تمام موارد مواردنیاز برای بیلد گرفتن با استفاده از یک دستور باشند که شامل فایلهای web server، اسکریپتهای پایگاهداده و... است. فرآیند CI، کدها را به صورت خودکار برای استفاده در نرمافزارها کامپایل و پکیج میکند.
ساختار Self-testing: اسکریپتهایی وجود دارند که به کمک آنها میتوان قسمتها و کدهای مختلف را تست کرد. استفاده از اسکریپتهای تست در مراحل قبل از ارائه نهایی باعث میشود تا از یکپارچه بودن، کیفیت و امنیت سیستم و کدها اطمینان حاصل کنیم. تنها کدهایی که این تستها را به خوبی رد کنند اجازه استفاده شدن در ساختارنهایی را دارند.
چرخههای متعدد: کامیت(Commit)های متعدد و چندگانه در repository باعث میشود تا به صورت قابل توجهی از بروز خطاها جلوگیری شود. پس به جای اعمال تغییرات عمده و سپس ادغام آنها، تغییرات کوچک را بطور مکرر با کد اصلی ادغام کنید. یکی دیگر از مزایای این کار این است که، در صورت بروز خطا به آسانی میتوانید آن را شناسایی و رفع کنید.
محیط تست پایدار: نمیتوان کدها در نسخه ارائه شده که روی سرور قرار گرفتهاست تست کرد؛ در نتیجه کدها باید در یک نسخهی کپی از نسخه اصلی تست بشوند. نسخه کپی باید تا حد ممکن در محیطی شبیه به محیط واقعی برنامه قرار گیرد. برای پیدا کردن کدهای مشکلساز و خرابی که مراحل اولیه آزمایشات را پشتسر گذاشتهاند بهتر است از اسکریپتهای تست کننده دقیقتری استفاده شود.
شفافیت حداکثری: هر توسعهدهندهای باید به فایلهای اجرایی و تغییرات ایجاده شده روی منبع دسترسی داشتهباشد تا بتوانند نسخه نهایی و تغییرات آن را مشاهده کنند(میزان دسترسی قابل کنترل و مدیریت است). شفافیت حداکثری یعنی تمامی توسعهدهندگان بتوانند بر پیشرفت کار نظارت داشته و به شناسایی خطاهای احتمالی بپردازند.
زمانبندی دقیق: بارگذاری بروزرسانیها روی سرور به خودی خود کار پیچیدهای نیست، مسألهی اصلی انتشار نسخههای بهروز با حداقل باگ است. از این رو فرایند تست و اعتبارسنجی در CI/CD باید دقیق و سختگیرانه باشد تا تیم توسعهدهنده بتواند نسخههای جدیدتر را با خیالی آسوده بر روی سرور بارگذاری کند. اگر این بارگذاریها به صورت مکرر و دارای تغییرات محدودی باشند، ریسک انجام کار پایین میآید و همچنین بروز مشکلات به آسانی قابلیت جبران خواهندداشت. اما چگونه این امر محیا میشود؟ در اصل اگر تمامی مراحل یک فرآیند تولید به درستی انجام شود، باگهای احتمالی کمتری خواهیمداشت، در نتیجه میتوانیم جدول زمانبندی مناسبی را در شروع پروژه تنظیم کنیم و طبق برنامههای از پیش تعیین شده پروژه را با خیالی آسودهتر پیش ببریم.