آموزش کامل CI/CD با GitHub Actions: از کد تا استقرار خودکار
هر بار پوش کردن دستی کد، اجرای دستی تستها و آپلود دستی فایلها روی سرور، هم زمانبر است و هم مستعد خطای انسانی. CI/CD این فرآیند را خودکار میکند: از لحظهای که کد پوش میشود تا لحظهای که نسخهٔ جدید روی سرور تولید در دسترس کاربران قرار میگیرد.
CI/CD چیست؟
CI (Continuous Integration) یعنی با هر تغییر در کد، بهصورت خودکار تستها اجرا و کیفیت کد بررسی شود. CD (Continuous Deployment/Delivery) یک قدم جلوتر میرود و در صورت موفقیت تستها، نسخهٔ جدید را بهصورت خودکار روی سرور مستقر میکند.
اجزای اصلی GitHub Actions
| مفهوم | توضیح |
|---|---|
| Workflow | یک فایل YAML که کل فرآیند خودکار را تعریف میکند |
| Job | مجموعهای از مراحل که روی یک Runner اجرا میشوند |
| Step | یک دستور یا Action مشخص درون یک Job |
| Runner | ماشینی (مجازی یا خودمیزبان) که Job روی آن اجرا میشود |
نوشتن اولین Workflow
فایلهای Workflow در مسیر .github/workflows/ پروژه قرار میگیرند. نمونهای ساده برای اجرای تستها با هر Push:
name: CI
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm install
- run: npm testساخت و انتشار Docker Image
اگر برنامهٔ خود را طبق Docker کانتینری کردهاید، میتوانید مرحلهای برای Build و Push خودکار Image اضافه کنید:
build-and-push:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: Build and Push
run: |
docker build -t myapp:latest .
docker push myapp:latestاستقرار خودکار روی سرور
مرحلهٔ آخر معمولاً اتصال به سرور تولید و بهروزرسانی سرویس در حال اجراست. برای پروژههایی که روی Kubernetes اجرا میشوند، این مرحله میتواند دستور kubectl set image باشد؛ اگر با مفاهیم پایهٔ آن آشنا نیستید، مقالهٔ معرفی Kubernetes نقطهٔ شروع خوبی است. برای استقرار روی یک سرور ساده هم میتوان از یک Step با SSH استفاده کرد:
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
docker pull myapp:latest
docker compose up -dمدیریت Secrets
هیچوقت رمز عبور، کلید SSH یا توکن را مستقیم در فایل Workflow ننویسید. تمام این مقادیر باید در بخش Settings > Secrets and variables > Actions مخزن گیتهاب ذخیره و از طریق ${{ secrets.NAME }} در Workflow استفاده شوند.
جمعبندی
GitHub Actions با تعریف Workflowهای ساده در قالب YAML، کل مسیر از تست تا استقرار را خودکار میکند و ریسک خطای انسانی در دیپلوی دستی را از بین میبرد. شروع با یک Workflow ساده برای تست، و افزودن تدریجی مراحل Build و Deploy، بهترین مسیر یادگیری این ابزار است.
ترکیب CI/CD با اتوماسیون پیکربندی
در بسیاری از پایپلاینهای CI/CD، پس از استقرار کد، نیاز به پیکربندی خودکار سرورهای هدف نیز وجود دارد. ابزارهایی مانند Ansible میتوانند این مرحله را بدون نیاز به Agent روی سرورها انجام دهند؛ جزئیات کامل در مقاله Ansible: اتوماسیون نصب و پیکربندی سرورها آمده است.