گردو
راهنمای Monorepo

چطور Monorepo را روی سکوی ابری گردو دیپلوی کنیم؟

آموزش استقرار چند سرویس از یک مخزن کد در گردو؛ از تنظیم پوشهٔ ریشه و مسیر Dockerfile تا زمینهٔ ساخت، مسیرهای تحت نظر و انتشار با CLI.

پاسخ کوتاه

در گردو برای هر برنامه داخل Monorepo—مثلاً apps/web، apps/api و یک پردازشگر—یک سرویس جدا روی سکوی ابری (PaaS) گردو بسازید. همه سرویس‌ها می‌توانند به یک مخزن و شاخه وصل باشند؛ «پوشهٔ ریشه» محل تشخیص و ساخت هر سرویس را تعیین می‌کند و «مسیرهای تحت نظر» جلوی انتشار بی‌دلیل سرویس‌های دیگر را می‌گیرد.

آخرین بازبینی: ۱۴۰۵/۰۶/۱۵

مدل Monorepo در گردو

یک مخزن می‌تواند چند سرویس گردو داشته باشد. هر سرویس «دستور ساخت»، «دستور اجرا»، متغیرها، دامنه، تعداد نمونه و نسخه‌های انتشار مستقل دارد، اما می‌تواند در همان پروژه و محیط کنار بقیه سرویس‌ها قرار بگیرد.

repo/
├── apps/
│   ├── web/       # سرویس وب
│   └── api/       # سرویس API
├── packages/
│   └── shared/    # بسته مشترک
├── package.json
└── pnpm-lock.yaml

سه فیلد ساخت را درست تنظیم کنید

  • پوشهٔ ریشه: مسیر پوشه سرویس نسبت به ریشه مخزن؛ برای API مقدار apps/api. تشخیص «استک» و اجرای «دستور ساخت» و «دستور اجرا» از این پوشه انجام می‌شود.
  • مسیر Dockerfile: مسیر فایل نسبت به ریشه مخزن؛ مثلاً apps/api/Dockerfile. Dockerfile صریح همیشه بر تشخیص خودکار اولویت دارد.
  • زمینهٔ ساخت: فقط برای Dockerfile؛ مقدار . اجازه می‌دهد lockfile و بسته‌های مشترک ریشه با COPY در دسترس باشند. اگر خالی باشد، برابر «پوشهٔ ریشه» است.

روش پیشنهادی برای فضای کاری دارای بسته مشترک

اگر برنامه برای ساخت به lockfile یا بسته‌های بیرون از پوشه خودش نیاز دارد، Dockerfile را در پوشه برنامه نگه دارید ولی «زمینهٔ ساخت» را ریشه مخزن قرار دهید.

# فیلدهای «پیکربندی ساخت» در پنل گردو
پوشهٔ ریشه:       apps/api
مسیر Dockerfile:  apps/api/Dockerfile
زمینهٔ ساخت:       .
مسیرهای تحت نظر:
  apps/api/**
  packages/shared/**
  pnpm-lock.yaml

در Dockerfile، مسیرهای COPY نسبت به «زمینهٔ ساخت» هستند. اگر Dockerfile ندارید، گردو Nixpacks یا سازنده داخلی استک را روی «پوشهٔ ریشه» اجرا می‌کند و «زمینهٔ ساخت» سفارشی را نادیده می‌گیرد؛ بنابراین پروژه‌ای که به فایل‌های ریشه وابسته است معمولاً به Dockerfile با زمینه ریشه نیاز دارد.

مسیرهای تحت نظر و انتشار خودکار

برای سرویس متصل به Git، هر push روی شاخه متصل فقط زمانی آن سرویس را دوباره می‌سازد که یکی از فایل‌های تغییرکرده با «مسیرهای تحت نظر» تطبیق داشته باشد. لیست خالی یعنی هر push یک انتشار ایجاد می‌کند.

  • apps/api همه فایل‌های زیر این مسیر را پوشش می‌دهد.
  • apps/api/** هر عمقی زیر API را پوشش می‌دهد.
  • apps/* فقط یک بخش مسیر را می‌پذیرد و فایل‌های عمیق را پوشش نمی‌دهد.
  • برای lockfile، تنظیمات ریشه و بسته مشترک الگوهای جدا اضافه کنید.
  • اگر GitHub برای یک push بسیار بزرگ فهرست فایل قابل اتکا ندهد، گردو برای جلوگیری از جاافتادن نسخه، سرویس را دوباره می‌سازد.

تنظیم و deploy با Gerdoo CLI

برای source محلی، CLI کل repository داده‌شده را بسته‌بندی می‌کند و تشخیص را روی --root-dir انجام می‌دهد:

cd repo
gerdoo deploy . \
  --name api \
  --root-dir apps/api \
  --dockerfile apps/api/Dockerfile \
  --build-context . \
  --port 8080

برای یک سرویس Git موجود، تنظیمات Monorepo و watch path را می‌توانید به‌روزرسانی کنید:

gerdoo service update api \
  --root-dir apps/api \
  --dockerfile apps/api/Dockerfile \
  --build-context . \
  --watch-path 'apps/api/**' \
  --watch-path 'packages/shared/**' \
  --watch-path pnpm-lock.yaml

چک‌لیست انتشار

  1. برای هر سرویس «پوشهٔ ریشه» و مسیر بررسی سلامت مستقل تعریف کنید.
  2. بسته‌های مشترک و lockfile را به «مسیرهای تحت نظر» تمام مصرف‌کنندگان اضافه کنید.
  3. متغیرهای مشترک را در سطح پروژه یا محیط و مقادیر محرمانه خاص را روی سرویس قرار دهید.
  4. فقط web را تغییر دهید و تأیید کنید API بی‌دلیل دوباره ساخته نمی‌شود.
  5. بسته مشترک را تغییر دهید و تأیید کنید همه مصرف‌کنندگان منتشر می‌شوند.
  6. لاگ ساخت را بررسی کنید تا سازنده، Dockerfile و زمینه مورد انتظار انتخاب شده باشند.
  7. هر سرویس را جداگانه به نسخه قبل برگردانید و ارتباط داخلی سرویس‌ها را آزمایش کنید.

سوالات پرتکرار

برای هر برنامه در Monorepo باید یک سرویس بسازم؟

بله. در گردو هر برنامه وب، API، پردازشگر یا کار زمان‌بندی‌شده یک سرویس است. هر سرویس را به همان مخزن و شاخه، اما با «پوشهٔ ریشه» و «مسیرهای تحت نظر» مناسب متصل کنید.

«پوشهٔ ریشه» و «زمینهٔ ساخت» چه تفاوتی دارند؟

«پوشهٔ ریشه» پوشه خود سرویس و مبنای تشخیص استک و اجرای دستورهای ساخت است. «زمینهٔ ساخت» فقط هنگام ساخت با Dockerfile استفاده می‌شود و مشخص می‌کند COPY به کدام بخش مخزن دسترسی دارد.

«مسیر Dockerfile» نسبت به کدام پوشه است؟

این مقدار نسبت به ریشه مخزن است، نه «پوشهٔ ریشه» یا «زمینهٔ ساخت». برای نمونه apps/api/Dockerfile.

«مسیرهای تحت نظر» چه الگوهایی را پشتیبانی می‌کند؟

مسیر ساده مانند apps/api به‌صورت پیشوند عمل می‌کند. * داخل یک بخش مسیر، ** میان چند پوشه و ? برای یک نویسه است. برای بسته مشترک، packages/** را هم اضافه کنید.