در چرخه حیات توسعه نرمافزار مدرن، یکپارچهسازی مداوم و استقرار مداوم (CI/CD) نه تنها یک لوکس، بلکه ضرورتی برای حفظ کیفیت کد، تسریع تحویل و کاهش اصطکاک استقرار است. در حالی که ابزارهایی مانند Jenkins، GitLab CI و CircleCI سالها این فضا را در اختیار داشتهاند، GitHub Actions به عنوان یک رقیب قدرتمند ظهور کرده است که بهطور عمیق در اکوسیستم GitHub یکپارچه شده است. این یکپارچهسازی به توسعهدهندگان اجازه میدهد تا جریانهای کاری خود را کاملاً در داخل مخزن تعریف، اجرا و مدیریت کنند و نیاز به سرورهای ساخت خارجی و تغییر زمینه را از بین میبرد.
درک مفاهیم پایه
قبل از غرق شدن در پیکربندی، درک بلوکهای سازنده معماری GitHub Actions حیاتی است. این پلتفرم بر اساس سلسلهمراتبی از اجزا عمل میکند:
- جریان کاری (Workflow): یک فرآیند خودکار که شما آن را در یک فایل YAML در دایرکتوری
.github/workflows مخزن خود تعریف میکنید. یک جریان کاری شامل یک یا چند شغل (Job) است.
- شغل (Job): مجموعهای از مراحل که روی یک رانر (Runner) یکسان اجرا میشوند. هر مرحله یا یک اسکریپت پوسته است یا یک اکشن.
- رانر (Runner): سروری که جریانهای کاری شما را هنگام فعالسازی اجرا میکند. GitHub رانرهای میزبانیشده (ubuntu-latest, windows-latest, macos-latest) را بهطور رایگان برای مخازن عمومی ارائه میدهد.
- رویداد (Event): یک فعالیت خاص که یک جریان کاری را فعال میکند، مانند push، درخواست کشش (pull request) یا زمانبندی.
- اکشن (Action): کوچکترین بلوک سازنده یک جریان کاری GitHub Actions. اکشنها برنامههای سفارشی هستند که یک وظیفه پیچیده اما مکرر را انجام میدهند، مانند بررسی کد یا راهاندازی محیط اجرا.
راهاندازی اولین جریان کاری شما
جذابترین جنبه GitHub Actions سادگی آن است. برای ایجاد یک پایپلاین، شما یک فایل YAML ایجاد میکنید. بیایید یک مثال عملی بسازیم: یک پایپلاین استاندارد برای پروژه Node.js که وابستگیها را نصب میکند، تستها را اجرا میکند و برنامه را با هر push به شاخه اصلی میسازد.
فایلی به نام
.github/workflows/nodejs-ci.yml در ریشه مخزن خود ایجاد کنید. ساختار با تعریف نام جریان کاری و محرکها (رویدادها) آغاز میشود.
name: Node.js CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build
در این پیکربندی، ما از استراتژی
matrix برای تست برنامه در برابر چندین نسخه Node.js بهطور همزمان استفاده میکنیم. این امر سازگاری در محیطهای مختلف را تضمین میکند. مرحله
actions/checkout یک اکشن عمومی است که توسط GitHub ارائه شده تا کد شما را به فضای کاری رانر بیاورد. اکشن
actions/setup-node نصب زمان اجرا (runtime) Node.js را خودکار میکند و ما را از نوشتن اسکریپتهای پوسته پیچیده برای راهاندازی محیط نجات میدهد.
استفاده از Secrets برای استقرارهای امن
همانطور که پایپلاینها رشد میکنند، اغلب به اطلاعات حساس مانند اعتبارنامههای Docker Hub، کلیدهای دسترسی AWS یا توکنهای استقرار نیاز دارند. کدگذاری سخت (Hardcoding) این مقادیر یک خطر امنیتی حیاتی است. GitHub Actions راهی امن برای مدیریت این موضوع از طریق
Actions Secrets ارائه میدهد.
برای ذخیره این مقادیر به
Settings > Secrets and variables > Actions مخزن خود بروید. سپس میتوانید از آنها در فایلهای YAML خود با استفاده از زمینه
secrets ارجاع دهید.
- name: Deploy to AWS S3
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Upload to S3
run: aws s3 sync ./dist s3://my-production-bucket
با استفاده از نحو
${{ secrets.MY_SECRET }}، GitHub اطمینان حاصل میکند که مقادیر در گزارشها (logs) ماسکه میشوند و از افشای تصادفی دادههای حساس جلوگیری میکند، در حالی که به جریان کاری شما اجازه میدهد تا با خدمات خارجی بهطور امن احراز هویت کند.
بهینهسازی و عیبیابی پایپلاینها
همزمان با مقیاسپذیری زیرساخت شما، کارایی پایپلاین اهمیت حیاتی پیدا میکند. برای بهینهسازی، استفاده از
actions/cache برای کش کردن وابستگیهایی مانند
node_modules یا لایههای Docker را در نظر بگیرید. این کار زمان اجرا و مصرف انرژی را به شدت کاهش میدهد. علاوه بر این، استفاده از
needs در شغلهای شما به شما امکان میدهد تا نمودارهای وابستگی پیچیده ایجاد کنید. برای مثال، ممکن است بخواهید مرحله استقرار را در صورت شکست خوردن شغل تست، رد کنید.
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: echo "Running tests"
deploy:
needs: test
runs-on: ubuntu-latest
if: success()
steps:
- run: echo "Deploying only if tests passed"
نتیجهگیری
GitHub Actions با آوردن CI/CD بهطور بومی به پلتفرمی که بیشتر کدها در آن قرار دارند، این مفهوم را دموکراتیک کرده است. پیکربندی مبتنی بر YAML آن شهودی است، بازار گسترده اکشنهای قابل استفاده مجدد توسعه را تسریع میکند و یکپارچهسازی آن با رابط کاربری GitHub دید فوری نسبت به سلامت پایپلاین را فراهم میآورد. برای توسعهدهندگان متوسط و پیشرفته، تسلط بر Actions به معنای فراتر رفتن از ساختهای ساده و ایجاد پایپلاینهای DevOps قوی، امن و کارآمد است که واقعاً تیم توسعه شما را توانمند میسازد. کوچک شروع کنید، اغلب تکرار کنید و از مشارکتهای جامعه برای ساخت زیرساخت ایدهآل خود استفاده کنید.