مستندات Infynexراهنماهای پلتفرم، DevOps و انتشار
مستندات / زیرساخت / زیرساخت DevOps و CI/CD
زیرساخت

زیرساخت DevOps و CI/CD

معماری CI/CD، سرویس‌ها، رانرها، کش‌ها و ملاحظات air-gap.

زیرساخت DevOps و ساختار CI/CD

این سند اجزای زیرساخت توسعه و ساخت پلتفرم ابر اینفینکس (Infynex)، نقش هر سرویس و مسیر عبور کد از مخزن تا ایمیج و چارت نهایی را توضیح می‌دهد.

نمای کلی

پلتفرم روی زیرساخت داخلی و خصوصی توسعه داده و اجرا می‌شود و در محیط air-gap قرار دارد. به همین دلیل همهٔ وابستگی‌های ساخت (ایمیج‌ها، ماژول‌های Go، ابزارها و فایل‌های خام) باید از سرویس‌های داخلی تأمین شوند. مدیریت کد و ورک‌فلوها روی Gitea انجام می‌شود و ورک‌فلوها برای این محیط به‌روزرسانی و سفارشی‌سازی شده‌اند.

Giteaکد، ورک‌فلو، رجیستری اصلی
Runnerها۳ رانر روی هر سرور (ایران و آلمان)
کش‌هاکش رانر، zot، پراکسی Go، Nexus
خروجیایمیج‌ها در infynex، چارت‌ها در charts

نمودار ارتباط اجزا

نمودار زیر مسیر کار را نشان می‌دهد: توسعه‌دهنده کد را در Gitea ثبت می‌کند، رانرهای هر سرور job را اجرا می‌کنند، وابستگی‌ها از سرویس‌های داخلی گرفته می‌شوند و خروجی نهایی در رجیستری Gitea منتشر می‌شود.

نمودار ارتباط اجزای زیرساخت CI/CD توسعه‌دهنده به Gitea push می‌کند. Gitea job را به رانرهای سرور ایران و آلمان می‌دهد. رانرها از کش محلی، Athens، Nexus و zot استفاده می‌کنند و ایمیج و چارت نهایی را به رجیستری Gitea منتشر می‌کنند. توسعه‌دهنده git push / PR Gitea git.infynex.ir کد، ورک‌فلو، رجیستری OCI رجیستری نهایی infynex/ (images) charts/ (helm) ثبت کد انتشار اجرای job اجرای job سرور رانر — ایران رانر ۱ رانر ۲ رانر ۳ کش سرور Gitea (مشترک بین ۳ رانر) سرور رانر — آلمان رانر ۱ رانر ۲ رانر ۳ کش سرور Gitea (مشترک بین ۳ رانر) دریافت وابستگی و کش بیلد Athens go-proxy.infynex.ir کش ماژول‌های Go Nexus pkgs.infynex.ir raw و toolchain Go zot oci-ir.infynex.ir ایمیج موقت و کش buildx

فلش‌ها جهت درخواست را نشان می‌دهند. رانرها خودشان ایمیج و چارت نهایی را به Gitea push می‌کنند؛ در نمودار برای سادگی این مسیر با فلش «انتشار» از Gitea به رجیستری نشان داده شده است.

سرویس‌ها و آدرس‌ها

سرویسآدرسنقش
Giteagit.infynex.irمخزن کد، ورک‌فلوها، رجیستری OCI برای ایمیج‌ها و چارت‌ها
سازمان infynexgit.infynex.ir/infynexایمیج‌های اصلی و پروداکشن
سازمان chartsgit.infynex.ir/chartsHelm chartهای پروژه
zotoci-ir.infynex.irایمیج‌های موقت و کش بیلد (buildx) مربوط به CI/CD
Athensgo-proxy.infynex.irپراکسی و کش پکیج‌های Go
Nexuspkgs.infynex.irمخزن raw و مخزن hosted برای toolchainهای Go
مخزن ابزار DevOpsgit.infynex.ir/devops/devopsاسکریپت دانلود و آپلود toolchainها

Gitea و مخزن‌های OCI

Gitea با Docker container اجرا می‌شود. مخزن‌های اصلی پروژه روی آن نگهداری می‌شوند و قابلیت رجیستری پکیج/OCI آن برای ایمیج‌های Docker و سایر آرتیفکت‌های OCI فعال است.

سازمانمحتواقاعدهٔ استفاده
infynexایمیج‌های نهاییفقط خروجی‌های اصلی و پروداکشن؛ ایمیج موقت اینجا push نمی‌شود.
chartsHelm chartچارت‌های پکیج‌شدهٔ پروژه به‌صورت آرتیفکت OCI.
docker login git.infynex.ir
docker pull git.infynex.ir/infynex/<image>:<tag>
helm pull oci://git.infynex.ir/charts/<chart> --version <version>

رانرها و کش

دو سرور برای رانرها در نظر گرفته شده است: یکی در ایران و یکی در آلمان. روی هر سرور سه رانر به‌صورت Docker container اجرا می‌شوند و از Docker socket میزبان استفاده می‌کنند.

هر سرور رانر
  • ۳ کانتینر رانر (با دسترسی به Docker socket میزبان)
  • ۱ کانتینر Gitea cache server مخصوص همان سرور؛ هر ۳ رانر از آن استفاده می‌کنند.
