اگر برنامه‌ای در سکو از ریپازیتوری gitlab شما ایجاد شده باشه، برای هر تغییر در کد gitlab، باید زمان زیادی رو صرف اجرای تست‌ها، merge کد با branch master و در نهایت اعمال این تغییرات روی سکو کنین. برای این‌که دیگه نخواین این کارها رو به صورت دستی انجام بدین، می‌تونین از gitlab runner‌ها و مفهوم CI/CD استفاده کنین.
بنابراین در این مقاله اول از همه مفهوم CI/CD و gitlab runner رو توضیح می‌دیم. در ادامه نیز با نصب
gitlab runner و نحوه اتصال برنامه سکو به gitlab آشنا می‌شین.

CI/CD چیست؟ 

CI/CD مخفف Continuous Delivery/Continuous Integration یا Continuous Deployment است. حالا این یعنی چی؟

Continuous Integration:

بخش اول این عبارت (یعنی Continuous Integration)، به‌معنی ادغام مستمر است.
برنامه‌نویس‌ها، معمولا کد‌هاشون رو در یک مخزن مثل Gitlab ،GitHub ،Bitbucket و …، بارگذاری می‌کنن.
بعد این مخزن، کدها رو تست کرده و Build می‌کنه و نتیجه‌ی Build یا بازخورد تغییر کد رو به برنامه‌نویس‌هایی که این تغییرات رو اعمال کردن، اعلام می‌کنه.
در صورتی که خطایی وجود داشته باشه، برنامه‌نویس‌‌ها خیلی زود می‌تونن خطاهای موجود رو برطرف کنن. 

بنابراین می‌تونیم بگیم که CI یا Continuous Integration (ادغام مستمر)، یک عمل نرم‌افزاری است که با استفاده از اون، قابلیت‌های جدید به صورت خودکار با ریپازیتوری مرکزی، merge یا ادغام می‌شن.
این کار ابتدا با پیاده‌سازی تست‌هایی برای اطمینان حاصل کردن از عدم ناسازگاری بین کامپوننت‌های/کدهای جدید با کامپوننت‌های/کدهای قدیمی صورت می‌گیره.
این استراتژی از ایجاد تداخل‌ بین قابلیت‌های جدیدی که توسط برنامه‌نویس‌های مختلف اضافه می‌شه، جلوگیری می‌کنه.  

Continuous Delivery و Continuous Deployment:

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

CD مخفف Continuous Delivery ( یا تحویل مستمر) است.
علاوه‌براین، به Continuous Deployment (استقرار مستمر) هم اشاره می‌کنه. حالا ببینیم هر کدوم چه کاری انجام می‌دن:

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

اما اصطلاح دوم یعنی Continuous Deployment، سازوکاری است که به صورت خودکار کدهای آماده رو روی سرور اصلی منتشر می‌کنه.
یعنی هر تغییری که در سورس کد انجام می‌شه، به صورت خودکار توسط سیستم روی سرور مستقر می‌شه و برای این کار نیازی به دخالت عامل انسانی نیست.

Gitlab runner چیست؟

GitLab runner یک پروژه‌ی متن‌بازه که می‌تونه job‌های CI/CD رو به صورت اتوماتیک اجرا کنه و نتیجه رو به gitlab برگردونه. GitLab Runner یک برنامه‌ی باینری به زبان Go است و برای استفاده از اون، نیازی نیست که کتابخونه‌ی اضافی روی سیستم‌تون نصب بشه. 

GitLab Runner رو می‌تونین روی سیستم‌عامل‌های مختلفی نصب کنین و مورد استفاده قرار بدین.  GitLab Runner می‌تونه داخل کانتینر داکر هم اجرا بشه یا در یک خوشه‌ی Kubernetes مستقر بشه.

- حالا که با این روندها آشنا شدین، می‌خوایم نحوه اتصال برنامه سکو به gitlab رو با یک مثال ساده براتون توضیح بدیم:

بررسی مراحل اتصال برنامه‌‌ سکو به گیت

مراحل اتصال برنامه سکو به gitlab عبارت است از:

۱. ساخت برنامه در سکو

اول یک ریپازیتوری در gitlab بسازین و دو فایل زیر رو در اون PUSH کنین:

  • فایل index.html:
<!DOCTYPE>
<html>
    <head>
        <title>ci/cd app</title>
    </head>
<body>
    <p>This is the first content for this simple app.</p>
</body>
</html>
  • برای راه‌اندازی برنامه در سکو، به Dockerfile هم نیاز دارین. پس فایل زیر رو به برنامه اضافه کنین:
FROM nginx:latest
COPY ./index.html /usr/share/nginx/html/index.html

اجازه بدین این دو خط کد رو بیشتر توضیح بدیم:

در دستور FROM، با استفاده از یک ایمیج پایه (nginx)، شروع به ساخت ایمیج سفارشی‌تون می‌کنین.
با استفاده از دستور COPY، فایل index.html رو در مسیر /usr/share/nginx/html کپی و بازنویسی می‌کنین.

برای اطلاعات بیشتر در مورد Dockerfile می‌تونین به این صفحه  مراجعه کنین.

حالا برنامه‌‌ای با نام MyApp در سکو ایجاد کنین:

