زیرساخت DevOps و ساختار CI/CD
این سند اجزای زیرساخت توسعه و ساخت پلتفرم ابر اینفینکس (Infynex)، نقش هر سرویس و مسیر عبور کد از مخزن تا ایمیج و چارت نهایی را توضیح میدهد.
نمای کلی
پلتفرم روی زیرساخت داخلی و خصوصی توسعه داده و اجرا میشود و در محیط air-gap قرار دارد. به همین دلیل همهٔ وابستگیهای ساخت (ایمیجها، ماژولهای Go، ابزارها و فایلهای خام) باید از سرویسهای داخلی تأمین شوند. مدیریت کد و ورکفلوها روی Gitea انجام میشود و ورکفلوها برای این محیط بهروزرسانی و سفارشیسازی شدهاند.
نمودار ارتباط اجزا
نمودار زیر مسیر کار را نشان میدهد: توسعهدهنده کد را در Gitea ثبت میکند، رانرهای هر سرور job را اجرا میکنند، وابستگیها از سرویسهای داخلی گرفته میشوند و خروجی نهایی در رجیستری Gitea منتشر میشود.
فلشها جهت درخواست را نشان میدهند. رانرها خودشان ایمیج و چارت نهایی را به Gitea push میکنند؛ در نمودار برای سادگی این مسیر با فلش «انتشار» از Gitea به رجیستری نشان داده شده است.
سرویسها و آدرسها
| سرویس | آدرس | نقش |
|---|---|---|
| Gitea | git.infynex.ir | مخزن کد، ورکفلوها، رجیستری OCI برای ایمیجها و چارتها |
| سازمان infynex | git.infynex.ir/infynex | ایمیجهای اصلی و پروداکشن |
| سازمان charts | git.infynex.ir/charts | Helm chartهای پروژه |
| zot | oci-ir.infynex.ir | ایمیجهای موقت و کش بیلد (buildx) مربوط به CI/CD |
| Athens | go-proxy.infynex.ir | پراکسی و کش پکیجهای Go |
| Nexus | pkgs.infynex.ir | مخزن raw و مخزن hosted برای toolchainهای Go |
| مخزن ابزار DevOps | git.infynex.ir/devops/devops | اسکریپت دانلود و آپلود toolchainها |
Gitea و مخزنهای OCI
Gitea با Docker container اجرا میشود. مخزنهای اصلی پروژه روی آن نگهداری میشوند و قابلیت رجیستری پکیج/OCI آن برای ایمیجهای Docker و سایر آرتیفکتهای OCI فعال است.
| سازمان | محتوا | قاعدهٔ استفاده |
|---|---|---|
infynex | ایمیجهای نهایی | فقط خروجیهای اصلی و پروداکشن؛ ایمیج موقت اینجا push نمیشود. |
charts | Helm 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 مخصوص همان سرور؛ هر ۳ رانر از آن استفاده میکنند.
کش اختصاصی هر سرور باعث میشود کش 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)
| مخزن | نوع | کاربرد |
|---|---|---|
| raw | raw | فایلهایی که هنگام ساخت ایمیج مستقیم لازماند، بهویژه وقتی دانلود از اینترنت ممکن نیست یا لینک اصلی از بین رفته است. |
| 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
ورکفلوها در قالب 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 مستقل است و بدون سرور باز میشود. برای نمایش فونت در محیط بدون اینترنت:
- فایلهای woff2 فونت وزیرمتن را در پوشهٔ
fonts/کنار فایل قرار دهید. - بلوک
@font-faceکامنتشدهٔ ابتدای استایل را فعال کنید و تگlinkگوگلفونت را حذف کنید.
در صورت نبود فونت، صفحه به Tahoma و فونتهای سیستمی برمیگردد.