چگونه با GitHub Actions، CI/CD خود را خودکار کنیم؟

چگونه با GitHub Actions، CI/CD خود را خودکار کنیم؟

Continuous Integration (CI) و Continuous Delivery (CD) از مفاهیم کلیدی در توسعه نرم‌افزار مدرن هستند. با خودکارسازی فرآیندهای ساخت و استقرار کد، می‌توانید خطاها را کاهش دهید و تحویل سریع‌تر و قابل اطمینان‌تری داشته باشید. GitHub Actions یکی از ابزارهای قدرتمند برای خودکارسازی CI/CD Pipeline است که مستقیماً در GitHub یکپارچه شده و به توسعه‌دهندگان اجازه می‌دهد تا وظایف مختلف مانند build، test و deploy را خودکار کنند.

CI/CD چیست؟

  • Continuous Integration (CI) به فرآیندی اشاره دارد که در آن تغییرات کد به طور مداوم به یک مخزن مرکزی وارد می‌شوند و تست‌ها و buildها به صورت خودکار برای بررسی کیفیت کد اجرا می‌شوند.
  • Continuous Delivery (CD) مرحله بعدی CI است که فرآیند تحویل نرم‌افزار به محیط‌های مختلف (مانند staging یا production) را خودکار می‌کند. در CD, هدف این است که هر تغییر در کد به طور خودکار آماده‌ی استقرار باشد.

GitHub Actions چیست؟

GitHub Actions یک ابزار CI/CD کاملاً یکپارچه در GitHub است که به شما امکان می‌دهد workflows خود را برای خودکارسازی وظایف مختلف در فرآیند توسعه تعریف کنید. Actions از YAML برای تعریف workflows استفاده می‌کند و می‌تواند بر اساس events مختلف (مانند push به یک مخزن، pull requests، یا حتی زمان‌بندی‌های منظم) اجرا شود.

نحوه کار GitHub Actions

در GitHub Actions، شما workflows را با استفاده از فایل‌های YAML تعریف می‌کنید. این فایل‌ها در پوشه .github/workflows/ مخزن قرار می‌گیرند. هر workflow شامل مراحل یا jobs است که این jobs خود شامل چندین step هستند. هر step می‌تواند یک shell script یا یک action از قبل تعریف‌شده باشد.

ساختار یک Workflow

یک نمونه از یک فایل workflow ساده که کد را می‌سازد و تست‌ها را اجرا می‌کند به شکل زیر است:

name: CI Pipeline

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '16'

      - name: Install dependencies
        run: npm install

      - name: Run tests
        run: npm test

توضیحات بخش‌های کلیدی:

  • on: این بخش triggers را مشخص می‌کند، یعنی زمانی که این workflow اجرا شود. در اینجا هر بار که یک push یا pull request روی شاخه‌ی main انجام شود، این workflow فعال خواهد شد.
  • jobs: این بخش، وظایف مختلف (مثل ساختن، تست کردن یا استقرار) را در بر می‌گیرد. هر job می‌تواند روی یک ماشین مجازی (به عنوان مثال ubuntu-latest) اجرا شود.
  • steps: هر job شامل چندین step است. این مراحل می‌توانند شامل اجرای actions از قبل تعریف‌شده یا اسکریپت‌های دلخواه باشند.

CI/CD Pipeline کامل با استقرار

برای استقرار خودکار کد، علاوه بر build و test، نیاز داریم کد را به محیط تولید deploy کنیم. فرض کنید یک Node.js برنامه داریم که از Docker برای استقرار استفاده می‌کند. در اینجا یک مثال کامل از workflow CI/CD شامل ساخت، تست و استقرار کد با GitHub Actions آورده شده است:

