یکی از اصطلاحات جدیدی که امروزه در فضای فناوری اطلاعات کشور زیاد شنیده میشه مفهومی بنام CI/CD است که در کنار اصطلاح جدید دیگه بنام DevOPS با هم ترکیب شده و خیلی ها ازش اسم میبرن. توی این نوشته میخوایم معرفی کوتاهی از این مفهوم داشته باشیم.

تعریف CI:

اصطلاح CI مخفف Continuous Integration است به معنی روشی که بصورت مستمر وضعیت کدهای یک برنامه را از طریق اجرای خودکار تسهای نرم افزار ارزیابی میکنه.

توی تعریف بالا دو تا مفهوم نهفته هست:

  1. اجرای خودکار تستهای نرم افزار( Automate Testing روشی است که از طریق آن امکان اجرای Unit Test های یک نرم افزار بصورت خودکار فراهم میکند. در واقع بلوغ فرهنگ تولید unit test در چرخه تولید نرم افزار پیش نیاز رسیدن به این هدف است )
  2. بصورت مستمر (این استمرار به معنی انجام عملیات بعد از اعمال هر تغییر است. تغییرات در کدهای نرم افزاری معمولا با commit کردن تغییرات در Version Control امکان پذیر است)

در تصویر بالا هزینه تست لایه های مختلف مشخص هست که هرچقدر تستها در لایه های کوچکتر انجام بشه هزینه تولید یک فرآورده کمتر خواهد شد و بالعکس هرچقدر تستها در لایه های بالاتری انجام بشه زمانبرتر و پرهزینه تر خواهد بود. (در نوشته های بعدی در خصوص مفهومی بنام unit testing توضیحاتی ارائه خواهم کرد)

تعریف CD:

اصطلاح CD مخفف Continuous Delivery /Deployment هست (دو عبارت Delivery یا Deployment در فضای نرم افزاری هم معنی هستند زیرا ارائه هر محصول نرم افزاری از طریق فرآیند استقرار امکان پذیر است) روشی است که در آن بصورت مستمر و قابل اطمینان محصولات نرم افزاری در محیط عملیاتی مستقر و قابل استفاده خواهند شد.

در هر دوی این تعاریف یک هدف مشترک از طریق دو روش و دو نگاه متفاوت دنبال میشه و اون هدف چیزی نیست بجز سرعت و اطمینان بیشتر از روش استقرار فرآورده های نرم افزاری در محیطهای کارفرمایی. رسیدن به سرعت بیشتر در استقرار از طریق حذف تمامی کارهای دستی برای استقرار محقق میشه که این راهکار در مفهوم CD نهفته هست و رسیدن به اطمینان بیشتر از انجام صحیح تغییرات هم در مفهوم CI. شروع فرآیند CD از طریق فایر شدن تغییرات در سورس کد اتفاق میفته که معمولا Version Control ها این تغییر را به بستر CD اعلام میکنند.

تجربه اجرایی ما در آویهنگ

ما در آویهنگ از سال 1397 به بستر جدیدی که قابلیت CD را فراهم کند در یک فرآیند 7 ماهه سوئیچ کردیم که دستاوردهای بسیار با ارزشی در این حوزه به ارمغان آورد. کاری که در آویهنگ انجام شد فرآیندی همانند شکل زیر بود:

برای هر پروژه ما معمولا سه محیط مستقل داشتیم:

  1. محیط توسعه (DEV)
  2. محیط تست کارفرما (TEST)
  3. محیط عملیاتی(PRODUCTION)

المانهای تشکیل دهنده این سه محیط کاملا از یکدیگر مستقل هستند.
1. دیتابیستهای مجزا (داده مجزا)

2. سرویس دهنده های وب مجزا

3. version control مجزا (branch های گوناگون)

فرآیند تست بر روی محیط DEV انجام میشد و وقتی تیم تست و تضمین کیفیت نسخه مورد نظر را از جهات مختلف تست میکرد نتایج تست به تیم توسعه میرسید و نسخه جدیدی مجددا در محیط توسعه با در نظر گرفتن موارد اعلامی تیم تست مستقر میشد. اینکار تا زمان تائید نهایی تیم تست ادامه پیدا میکرد.

پس از تائید تیم تست branch های توسعه با branch تست کارفرما merge میشدند و محیط تست کارفرما بروزرسانی میشد و در نهایت پس از تائید کارفرما محیط عملیاتی بروزرسانی میشد. بعنوان یک آمار از تعداد تغییرات که توی سال گذشته در یکی از پروژه های آویهنگ انجام شده به تصویر زیر نگاه کنید:

ابزارها:

ابزارهای زیر در چرخه CD مورد استفاده قرار گرفتند: