ebrahim khodadadi
ebrahim khodadadi
خواندن ۴ دقیقه·۲ سال پیش

قدم به قدم پیاده سازی CI/CD گیتهاب برای دات نت به زبان ساده

چکیده:

چطور میتونم بعد از اتفاقی که روی گیت پروژه میفته پروژه دات نتم رو بیلد، تست یا دیپلوی کنم؟

در ادامه مطلب به پاسخ این سوال میپردازیم.

نکته: بهتره که با docker , github, ubuntu آشنا باشید

مراحل:

۱- بعد از ایجاد پروژه دات نت باید فایل های زیر رو به پروژه اضافه کنیم

  • داکر فایل (حاوی اطلاعاتی مثل نحوه بیلد پروژه)
  • فایل داکر کمپوس (حاوی عملیات های ران کردن کانتینر داکر)
  • فایل گیتهاب اکشن (حاوی رخدادی که در گیت اتفاق می افته و عملیاتی که بعد از اون اتفاق باید انجام بشه)

دو فایلی که داکر نیاز داره رو خوده visual studio برای ما میسازه پس روی لایه ای که برای استفاده استارتش میکنیم مراحل زیر رو اجرا میکنیم

و دو فایل زیر به پروژه اضافه میشن

حالا باید خط زیر رو تغییر بدیم و فقط این دو مقدار رو اضافه کنیم که به پروژه بگیم روی چه پورتی ران بشه من پورت ۸۰ رو در نظر گرفتم

همین جا کارمون با visual studio تموم میشه و پروژه رو پوش کنید روی گیتهاب (برای بقیه سرویس های گیت مراحل بعد یعنی دستورات اکشن ها متفاوت هست و اینجا گیتهاب رو توضیح میدم)

نکته: اگر پروژتون از sql یا هر تکنولوژی دیگه ای استفاده میکنه که میخواید همراه پروژه دیپلوی بشه باید فایل docker-compose.yml رو که اضافه کردیم تغییر بدید مثال های این فایل رو داخل لینک زیر قرار دادم

https://github.com/ebrahimkhodadadi/gitsharp/blob/main/Docker/asp-docker-compose.yml

نکته بعدی هم این که در docker-compose پورت Api رو باز کنید که بتونید از بیرون ببینیدش پس خط زیر رو اضافه کنید

ports: - "80:80"

اگر هم port باز نشد که با دستور

sudo ufw allow 80

۲- مرحله بعد گیتهاب اکشن ها رو اضافه کنید (بعد از اضافه کردن اکشن ها اگر ویژوال استادیوتون آپدیت باشه و pull کنید شاخه Github Actions در کنار لایه های پروژه اضافه شده) پس وارد ریپوزیتوری گیتهاب بشید و تب Action و روی setup a workflow کلیک کنید

یا میتونید خودتون مثل مسیری که داخل تصویر معلوم هست فولدر بندی کنید و فایل تنظیمات اکشن رو با پسوند yml بسازید

معمولا دو فایل ایجاد میکنم یکی برای بیلد و تست و یکی هم برای دیپلوی

کد گیتهاب اکشنی که برای بیلد و تست استفاده میکنم:

name: build and test
on: [push]
jobs:
build:
runs-on: ubuntu-latest
env:
DOTNET_INSTALL_DIR: &quot./.dotnet&quot
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
- name: Restore dependencies
run: dotnet restore src/Presentation/Api.csproj
- name: Build
run: dotnet build src/Presentation/Api.csproj --no-restore

تنها جایی که باید تغییر بدید دستورات run هست که مسیر ها رو باید تغییر بدید

کد گیتهاب اکشنی که برای دیپلوی استفاده میکنم:

name: Deploy Develop
on:
push: pull_request:
types: [closed]
branches:
- develop
jobs:
build:
runs-on: [self-hosted, linux]
steps:
- uses: actions/checkout@v3 - name: build project run: docker-compose build
- name: start docker container
run: docker-compose up -d - name: remove old images run: docker system prune -a -f

در on میتونید رخدادی که اتفاق می افته و برنچی که در اون این رخداد اتفاق افتاده رو معلوم کنید در steps مراحلی که به ترتیب میخواید اجرا بشه

مهم تر از همه runs-on خوده گیتهاب به ما یک سری سیستم عامل مثل ubuntu-latest موقت ارائه میده که بتونیم روش دستور اجرا کنیم ولی برای Deploy باید از self-Host runner استفاده کنیم یعنی سرور خودمون رو به گیتهاب وصل کنیم که میشه مثلا [self-hosted, linux]

این فایل ها رو روی پروژه کامیت و پوش کنید اگر به self-Host runner نیاز داشتید صفحه ریپوزیتوری گیتهاب رو باز کنید و وارد صفحه زیر بشید

روی دکمه new self-hosted runner که کلیک کنید صفحه بالا باز میشه و یک سری دستور نوشته که دقیقا همین دستورات رو روی سرورتون اجرا کنید بعد از کانفیگ سرور وارد همین مسیر که بشید سرور شما اضافه شده

نکته: مرحله اخر به جای دستور ./run باید به عنوان سرویس رانر اجرا بشه پس دستورات زیر رو در مرحله نهایی اجرا کنید:

sudo ./svc.sh install

sudo ./svc.sh start

sudo ./svc.sh status

و برای حذف هم

sudo ./svc.sh uninstall

./config.sh remove

داخل کد گیتهاب اکشنی که برای دیپلوی نوشتید یک کانتینر داکر ران میشه پس باید از قبل داکر رو روی سرور نصب کرده باشید

برای چک کردن اتفاقاتی که داخل اکشن ها میفته از صفحه repository همون تب Action ها به تاریخچه دسترسی دارید

ممکنه که وقتی میخواید دیپلوی رو روی داکر انجام بدید به یک سری مشکلات مثل دسترسی بخورید که داخل همین تب میتونید ارورش رو چک کنید. اگر داکر در حال اجرا نبود دستورات زیر رو اجرا کنید

systemctl start docker

systemctl enable docker

گیتهاب رانر که اجرا شد دسترسی root نمیگیره پس برای این که داکر رو بتونید از بیرون ببینید دسترسیش رو به این شکل باز کنید

Create a Systemd service file:

  1. sudo nano /etc/systemd/system/docker-permissions.service

Add the following content:

[Unit]
Description=Set Docker Socket Permissions
After=docker.service
[Service]
Type=oneshot
ExecStart=/bin/chmod 666 /var/run/docker.sock
[Install]
WantedBy=multi-user.target

Save and exit the file.

Enable the service:

sudo systemctl enable docker-permissions

Start the service:

sudo systemctl start docker-permissions

به عنوان اخرین نکته سعی کنید سرور های هر کشوری به جز ایران رو به عنوان self-host runner انتخاب کنید! عمده مشکلاتی و ارور هایی که پیش میاد به همین دلیل هست یا روی سرور خودتون با تغییر فایل /etc/resolve.conf بیاید و DNS های shecan.ir رو ست کنید

Good luck!

گیتهابcigithub actiondockerASP.NET CORE
شاید از این پست‌ها خوشتان بیاید