رفیق برنامهنویس، تا حالا شده کد بزنی و بعد از کلی کار، بفهمی یه جای کار میلنگه؟ یا همکارات کدت رو مرج کنن و همه چی بهم بریزه؟ نگران نباش، اینجاییم تا با یه پایپلاین CI ساده و کاربردی، نجاتت بدیم. آمادهایم که با هم یه CI درست و حسابی برای ریپوهات بسازیم؟ بزن بریم!
چرا اصلاً به CI نیاز داریم؟ یه داستان کوتاه از دنیای واقعی:
فکر کن داری روی یه فیچر جدید کار میکنی، کلی هم هیجان داری که زودتر تمومش کنی. کد رو میزنی، روی سیستم خودت همهچی گل و بلبله، تستهای لوکال رو هم پاس میکنی. بعدش Pull Request (PR) رو باز میکنی و منتظری که مرج بشه. اما چند دقیقه بعد، یه پیغام خطا دریافت میکنی: «Build Failed» یا «Tests Failed on CI». ای وای! دوباره باید برگردی و دیباگ کنی. اینجاست که اهمیت یه پایپلاین CI درست و حسابی مشخص میشه.

CI یا Continuous Integration، یعنی ادغام مداوم. یعنی هر بار که کد جدیدی رو به مخزن اصلی اضافه میکنی (یا حتی فقط یه PR باز میکنی)، یه سری فرآیند خودکار اجرا میشن تا مطمئن بشن کدت با بقیه کدها سازگاره و مشکلی ایجاد نمیکنه. این کار باعث میشه باگها زودتر پیدا بشن و تیمت بتونه با سرعت و کیفیت بیشتری پیش بره. اگه میخوای بیشتر در مورد مباحث DevOps بدونی، حتماً به این بخش سر بزن.
نکته طلایی: CI نه تنها باگها رو زودتر پیدا میکنه، بلکه با ایجاد اعتماد به کدبیس، سرعت توسعه تیم رو هم چندین برابر افزایش میده. فکر کن چقدر زمان برای دیباگ کردنهای لحظه آخری صرفهجویی میشه!
اجزای تشکیلدهنده یه پایپلاین CI حداقلی:
برای شروع، لازم نیست یه CI خیلی پیچیده و پر زرق و برق داشته باشیم. سه تا مرحله اصلی هست که هر پایپلاین CI باید داشته باشه تا کدت رو از شر مشکلات اولیه نجات بده. این سه مرحله مثل سه تا دوست وفادار میمونن که همیشه هواتو دارن.
- نصب وابستگیها (Install Dependencies): این مرحله مطمئن میشه که همه چیزهایی که کدت برای اجرا نیاز داره (مثل پکیجها و کتابخانهها) نصب شده باشن.
- اجرای تستها (Run Tests): مهمترین بخش! اینجا تستهای خودکار کدت اجرا میشن تا مطمئن بشیم تغییرات جدید، چیزی رو خراب نکرده باشه.
- گیت Pull Request (PR Gate): این مرحله اجازه نمیده کدی که تستهاش پاس نشده یا مشکلی داره، مرج بشه. مثل یه نگهبان سختگیر!
برای پیادهسازی این مراحل، ابزارهای مختلفی وجود داره، اما یکی از محبوبترین و در دسترسترینها، گیتهاب اکشنز هست که ما هم تو این مقاله روی اون تمرکز میکنیم. گیتهاب اکشنز بهت اجازه میده که workflowهای CI/CD رو مستقیماً توی مخزن گیتهابت تعریف کنی.

مرحله اول: نصب وابستگیها (Install Dependencies): آمادهسازی صحنه
قبل از اینکه بتونیم کدمون رو تست کنیم، باید مطمئن بشیم که تمام چیزهایی که لازم داره، آمادهست. فرض کن میخوای یه غذای خوشمزه درست کنی، اول باید همه مواد اولیه رو آماده کنی، درسته؟ نصب وابستگیها هم دقیقاً همون کاره.
تو گیتهاب اکشنز، این کار معمولاً با استفاده از دستورات پکیجمنیجر مربوط به زبان برنامهنویسیت انجام میشه. مثلاً اگه پایتون کار میکنی، `pip install -r requirements.txt`، اگه Node.js، `npm install` یا `yarn install` و اگه جاوا، `mvn install` یا `gradle build` استفاده میکنی. گیتهاب اکشنز یه سری اکشن آماده برای زبانهای مختلف داره که این کار رو برات راحتتر میکنه.
مرحله دوم: اجرای تستها (Run Tests): امتحان کدهات
حالا که همه چیز نصب شده، وقتشه که کدت رو امتحان کنیم. این مرحله، قلب تپنده CI هست. اینجا تستهای واحد (Unit Tests)، تستهای ادغام (Integration Tests) و هر تست خودکار دیگهای که نوشتی، اجرا میشن. اگه حتی یه تست هم fail بشه، کل پایپلاین متوقف میشه و تو میفهمی که یه جای کار میلنگه.
اجرای تستها هم مثل نصب وابستگیها، با دستورات مربوط به فریمورک تستینگت انجام میشه. مثلاً برای پایتون `pytest`، برای جاوا `junit` با `maven` یا `gradle`، و برای جاوااسکریپت `jest` یا `mocha`. گیتهاب اکشنز نتایج این تستها رو بهت نشون میده و حتی میتونه گزارشهای دقیقتری هم ارائه بده.

