آشنایی با ویژگی‌های Gitlab CI/CD

آشنایی با Gitlab CI/CD

در این مقاله مروری خواهیم داشت بر مفاهیم ادغام مداوم (Continuous Integration)، تحویل مداوم (Continuous Delivery) و استقرار مداوم (Continuous Deployment) نرم‌افزار و با ویژگی‌های ابزار قدرتمند Gitlab CI/CD آشنا خواهیم شد.


معرفی روش‌های ادغام و تحویل مداوم (CI/CD)

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

این راهکار برای ساخت، تست و استقرار تغییرات کد بصورت مداوم در هر تکرار کوچک است که شانس توسعه کد جدید به پایه‌ی اشکالات و شکست‌ها در ورژن های قبلی را به حداقل می‌رساند.

در این متدولوژی سه رویکرد اصلی وجود دارد. هریک از آن‌ها مطابق آنچه در استراتژی شما مناسب ترین تشخیص داده می‌شود قابل اعمال خواهد بود.


ادغام مداوم – Continuous Integration

یک اپلیکیشن را درنظر بگیرید که کد آن بر روی یک مخزن گیت در GitLab ذخیره شده است. توسعه دهندگان تغییرات کد را هر روز چندین مرتبه روی مخزن push می‌کنند. به ازای هر push به مخزن شما می توانید مجموعه ای از اسکریپت ها جهت ساخت و تست خودکار اپلیکیشن را ایجاد کنید که شانس مواجهه با خطا بر روی برنامه کاربردی را کاهش می‌دهد. این عمل تحت نام یکپارچه سازی (ادغام) مداوم شناخته می‌شود. برای هر تغییر ارائه شده به یک اپلیکیشن حتی در انشعاب (branch) های توسعه، این ساخت و تست خودکار و مداوم اطمینان می‌دهد تغییرات ایجاد شده، همه تست ها، خطوط راهنما و استاندارهای انطباق کدی که شما برای برنامه کاربردی خود لحاظ نموده اید را با موفقیت پشت سر گذاشته اند.

سرویس gitlab-foss، نمونه ای از کاربرد یکپارچه سازی مداوم به عنوان یک متد توسعه نرم افزار است. برای هر push به مخزن، مجموعه ای از اسکریپت‌ها وجود دارند که کدها را بررسی می‌کنند.


تحویل مداوم – Continuous Delivery

تحویل مداوم یک مرحله فراتر از یکپارچه سازی مداوم است. اپلیکیشن شما صرفا ساخت و تست هر تغییر کد وارد شده به کد منبع نیست بلکه بعنوان یک گام اضافه، مداومت در استقرار را نیز باید داشته باشد. استقرارها به شکل دستی راه‌اندازی می‌گردند. این متد اطمینان می‌دهد کدی که به شکل خودکار بررسی شده نیازمند مداخله انسانی برای راه‌اندازی و تایید دستی استراتژی استقرار تغییرات نرم‌افزار است.


استقرار مداوم – Continuous Deployment

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


معرفی Gitlab CI/CD

GitLab CI/CD یک ابزار قدرتمند در سرویس GitLab است که اجازه می‌دهد شما همه متدهای تداوم (یکپارچگی مداوم، تحویل مداوم، استقرار مداوم) را بر روی نرم افزار بدون نیاز به اپلیکیشن واسط یا یکپارچه سازی اعمال کنید.


Gitlab CI/CD چگونه کار می‌کند؟

برای استفاده از GitLab CI/CD همه آنچه شما نیاز دارید یک کد منبع (codebase) و اپلیکیشن  میزبانی شده در یک مخزن گیت است. برای ساخت، تست و استقرار نرم افزار، اسکریپت هایی که دریک فایل به نام gitlab-ci.yml باید بسازید که در مسیر ریشه مخزن گیت شما قرار گرفته است . در این فایل شما می توانید اسکریپت هایی که می‌خواهید اجراشوند را تعریف کنید.

نحوه اجرای برنامه و وابستگی های نهان آن‌ها، انتخاب دستورالعمل هایی که شما می‌خواهید به دنبال هم اجرا شوند و آنهایی که می‌خواهید به صورت موازی به اجرا در آیند را در این فایل تعریف خواهید کرد. تعیین مکانی که قصد دارید اپلیکیشن خود را در آن مستقر نمائید و مشخص کردن اینکه آیا می‌خواهید اسکریپت‌ها بصورت خودکار اجرا شوند یا هر یک از آن‌ها به شکل دستی فعال گردند.

زمانی که شما با GitLab CI/CD آشنا شوید، می‌توانید مراحل پیشرفته تری را به پیکربندی فایل خود اضافه کنید. برای اضافه کردن اسکریپ‌ها به فایل gitlab-ci.yml، شما نیاز خواهید داشت آن‌ها را به ترتیبی که مناسب اجرای اپلیکیشن تان باشد و مطابق تست هایی که می‌خواهید صورت پذیرد، سازماندهی کنید.

برای تجسم این روند، تصور کنید همه اسکریپت هایی که به فایل پیکربندی اضافه می‌کنید همان دستوراتی هستند که در یک ترمینال یا روی کامپیوتر خود برای اجرای برنامه وارد می‌کنید. هنگامی که شما فایل پیکربندی gitlab-ci.yml خود را به  مخزن گیت اضافه میکنید GitLab آن را تشخیص خواهد داد و اسکریپت های شما با ابزاری به نام GitLab Runner اجرا می‌شود که مشابه ترمینال شما کار می‌کند. اسکریپت ها در job ها گروه بندی می‌شوند و در یک pipeline بایکدیگر ترکیب می‌شوند. یک نمونه حداقلی از فایل gitlab-ci.yml می‌تواند حاوی موارد زیر باشد.

