تعریف CI/CD:
روش CI/CD روشی برای تحویلدهی مداوم نرمافزارها به مشتریان است که از طریق اتوماتیکسازی صورت میگیرد. این فرآیند راهحلی کاربردی برای یکپارچهسازی کدهای جدید است که برای تیم توسعه دهنده همواره مشکلساز بوده و هستند و شامل سه بخش ادغام مداوم(Continuous Integration)، تحویل مداوم(Continuous Delivery) و توسعه مداوم(Continuous Development) میشود.
به بیان دیگر، CI/CD یک فرآیند اتوماتیکسازی مداوم و پیوسته برای مدیریت یک محصول نرمافزاری از زمان پیادهسازی تست کدها تا تحویلدهی آنهاست. این مراحل بهم پیوسته، تحت عنوان "CI/CD pipeline" شناخته میشوند.
ادغام مداوم (CI):
روشی برای یکپارچهسازی و ذخیرهسازی تغییرات کدها در ریپازیتوری(Repository) است.
اگر ما بخواهیم به صورت عادی خطاها و مشکلات کدها را پیدا کنیم و یا تغییراتی در آنها ایجاد کنیم کار بسیار دشواری در پیش خواهیم داشت؛ اما با این روش شناسایی خطاها و ایجاد تغییرات به شکل آسانتری قابل شناسایی و رفعشدن هستند. همچنین این روش به یک محصول نرمافزاری کمک میکند تا با توسعه بیشتر و رفع مشکلات در زمانی کوتاهتر، چرخه عمر طولانیتری داشته باشد.
حتی اگر چند تیم توسعهدهنده نیز باهم برای توسعه یک نرمافزار در حال همکاری باشند بازهم با رفع مشکلات بهطورمداوم و راهاندازی سیستم تست عملکرد و اعتبارسنجی خودکار، میتوان بروز مشکلات کدنویسی را به حداقل رساند.
دومین مزیت بسیار مهم در این زمینه صرفهجویی در زمان است. این مسئله به شما کمک میکند تا در صورت لزوم اگر ایدهای در ذهن خود دارید و یا خطایی رخ دادهاست سریعاً آن را پیادهسازی و رفع کنید.
چرخه اعتبارسنجی یک کد دستوری معمولی با تجزیهوتحلیل و بررسی کیفیت آن آغاز میشود. بعد از قبول شدن کد در مراحل بررسی استاتیک آنها را پکیج کرده و کامپایل میکنند تا برای تستهای بعدی آماده باشند. فرآیند CI دارای قسمتی است که به کمک آن، تغییرات اعمال شده قابل رهگیری بوده و کدهای استفاده شده به راحتی قابل شناسایی هستند.
تحویل مداوم (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 باید دقیق و سختگیرانه باشد تا تیم توسعهدهنده بتواند نسخههای جدیدتر را با خیالی آسوده بر روی سرور بارگذاری کند. اگر این بارگذاریها به صورت مکرر و دارای تغییرات محدودی باشند، ریسک انجام کار پایین میآید و همچنین بروز مشکل به آسانی قابلیت جبران خواهدداشت. اما چگونه این امر محیا میشود؟ در اصل اگر تمامی مراحل یک فرآیند تولید به درستی انجام شود، باگهای احتمالی کمتری خواهیم داشت در نتیجه میتوانیم جدول زمانبندی مناسبی را در شروع پروژه تنظیم کنیم و طبق برنامههای از پیش تعیین شده پروژه را با خیالی آسودهتر پیش ببریم.
برای مطالعه بیشتر به وبلاگ ما سر بزنید :)
اصطلاحات:
در ادامه به توضیح یکسری از اصطلاحات مهم و مرتبط با موضوع این مقاله خواهیم پرداخت:
اصطلاح Jobs: یک پارامتر اصلی در GitLab pipeline است. یک Job وظیفهای را شرح میدهد که یک پایپلاین باید انجام دهد، مانند کامپایل یا آزمایش کردن یک کد. هر Job دارای یک اسم و یک قسمت اسکیریپتی است که مشخص میکند چه کاری باید انجام شود. اگر تمامی Jobها در یک مراحل به درستی انجام شدهباشند، Pipeline وارد مرحله بعدی میشود.
اصطلاح Stages: این اصطلاح تعیین میکند که چه موقع Jobها به اجرا در بیایند. یک Stage بخشهای مختلفی را در CI/CD pipeline شامل میشود. ساختارها، تستها، بارگذاری نرمافزارها. Plan، Create، Verify، Configure و Release از جمله مثالهایی برای stage هستند.
اصطلاح Pipeline: یک Pipeline در GitLab مجموعهای از مراحلاند که هر کدام شامل یک یا چندین Job هستند. GitLab دارای انواع مختلفی از پایپلاینهاست که عبارتند از: basic، merge، parent-child و multi-project.
اصطلاح Commit: یک کامیت ذخیرهسازی و یا تغییر چیزی مانند کد یا یک فایل است. برای مثال، اگر شما بخواهید تغییراتی بر روی یک فایل ذخیرهسازی شده در repository ایجاد کنید باید تغییرات را کامیت کنید تا بتوانید فایل جدید را دوباره ذخیرهسازی کنید.
اصطلاح Runners: عوامل یا برنامههایی هستند که Jobهای CI/CD pipeline را از GitLab گرفته و به اجرا در میآورد. برای این کار Runnerهای مختلفی از جمله: GitLab Runners، Use Linux، Windows Runners و macOS Runners وجود دارند. این Runnerها پس از نصب شدن روی سیستم میتوانند Jobها را به اجرا در بیاورند ولی قابلیت کار کردن بر روی کانتینرها و Kubernetes clusters را هم دارد.(Container یا کانتینر یک نرمافزار آماده اجرا است و Kubernetes clusters یک پلتفرم مدیریت کانتینر متن باز است)
به طورکلی پایپلاینها به صورت خودکار کار میکنند و نیازی به اپراتور ندارند. با این حال، در مواقعی هم نیاز است که با این Pipelineها به صورت دستی تعامل داشت.
برای مطالعه بیشتر به وبلاگ ما سر بزنید :)
مزایای استفاده از CI/CD:
بهرهگیری از CI/CD فواید بسیار زیادی را برای شرکتها به همراه دارد. در ادامه به تعدادی از این مزایا میپردازیم:
رضایت مشتری: مواجه شدن با مشکلات و خطاهای کمتر باعث القای حس بهتر به کاربران میشود. این تجربه خوب باعث رضایتمندی هرچه بیشتر مشتریان و کاربران میشود.
تسریع زمان اعتبارسنجی: وقتی شما قادر به ایجاد تغییرات در هر لحظه باشید، میتوانید به صورت مستمر و در کوتاهترین زمان ممکن امکانات جدید را اضافه کنید و مشکلات برنامه را برطرف کنید. نتیجه این کار این است که برنامه شما در بازار همیشه حرفی برای گفتن خواهدداشت.
جلوگیری از بروز خطاهای بزرگ: تست مرحلهبهمرحله و در ابعاد کوچک باعث جلوگیری از بروز مشکلات بزرگ در سیستم میشود. این مزیت مسیری هموارتر در توسعه و کاهش استرس تیم توسعهدهنده را به دنبال خواهدداشت. زیرا مشکلات قابل پیشبینی بوده و رفع آنها سادهتر خواهدبود.
دقیقتر شدن زمانبندیها: برطرف کردن موانع و دشواریهای توسعه نرمافزار میتواند به ما این امکان را بدهد که پیشبینیهای دقیقتر و در نتیجه آن برنامهریزی دقیقتری داشته باشیم. قسمت کردن پروژه به بخشهای کوچکتر باعث میشود هر مرحله با دقت و سرعت بیشتری انجام شود و محصول نهایی نیز کمترین خطای ممکن را دارا باشد. میتوان گفت ماه عسل تمام این کارها میشود تحویلدهی به موقع پروژه، اعتبار و کسب درآمد بیشتر.
زمان آزاد بیشتر: طبق آمارهای اعلام شده، تخمین زده شده است که تقریبا بین 35الی50% از وقت توسعهدهندگان در رابطه با تست، اعتبارسنجی و رفع خطا صرف میشود. با اتوماتیکسازی سیستم بسیاری از کارها توسط کامپیوتر انجام میشود، این به این معناست که تیم شما زمان آزاد بیشتری خواهدداشت و میتواند روی پروژههای بیشتری کار کنند که درآمدزایی بیشتری نیز به همراه خواهدداشت.
کاهش دغدغههای ذهنی: دریافت بازخوردهای آنی از کدهای در حال اجرا به تیم توسعهدهنده اجازهی تمرکز و کار بر روی یک زمینه تا به پایان رساندن آن را میدهد. اینکار باعث جلوگیری از سردرگمی و کاهش دغدغههای ذهنی تیم میشود. این کاهش دغدغه، فضای لازم برای فکر کردن به پروژههای بیشتر و توسعه هرچه بهتر برنامهها را فراهم میسازد.
معایب:
همانطور که CI/CD مزایای فراوانی دارد، معایبی نیز دارد. از معایب آن میتوان به موارد زیر اشاره کرد:
تغییرات مداوم: CI/CD مدام در حال بهینهسازی برنامه است اما ممکن است این تغییرات مداوم و آپدیت برنامه برای کاربران ناخوشایند به نظر بیاید.
کاهش نیروی انسانی: با اتوماتیکسازی سیستمها، احتیاج به نیروی انسانی کم میشود. در نتیجه آن نیز نرخ بیکاری افزایش پیدا خواهد کرد.
نیازمند بودن به سرمایه اولیه زیاد جهت راهاندازی
عدم پشتیبانی سیستمهای قدیمی از CI/CD
برای مطالعه بیشتر به وبلاگ ما سر بزنید :)
کلام آخر:
استفاده از CI/CD مزایای فراوان دیگری از جمله: بازیابی سریعتر، کاهش هزینهها و.... نیز دارد و به طورکلی بهرهگیری از آن باعث سرعت در پیشرفت یک کمپانی خواهدشد.همچنین معایب زیاد دیگری را نیز به همراه دارد.
اما چه بخواهیم و چه نخواهیم اتوماتیکسازی سیستمها از روشهای مختلف مانند هوشمصنوعی، اینترنت اشیاء و.... در حال رخ دادن است. پس اگر به دنبال کسبوکار بهتر و سودآوری بیشتر برای مجموعه خود هستید، بهتر است تا جای ممکن و با توجه به بوجه خود در زمینه توسعه کسبوکار خود توسط تکنولوژیهای کارآمد قدم بردارید.