تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

اکشن‌های جدید GitHub برای استقرار سریع و بهینه در App Platform


۲۳ اسفند ۱۴۰۳

مقدمه

ابزار GitHub Actions یکی از محبوب‌ترین پلتفرم‌های گیت‌هاب است که فرایند ساخت، تست و انتشار کد را به‌صورت خودکار انجام می‌دهد. شناخت بیشتر گیت‌هاب برای توسعه‌دهندگان موضوع مهمی است که می‌تواند به به‌روزشدن دانسته‌ها و مهارتشان کمک کند. در این مقاله از بلاگ لیارا قصد داریم نسخه بهبودیافته GitHub Actions برای App Platform را معرفی کنیم. این نسخه جدید با بهبود قابلیت افزونه‌پذیری، تمامی نیازهای استقرار اپلیکیشن‌ها را برطرف کرده و انعطاف‌پذیری بیشتری برای توسعه‌دهندگان فراهم می‌آورد.

آنچه در این مقاله می‌خوانید:

  • گیت‌هاب مناسب همه فرایندها
  • استقرار اپلیکیشن از GitHub
  • استقرار اپلیکیشن از ایمیج درون GitHub Action
  • پیش‌نمایش Pull Request
  • جمع بندی
  • سوالات متداول
اکشن‌های جدید GitHub
اکشن‌های جدید GitHub

گیت‌هاب مناسب همه فرایندها

اکشن جدید استقرار، قلب سیستم GitHub Actions است. این اکشن به شما اجازه می‌دهد اپلیکیشن‌های موجود را به‌روزرسانی کنید، اما امکانات بیشتری نیز دارد. با این اکشن، می‌توانید مخزن گیت‌هاب خود را به‌عنوان منبع اصلی در سبک GitOps تنظیم کنید. همچنین می‌توانید فایل AppSpec را به مخزن گیت‌هاب خود اضافه کرده و کل فرآیند استقرار را از طریق GitHub Actions مدیریت کنید.

فایل AppSpec یک فایل پیکربندی است که برای مدیریت فرآیند استقرار اپلیکیشن‌ها استفاده می‌شود. این فایل معمولاً در فرآیندهای CI/CD (یکپارچگی و استقرار مداوم) و در پلتفرم‌های ابری مانند App Platform به کار می‌رود. در این فایل، اطلاعاتی مانند نسخه‌های اپلیکیشن، پیکربندی محیط‌ها و تنظیمات استقرار ذکر می‌شود.

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

استقرار اپلیکیشن از GitHub

برای استقرار یک اپلیکیشن به‌طور کامل از طریق GitHub بدون نیاز به ساخت آن به‌طور جداگانه، کافی است که فایل App Spec مربوطه را به مخزن گیت‌هاب اضافه کنید (اکشن به‌طور پیش‌فرض از .do/app.yaml استفاده می‌کند) و یک اکشن مشابه زیر را تنظیم کنید. این کار باعث می‌شود که هر بار که یک کامیت جدید به شاخه اصلی (main) ارسال می‌شود، اپلیکیشن مجدداً استقرار یابد (توجه داشته باشید که گزینه deploy_on_push باید در فایل App Spec غیرفعال باشد). هرگونه تغییر در خود فایل App Spec نیز به‌طور خودکار اعمال خواهد شد.

در کد زیر، یک تصویر داکر از مخزن گیت‌هاب ساخته می‌شود.

name: Update App

on:
  push:
    branches: [main]
    
permissions:
  contents: read

jobs:
  deploy-app:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Deploy the app
        uses: digitalocean/app_action/deploy@v2
        with:
          token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}

استقرار اپلیکیشن از ایمیج درون GitHub Action

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

توجه داشته باشید که image digest به‌عنوان یک متغیر محیطی با نام SAMPLE_DIGEST ارائه شده است. برای استفاده از این متغیر در فایل App Spec، باید از نماد ${SAMPLE_DIGEST} استفاده کنید.

همان‌طور که در کد زیر مشاهده می‌کنید، این GitHub Action برای ساخت، ارسال و استقرار یک تصویر داکر طراحی شده است.

name: Build, Push and Deploy a Docker Image

on:
  push:
    branches: [main]

permissions:
  contents: read
  packages: write

jobs:
  build-push-deploy-image:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Log in to the Container registry
        uses: docker/login-action@v3.3.0
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and push Docker image
        id: push
        uses: docker/build-push-action@v6.5.0
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository }}:latest
      - name: Deploy the app
        uses: digitalocean/app_action/deploy@v2
        env:
          SAMPLE_DIGEST: ${{ steps.push.outputs.digest }}
        with:
          token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}

در آخر، توجه داشته باشید که image digest به‌عنوان متغیر محیطی SAMPLE_DIGEST ارائه شده است. برای استفاده از آن در فایل App Spec، باید از نماد ${SAMPLE_DIGEST} به صورت زیر استفاده کنید:

name: sample

services:
- name: sample
 image:
   registry_type: GHCR
   registry: YOUR_ORG
   repository: YOUR_REPO
   digest: ${SAMPLE_DIGEST}

پیش‌نمایش Pull Request