curl --location --request POST 'https://api.sakku.cloud/app' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {token}' \
--data-raw '{
"name": "MyApp",
"mem": 0.1,"cpu": 0.1,"disk": 0.1,
"ports": [{"port": 80,"protocol": "HTTP"}],
"git": {"url": "{gitlab-repo-url]"},"deployType": "CODE",
"minInstance": 1,"maxInstance": 1
}

برای آشنایی بیشتر با نحوه‌ی ایجاد برنامه در سکو هم می‌تونین به این صفحه مراجعه کنین.

حالا با باز کردن آدرس myapp.sakku.cloud متن زیر رو می‌بینین:

This is the first content for this simple app.

خب تا اینجا برنامه‌ی شما در سکو ایجاد شد. حالا ببینیم اتصال برنامه سکو به gitlab چطوری انجام می‌شه!

. . .

۲. نصب Gitlab-runner روی سرور

برای اتصال gitlab به سرور خود، باید Gitlab-runner رو طبق مراحل زیر نصب کنین:

۲-۱. دریافت و نصب نسخه‌ی مورد‌نیاز از طریق این لینک:

برای نصب GitLab-runner، می‌تونین با توجه به سیستم‌عامل‌تون از یکی از لینک‌های زیر کمک بگیرین:

۲-۲. اتصال Gitlab runner به ریپازیتوری gitlab: 

این کار با استفاده از توکن مربوط به gitlab runner در بخش runner در تنظیمات ریپازیتوری gitlab شما انجام می‌گیره.

مراحل کار در این لینک توضیح داده شده است.

حدود ۳ الی ۴ دقیقه صبر کنین.
اگه مراحل بالا رو درست انجام داده باشین، در قسمت تنظیمات ریپازیتوری، در بخش Runners ،CI/CD و در زیر ستون Specific Runners می‌بینین که یک runner جدید و فعال با مشخصات وارد شده، ایجاد شده است.

. . .

۳. دریافت توکن بازسازی برنامه از سکو

مرحله بعدی برای اتصال برنامه سکو به gitlab، دریافت توکن بازسازی برنامه از سکو است:

اول باید توکن مربوط به بازسازی برنامه به کمک دستور زیر یکبار برای همیشه دریافت بشه. به جای
{appId}، شناسه‌‌ی برنامه‌ی خود در سکو و به جای {token}، توکنی که بعد از ورود به سکو دریافت کردین رو وارد کنین:

curl --location --request GET 'https://api.sakku.cloud/ci/app/{appId}/rebuild/getNewToken' \
--header 'Authorization: Bearer {token}'

حالا در عبارت زیر با جایگذاری شناسه‌ی برنامه {appId} و توکنی که از API قبل دریافت کردین {rebuild-token}، می‌تونین وارد مرحله بعدی بشین. (برای استفاده در لینوکس، دستور رو تغییر بدین.)

curl.exe -k -X GET https://api.sakku.cloud/ci/app/{appId}/rebuild/token/{rebuild-token}

. . .

۴. تنظیم Gitlab-runner برای پروژه

مرحله بعدی برای اتصال برنامه سکو به gitlab، تنظیم Gitlab-runner برای پروژه است:

این کار با استفاده از تنظیم فایل .gitlab-ci.yml در دایرکتوری root پروژه انجام می‌گیره.

همه‌ی دستورهای قابل استفاده در این فایل، در این لینک وجود داره.

در مثال زیر بعد از هر تغییر در کد پروژه در gitlab، تغییرات بلافاصله و به صورت خودکار در سکو به روزرسانی شده و برنامه دوباره بارگذاری می‌شه.

حالا این فایل رو به برنامه‌تون اضافه کنین:

stages:
  - deploy

Production:
  stage: deploy
  script:
    - curl.exe -k -X GET https://api.sakku.cloud/ci/app/{appId}/rebuild/token/{rebuild-token}
  only:
    - master
  tags:
    - sakku-app

- توضیحات مربوط به این فایل:

  • stages: 

stages عنوان کاریه که باید انجام بشه. stage‌ها مراحل مختلف کار هستند که شما تعیین می‌کنین به چه ترتیبی اجرا بشن. برای هر کدام از اسامی گفته شده در stages، باید یک مرحله با اون نام نوشته بشه.

  • Production: 

Production عنوان مجموعه دستوراتیه که باید انجام بشه:

  • stage: مراحل مشخص شده در stages قبلی به ترتیب در این‌جا ذکر می‌شه و وظایف اون آورده می‌شه. 
  • script: دستورهایی که لازمه، اجرا بشه. در این قسمت باید دستور فراخوانی api مربوط به rebuild مجدد پروژه که در بخش قبل به دست آوردین، بنویسین.
  • only: مشخص می‌کنه که فقط در صورت تغییر کدوم branch از ریپازیتوری گیت کاربر، این دستور اجرا بشه.
  • job :tags مربوطه که در زمان راه‌اندازی gitlab runner مشخص کردین رو تعیین می‌کنه. 

. . .

خب در این مقاله با نحوه اتصال برنامه سکو به Gitlab آشنا شدین! حالا می‌تونین تغییر دیگه‌ای در برنچ master پروژه ایجاد کنین و تغییرات رو بلافاصله پس از پایان بارگذاری برنامه در سکو مشاهده کنین.
امیدوارم این مقاله براتون مفید بوده باشه.

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