در چرخه حیات توسعه نرمافزار مدرن، سرعت و قابلیت اطمینان حیاتی هستند. پایپلاینهای یکپارچهسازی و استقرار مداوم (CI/CD) ستون فقرات این کارایی هستند و به تیمهای توسعه اجازه میدهند تغییرات کد را بهطور مکرر ادغام کرده و با اطمینان به محیط تولید مستقر کنند. در حالی که ابزاری مانند Jenkins و GitLab CI مدتهاست که در این حوزه تسلط دارند، GitHub Actions به عنوان یک رقیب جدی ظهور کرده است که یکپارچگی عمیقی با اکوسیستم GitHub و سینتکسی قدرتمند و انعطافپذیر ارائه میدهد.
این راهنما بررسی میکند که چگونه میتوان یک پایپلاین CI/CD قوی را با استفاده از GitHub Actions ساخت و از مفاهیم پایه به پیکربندیهای پیشرفته workflow حرکت کرد.
درک workflowها و راهاندازها (Triggers)
در هسته GitHub Actions، workflowها قرار دارند. اینها فرآیندهای خودکاری هستند که میتوانید آنها را در مخزن خود برای ساخت، آزمایش، بستهبندی، انتشار یا استقرار هر پروژه کدی در GitHub تنظیم کنید. یک workflow توسط یک فایل YAML تعریف میشود که در دایرکتوری `.github/workflows` مخزن شما ذخیره میگردد.
اولین مرحله در طراحی یک پایپلاین، تعریف راهاندازها (triggers) است. GitHub Actions از رویدادهای مختلفی مانند `push`، `pull_request`، `schedule` و `workflow_dispatch` پشتیبانی میکند. برای یک پایپلاین استاندارد CI/CD، معمولاً میخواهید workflow زمانی فعال شود که کدی به شاخه خاصی push شود یا زمانی که یک pull request باز میشود.
```yaml
name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
```
در مثال بالا، پایپلاین در هر push به شاخههای `main` یا `develop` و هر زمان که یک pull request به شاخه `main` هدف قرار گیرد، اجرا میشود. این موضوع تضمین میکند که کد قبل از رسیدن به محیط تولید اعتبارسنجی شود.
Jobها، Runnerها و Stepها
یک workflow شامل یک یا چند job است که هر کدام شامل یک یا چند step هستند. هر step یا یک اسکریپت shell است که اجرا میشود یا یک action است که اجرا خواهد شد. Actionها بلوکهای سازنده قابل استفاده مجدد در GitHub Actions هستند که از actionهای رسمی نگهداریشده توسط GitHub تا آنهایی که توسط جامعه کاربری ارائه شدهاند، متغیرند.
برای یک برنامه معمول Node.js، پایپلاین ممکن است به این شکل باشد:
```yaml
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Run tests
run: npm test
```
در اینجا، ما یک job تکی به نام `build-and-test` را تعریف میکنیم که روی آخرین نسخه Ubuntu اجرا میشود. مراحل شامل کلون کردن کد، راهاندازی محیط Node.js، نصب وابستگیها با استفاده از `npm ci` (که ساختهای تکرارپذیر را تضمین میکند) و اجرای اسکریپتهای linting و testing است.
متغیرهای محیطی و Secrets
با رشد پایپلاین شما، نیاز به مدیریت دادههای حساس مانند کلیدهای API، اعتبارنامههای پایگاه داده و توکنهای استقرار خواهید داشت. GitHub Actions راهی امن برای مدیریت این موارد از طریق repository secrets ارائه میدهد. شما نباید هرگز secrets را به صورت هاردکد شده در فایلهای YAML خود قرار دهید.
برای استفاده از یک secret، آن را از طریق context `secrets` در workflow خود ارجاع میدهید. برای مراحل استقرار، ممکن است این secrets را به اسکریپت استقرار خود منتقل کنید:
```yaml
- name: Deploy to Production
if: github.ref == 'refs/heads/main'
run: |
./deploy.sh
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }}
```
شرط `if` تضمین میکند که استقرار تنها زمانی رخ دهد که کد در شاخه `main` ادغام شده باشد، که از استقرارهای تصادفی از شاخههای ویژگی (feature branches) جلوگیری میکند.
کشگذاری و بهینهسازی
یکی از مزایای عملکردی مهم GitHub Actions، ویژگی کشگذاری آن است. با کش کردن وابستگیهایی مانند `node_modules` یا مخازن Maven، میتوانید زمان اجرای jobها را به طور قابل توجهی کاهش دهید. action `actions/cache` به شما اجازه میدهد یک کلید را بر اساس فایل lock مشخص کنید، که تضمین میکند کش تنها زمانی نامعتبر شود که وابستگیها تغییر کنند.
```yaml
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
```
نتیجهگیری
GitHub Actions مجموعهای جامع از ابزارها را برای خودکارسازی workflow توسعه نرمافزار شما فراهم میکند. با بهرهگیری از workflowها، actionها و کشگذاری، میتوانید پایپلاینهایی بسازید که نه تنها کارآمد، بلکه امن و قابل نگهداری هستند. چه در حال استقرار یک پروژه جانبی کوچک باشید و چه یک برنامه سازمانی در مقیاس بزرگ، تسلط بر GitHub Actions مهارتی ضروری برای هر مهندس DevOps مدرن است. کوچک شروع کنید، روی workflowهای خود تکرار کنید و سرعت توسعه خود را به اوج برسانید.