در آخر، پیش‌نمایش‌های pull request نمونه‌ای عالی از قدرت خودکارسازی هستند. این ویژگی به شما اجازه می‌دهد برای هر pull request یک اپلیکیشن جدید راه بیاندازید و لینک اپلیکیشن لاگ‌های ساخت و استقرار را برای نویسنده pull request نشان دهید. با این‌کار از ادغام کدی که ممکن است، اپلیکیشن را خراب کند، جلوگیری خواهد شد.

اکنون با اکشن جدید استقرار، ایجاد چنین یکپارچگی‌ای در مخزن شما بسیار ساده می‌شود. این اکشن دارای حالت ویژه‌ای به نام PR-preview-mode است که برای هر pull request یک نام منحصر به فرد برای اپلیکیشن ایجاد می‌کند، منابعی که ممکن است باعث تداخل شوند را از فایل app spec حذف می‌کند (مثل دامنه‌ها و هشدارها)، و تمام ارجاعات به گیت‌هاب را به شاخه مربوط به PR به‌روزرسانی می‌کند.

در کنار اکشن جدید استقرار، یک اکشن جدید برای حذف اپلیکیشن‌ها هم اضافه شده است که به شما این امکان را می‌دهد که اپلیکیشن‌ها را مجددا حذف کنید. معمولاً این کار زمانی انجام می‌شود که یک pull request بسته یا ادغام (merge) می‌شود تا منابع غیرضروری حذف شوند.

پیش‌نمایش Pull Request
پیش‌نمایش Pull Request

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

کدی که در زیر مشاهده می‌کنید، یک اکشن برای استقرار پیش‌نمایش اپلیکیشن در App Platform است که پس از ارسال pull request به شاخه main، وضعیت استقرار را به کامنت اضافه می‌کند.

name: App Platform Preview

on:
  pull_request:
    branches: [main]

permissions:
  contents: read
  pull-requests: write

jobs:
  test:
    name: preview
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Deploy the app
        id: deploy
        uses: digitalocean/app_action/deploy@v2
        with:
          deploy_pr_preview: "true"
          token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
      - uses: actions/github-script@v7
        env:
          BUILD_LOGS: ${{ steps.deploy.outputs.build_logs }}
          DEPLOY_LOGS: ${{ steps.deploy.outputs.deploy_logs }}
        with:
          script: |
            const { BUILD_LOGS, DEPLOY_LOGS } = process.env
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `:rocket: :rocket: :rocket: The app was successfully deployed at ${{ fromJson(steps.deploy.outputs.app).live_url }}.`
            })
      - uses: actions/github-script@v7
        if: failure()
        with:
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `The app failed to be deployed. Logs can be found [here](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}).

              ## Logs
              <details>
              <summary>Build logs</summary>
              
              \`\`\`
              ${BUILD_LOGS}
              \`\`\`
              </details>
              
              <details>
              <summary>Deploy logs</summary>

              \`\`\`
              ${DEPLOY_LOGS}
              \`\`\`
              </details>`
            })

در ادامه یک اکشن کد برای پیش‌نمایش اپلیکیشن در App Platform مشاهده می‌کنید.

name: Delete Preview

on:
  pull_request:
    types: [ closed ]

jobs:
  closed:
    runs-on: ubuntu-latest
    steps:
      - name: delete preview app
        uses: digitalocean/app_action/delete@v2
        with:
          from_pr_preview: "true"
          ignore_not_found: "true"
          token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}

این کد، زمانی که یک pull request بسته می‌شود، اپلیکیشن پیش‌نمایش را حذف می‌کند.

جمع بندی

اکشن‌های جدید GitHub برای استقرار در App Platform امکان استقرار سریع و بهینه اپلیکیشن‌ها را فراهم می‌کنند. با استفاده از این اکشن‌ها، می‌توانید به‌راحتی اپلیکیشن‌ها را برای هر pull request مستقر کنید، پیش‌نمایش‌ها را مشاهده کنید و در صورت نیاز، اپلیکیشن‌های غیرضروری را حذف کنید. این ابزارها باعث بهبود فرآیند توسعه، تست و مدیریت منابع در App Platform می‌شوند.

سوالات متداول

1-  Github Actions چیست و به چه دردی می‌خورد؟

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

2- استفاده از Github Actions رایگان است؟

استفاده از GitHub Actions برای پروژه‌های عمومی و کوچک رایگان است، اما برای پروژه‌های بزرگ محدودیت‌هایی وجود دارد که می‌توانید با توجه به پلن‌های آن خریداری کنید.

3- می‌توانم Github Actions رو با سرویس‌ها و ابزارهای دیگه ادغام کنم؟

بله، Github Actions قابلیت ادغام با خیلی از سرویس‌ها و ابزارهای خارجی مثل AWS، Azure، Slack و غیره را دارد.

4- می‌توانم اکشن‌های سفارشی خودم را بسازم؟

بله، این امکان وجود دارد.

5- Github Actions از چه سیستم‌عامل‌هایی پشتیبانی می‌کند؟

Github Actions از سیستم‌عامل‌های مختلف مثل لینوکس، ویندوز و مک پشتیبانی می‌کند.

6- چطور می‌توانم امنیت کدها را با Github Actions بهتر کنم؟

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