مرحله سوم: گیت Pull Request (PR Gate): نگهبان کیفیت
این مرحله، همون نگهبان سختگیره که گفتیم. PR Gate مطمئن میشه که هیچ کدی که باعث شکست پایپلاین شده یا تستهاش پاس نشده، وارد شاخه اصلی (مثلاً `main` یا `master`) نشه. این یعنی دیگه لازم نیست نگران باشی که کد یه همکار، کل پروژه رو زیر سوال ببره. تا وقتی که همه تستها سبز نشن، PR مرج نمیشه.
تو گیتهاب، میتونی Branch Protection Rules تعریف کنی. این قوانین بهت اجازه میدن که مشخص کنی چه شرایطی باید برای مرج شدن یک PR رعایت بشه. مثلاً "تستهای CI باید با موفقیت تموم بشن" یا "حداقل N نفر باید PR رو تایید کنن". این یه لایه امنیتی خیلی قویه برای پروژهات.
درس مهم: Branch Protection Rules نه تنها کیفیت کد رو بالا میبره، بلکه فرهنگ کدنویسی تیمی رو هم بهبود میبخشه. همه میدونن که برای مرج کردن کد، باید مسئولیتپذیر باشن و از کیفیت کارشون مطمئن باشن.
مثال عملی با GitHub Actions: راهنمای قدم به قدم:
حالا که با مفاهیم آشنا شدی، بیا یه نمونه workflow ساده برای گیتهاب اکشنز بنویسیم. فرض کن یه پروژه پایتون داریم که از `pytest` برای تستهاش استفاده میکنه. تو ریشه پروژهات، یه پوشه به اسم `.github/workflows` بساز و توش یه فایل `ci.yml` ایجاد کن.
محتوای فایل `ci.yml` میتونه چیزی شبیه به این باشه:
```yaml name: Python CI Pipeline on: [pull_request, push] jobs: build-and-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Run tests run: | pip install pytest pytest ```
این فایل به گیتهاب میگه هر وقت یه Pull Request باز شد یا کدی به شاخههای اصلی `push` شد، این مراحل رو اجرا کنه. اول کد رو checkout میکنه، بعد پایتون رو نصب میکنه، بعد وابستگیها رو از `requirements.txt` نصب میکنه و در نهایت `pytest` رو اجرا میکنه. برای جزئیات بیشتر در مورد گیتهاب اکشنز، میتونی به مستندات رسمی گیتهاب مراجعه کنی.
پایپلاین CI دقیقاً چی کار میکنه؟
پایپلاین CI مجموعهای از مراحل خودکاره که بعد از هر تغییر کد اجرا میشه تا مطمئن بشه کدهای جدید با کدهای موجود سازگارن و مشکلی ایجاد نمیکنن. این شامل نصب وابستگیها، اجرای تستها و گیتبندی PRها میشه.
چرا باید از PR Gate استفاده کنم؟
PR Gate اجازه نمیده کدی که تستهاش پاس نشده یا کیفیت لازم رو نداره، مرج بشه. این کار کیفیت کلی کدبیس رو بالا میبره و از ورود باگها به شاخه اصلی جلوگیری میکنه.
آیا گیتهاب اکشنز تنها ابزار برای CI هست؟
نه، گیتهاب اکشنز یکی از محبوبترینهاست، اما ابزارهای دیگه مثل GitLab CI/CD، Jenkins، CircleCI و Travis CI هم وجود دارن که هر کدوم ویژگیهای خاص خودشون رو دارن.
هنوز نظری ثبت نشده. اولین نفر باشید.