name: CI/CD Pipeline

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '16'

      - name: Install dependencies
        run: npm install

      - name: Run tests
        run: npm test

      - name: Build Docker image
        run: docker build -t my-app:latest .

      - name: Log in to Docker Hub
        run: echo "${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}" | docker login -u "${{ secrets.DOCKER_HUB_USERNAME }}" --password-stdin

      - name: Push Docker image to Docker Hub
        run: docker push my-app:latest

  deploy:
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: Deploy to Production Server
        run: ssh [email protected] "docker pull my-app:latest && docker-compose up -d"

نکات مهم:

  • triggers: این workflow به گونه‌ای تنظیم شده که فقط زمانی که تغییرات روی شاخه main انجام می‌شوند، اجرا شود.
  • Docker image: در بخش build، تصویر Docker برنامه ساخته شده و در Docker Hub بارگذاری می‌شود. این کار از طریق GitHub Secrets ایمن‌سازی شده است.
  • Deployment: در بخش deploy، پس از اینکه تصویر Docker با موفقیت ساخته و در Docker Hub بارگذاری شد، تصویر در سرور تولید کشیده و به روزرسانی می‌شود.

استفاده از Secrets در GitHub Actions

یکی از جنبه‌های امنیتی مهم در CI/CD استفاده از secrets برای ذخیره‌سازی اطلاعات حساس مانند API tokens یا credentials است. GitHub به شما این امکان را می‌دهد تا secrets را در بخش repository settings ذخیره کنید و از آنها در workflowهای خود استفاده کنید.

برای افزودن secrets:

  1. به مخزن GitHub خود بروید.
  2. به قسمت Settings > Secrets > Actions بروید.
  3. نام و مقدار secret خود را وارد کنید.

نکات مهم برای بهینه‌سازی CI/CD در GitHub Actions:

  1. Parallel Jobs: شما می‌توانید چندین job را به صورت همزمان اجرا کنید تا زمان اجرای pipeline کاهش یابد. برای این کار کافی است چندین job مستقل تعریف کنید.
  2. Caching: با استفاده از actions/cache می‌توانید بسته‌های وابستگی یا فایل‌های کامپایل‌شده را کش کنید تا زمان اجرای build در اجراهای بعدی کاهش یابد. مثال زیر نشان می‌دهد چگونه می‌توانید node_modules را کش کنید:
- name: Cache dependencies
  uses: actions/cache@v3
  with:
    path: node_modules
    key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-
  1. Self-hosted Runners: اگر نیاز به منابع یا زمان اجرای بیشتری دارید، می‌توانید از self-hosted runners برای اجرای workflows خود استفاده کنید. این امکان به شما اجازه می‌دهد تا کنترل کامل‌تری روی محیط اجرای CI/CD داشته باشید.
  2. Matrix Builds: برای اجرای تست‌ها یا buildهای خود روی چندین نسخه از زبان‌های برنامه‌نویسی یا سیستم‌عامل‌های مختلف می‌توانید از matrix builds استفاده کنید. مثال زیر نشان می‌دهد چگونه تست‌های خود را روی چند نسخه از Node.js اجرا کنید:
jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [12, 14, 16]

    steps:
      - uses: actions/checkout@v3
      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm install
      - run: npm test
    

نتیجه‌گیری

GitHub Actions یکی از بهترین ابزارها برای خودکارسازی CI/CD در پروژه‌های نرم‌افزاری است. با استفاده از این ابزار، شما می‌توانید workflows پیچیده‌ای بسازید که تمامی جنبه‌های توسعه، تست و استقرار را پوشش دهد. خودکارسازی این فرآیندها نه تنها زمان توسعه را کاهش می‌دهد، بلکه باعث می‌شود که کیفیت و پایداری کد به شکل محسوسی افزایش یابد.

استفاده از ویژگی‌هایی مانند caching، parallel jobs، و matrix builds می‌تواند بهینه‌سازی بیشتری برای CI/CD Pipeline شما به همراه داشته باشد و با ذخیره‌سازی secrets، امنیت نیز بهبود می‌یابد.