نکتهٔ امنیتی: دسترسی به Docker socket میزبان معادل دسترسی root روی آن سرور است. فقط ورک‌فلوهای مخزن‌های مورد اعتماد باید روی این رانرها اجرا شوند.

کش اختصاصی هر سرور باعث می‌شود کش actionها و وابستگی‌ها از شبکهٔ همان سرور خوانده شود و ترافیک بین ایران و آلمان کم بماند.

مخزن موقت و کش بیلد (zot)

سرویس zot در oci-ir.infynex.ir یک رجیستری OCI جدا از Gitea است. ایمیج‌های موقت و کش لایه‌های buildx که در فرایند ورک‌فلوها تولید می‌شوند اینجا ذخیره می‌شوند تا رجیستری اصلی با آرتیفکت‌های گذرا پر نشود.

docker buildx build \
  --cache-from type=registry,ref=oci-ir.infynex.ir/cache/<image>:buildcache \
  --cache-to   type=registry,ref=oci-ir.infynex.ir/cache/<image>:buildcache,mode=max \
  -t git.infynex.ir/infynex/<image>:<tag> --push .

نام مسیرها (مثل cache/) نمونه است؛ مسیر واقعی را مطابق قرارداد تیم قرار دهید.

پراکسی و ابزارهای Go

پراکسی ماژول (Athens)

Athens در go-proxy.infynex.ir ماژول‌های Go را کش می‌کند. در بیلدها GOPROXY روی همین آدرس تنظیم می‌شود.

export GOPROXY=https://go-proxy.infynex.ir
export GONOSUMDB=*   # یا مطابق سیاست sumdb داخلی
go mod download

Toolchainهای Go

نسخه‌های toolchain در تنظیمات Go از آدرس داخلی دانلود می‌شوند و فایل‌های آن‌ها در مخزن hosted روی Nexus نگهداری می‌شود. اسکریپتی در git.infynex.ir/devops/devops دانلود و آپلود آن‌ها را انجام می‌دهد؛ هنگام نیاز به نسخهٔ جدید Go، ابتدا آن را با این اسکریپت در مخزن بارگذاری کنید و سپس بیلد را اجرا کنید.

Nexus (pkgs.infynex.ir)

مخزننوعکاربرد
rawrawفایل‌هایی که هنگام ساخت ایمیج مستقیم لازم‌اند، به‌ویژه وقتی دانلود از اینترنت ممکن نیست یا لینک اصلی از بین رفته است.
Go (hosted)hostedنگهداری toolchainهای Go.

در Dockerfileها به‌جای لینک خارجی از لینک داخلی Nexus استفاده کنید:

ARG TOOL_VERSION=1.2.3
RUN curl -fsSL https://pkgs.infynex.ir/repository/raw/tools/tool-${TOOL_VERSION}.tar.gz \
    | tar -xz -C /usr/local/bin

جریان CI/CD

۱. Push / PRرویداد در Gitea ثبت می‌شود.
۲. اجرای ورک‌فلویکی از رانرها job را برمی‌دارد.
۳. وابستگی‌هاGo از Athens، فایل‌ها از Nexus، کش از cache server.
۴. بیلدbuildx با کش در zot.
۵. انتشارایمیج به infynex و چارت به charts.

ورک‌فلوها در قالب Gitea Actions نوشته می‌شوند و برای محیط داخلی تغییر داده شده‌اند: actionها و آدرس‌ها به نسخه‌های داخلی اشاره می‌کنند و هیچ مرحله‌ای نباید به سرویس‌های اینترنتی وابسته باشد.

ملاحظات محیط air-gap

  • هر ایمیج پایه، action، ماژول Go و فایل خارجی باید قبل از استفاده به یکی از سرویس‌های داخلی منتقل شود.
  • آدرس‌های اینترنتی در Dockerfile، اسکریپت و ورک‌فلو باید با معادل داخلی جایگزین شوند.
  • لینک‌های ناپایدار خارجی را در Nexus (raw) نگهداری کنید تا بیلدها تکرارپذیر بمانند.
  • نسخه‌ها را pin کنید تا بیلد به محتوای در حال تغییر وابسته نباشد.

عیب‌یابی و نگهداری

بیلد کند شده یا کش استفاده نمی‌شود

دسترسی رانر به oci-ir.infynex.ir و سالم‌بودن کانتینر cache server همان سرور را بررسی کنید.

دانلود ماژول Go شکست می‌خورد

مقدار GOPROXY را بررسی کنید و از در دسترس‌بودن go-proxy.infynex.ir مطمئن شوید.

نسخهٔ جدید Go پیدا نمی‌شود

اسکریپت مخزن devops/devops را برای دانلود و آپلود toolchain اجرا کنید.

فایل خارجی دیگر در دسترس نیست

فایل را در مخزن raw روی Nexus بارگذاری و لینک داخلی را جایگزین کنید.

استفاده محلی از این صفحه

این صفحه یک فایل HTML مستقل است و بدون سرور باز می‌شود. برای نمایش فونت در محیط بدون اینترنت:

  1. فایل‌های woff2 فونت وزیرمتن را در پوشهٔ fonts/ کنار فایل قرار دهید.
  2. بلوک @font-face کامنت‌شدهٔ ابتدای استایل را فعال کنید و تگ link گوگل‌فونت را حذف کنید.

در صورت نبود فونت، صفحه به Tahoma و فونت‌های سیستمی برمی‌گردد.

مستندات زیرساخت اینفینکس — بخش DevOps