before_script:
  - apt-get install rubygems ruby-dev -y

run-test:
  script:
    - ruby --version

ویژگی before_script پیش از اجرای هر چیزی، آنچه اپلیکیشن شما به آن وابسته است را نصب می‌کند و یک job  که run-test نامیده میشود ورژن Ruby (زبان برنامه نویسی مورد استفاده)  سیستم فعلی را چاپ می‌کند. هر دوی این‌ها با یک pipeline  ترکیب می‌شوند که در هر push به هر انشعابی از مخزن گیت فعال می‌گردند.                         

GitLab CI/CD نه تنها کارهای تنظیم شده توسط شما را انجام می‌دهد بلکه آنچه هنگام اجرا رخ می‌دهد را نیز به شما نشان می‌دهد. همانگونه که در ترمینال خود مشاهده می‌کنید.

job های Gitlab

شما یک استراتژی برای اپلیکیشن خود ایجاد می‌کنید و گیتلب، Pipeline را مطابق آنچه تعریف کرده اید اجرا می‌کند. وضعیت های pipeline شما نیز در محیط GitLab نمایش داده می‌شود.

وضعیت pipeline های gitlab

در انتها اگر چیزی با خطا روبرو شود، شما می‌توانید همه تغییرات را به عقب بازگردانید یا لغو کنید.

بازگردانی pipeline های گیتلب

گردش‌کار پایه CI/CD

برای درک چگونگی انطباق GitLab CI/CD با یک گردش کار مرسوم، مثال زیر را درنظر بگیرید.

فرض کنید شما  درمورد مساله ای، یک پیاده سازی کد را به بحث گذاشته اید و بر روی تغییرات پیشنهادی خود بصورت محلی کار کرده اید. هنگامی که شما commit های خود را به یک branch از یک مخزن در GitLab پوش می‌کنید، مجموعه پایپ‌لاین CI/CD برای پروژه شما راه اندازی می‌شود. با این کار GitLab CI/CD موارد زیر را انجام می‌دهد.

  • اسکریپت های خودکار را (به صورت متوالی یا موازی) برای اهداف زیر به اجرا وامیدارد.
    • ساخت و تست اپلیکیشن شما
    • پیش نمایش تغییرات در هر درخواست ادغام (merge request) به همراه مرور کدهای برنامه

و هنگامی که قصد تایید پیاده‌سازی کد را دارید:

  • کد را بررسی و تایید کنید.
  • branch ویژگی اضافه شده را با branch اصلی ادغام کنید.
    • GitLab CI/CD تغییرات شما را بطور خودکار در یک محیط عملیاتی مستقر می‌سازد.
  • و در نهایت اگر چیزی با خطا مواجه شد، شما و تیم تان به راحتی می توانید فرآیند را به عقب برگردانید.

GitLab CI/CD قادر به انجام کارهایی بسیار بیش از این می‌باشد. این گردش کار توانایی GitLab در ردیابی کل فرآیند را بدون نیاز به ابزار خارجی نشان می‌دهد. از همه مفیدتر اینکه شما می‌توانید همه مراحل کار را از طریق رابط کاربری Gitlab UI مشاهده کنید.


نگاهی عمیق‌تر به گردش کار CI/CD

اگر نگاه عمیق تری به گردش کار اصلی کنیم، می‌توانیم ویژگی های موجود در GitLab در هر مرحله از چرخه DevOps را مشاهده کنیم. همانگونه که در تصویر زیر نشان داده شده است.

اگر به تصویر از چپ به راست نگاه کنید، بر طبق هر مرحله (تایید، بسته بندی، انتشار)، برخی از ویژگی‌های موجود در GitLab را مشاهده خواهید کرد.

تایید (Verify):

بسته بندی (Package):

انتشار (Release):

  • استقرار مداوم، استقرار اپلیکیشن شما به طور خودکار بر روی محیط عملیاتی
  • تحویل مداوم، تحویل اپلیکیشن شما به صورت دستی بر روی محیط عملیاتی
  • استقرار وب سایت های ایستا به کمک Gitlab Pages
  • نصب ویژگی‌ها تنها بر روی بخشی از pod ها و تجربه موقت آن توسط درصدی از کاربران از طریق استراتژی استقرار قناری.
  • استقرار ویژگی ها با استفاده از Feature Flags
  • افزودن یادداشت های release به هر تگ Git از طریق Gitlab Releases
  • مشاهده حالت و وضعیت سلامت هر محیط CI در حال اجرا بر روی بستر Kubernetes بوسیله Deploy Boards
  • استقرار اپلیکیشن بر روی یک محیط عملیاتی در یک کلاستر Kubernetes بوسیله Auto Deploy

به کمک GitLab CI/CD شما علاوه بر این می‌توانید:

  • به راحتی کل چرخه زندگی اپلیکیشن خود را از طریق ویژگی Auto DevOps تنظیم کنید.
  • اپلیکیشن خود را بر روی محیط های مختلف مستقر سازید.
  • Gitlab Runner های متعلق به خود را نصب و راه‌اندازی نمایید.
  • pipeline ها را زمان بندی کنید.
  • آسیب پذیری های اپلیکیشن را از طریق گزارش های تست امنیت بررسی کنید.

تنظیم Gitlab CI/CD برای اولین بار

برای شروع کار با  GitLab CI/CD باید با سینتکس و نحوه پیکربندی فایل gitlab-ci.yml و ویژگی‌های آن آشنا شوید. همچنین می‌توانید از دوره آموزشی Gitlab CI/CD برای یادگیری مفاهیم CI/CD و اجرای سناریوهای عملی CI/CD برنامه های Python و JavaScript با استفاده از ابزار قدرتمند Gitlab CI/CD استفاده کنید.

محمد بابازاده
متخصص DevOps و توسعه دهنده Python