11 KiB
11 KiB
مدیریت Package های Proto در FourSat با GitLab Registry
تاریخ: December 6, 2025
NuGet Server: GitLab Package Registry (Afrino)
URL:https://git.afrino.co/api/packages/FourSat/nuget/index.json
📊 معماری فعلی
┌────────────────────────────────────────────────────┐
│ LAYER 1: CMS Proto (Base) │
│ CMSMicroservice.Protobuf │
│ Version: 0.0.142 → Auto-push به GitLab │
└─────────────────┬──────────────────────────────────┘
│ PackageReference
▼
┌────────────────────────────────────────────────────┐
│ LAYER 2: BFF Protos │
│ BackOffice.BFF.*.Protobuf (14 packages) │
│ FrontOffice.BFF.*.Protobuf (8 packages) │
│ → Depend on: CMS Proto v0.0.x │
└─────────────────┬──────────────────────────────────┘
│ PackageReference
▼
┌────────────────────────────────────────────────────┐
│ LAYER 3: UI Applications │
│ BackOffice UI → BackOffice.BFF Protos │
│ FrontOffice UI → FrontOffice.BFF Protos │
└────────────────────────────────────────────────────┘
🔧 تنظیمات فعلی در csproj
شما از قبل این Target را دارید:
<Target Name="PushToFoursatNuget" AfterTargets="Pack">
<PropertyGroup>
<NugetPackagePath>$(PackageOutputPath)$(PackageId).$(Version).nupkg</NugetPackagePath>
<PushCommand>dotnet nuget push **/*.nupkg --source https://git.afrino.co/api/packages/FourSat/nuget/index.json --api-key 061a5cb15517c6da39c16cfce8556c55ae104d0d --skip-duplicate && del "$(NugetPackagePath)"</PushCommand>
</PropertyGroup>
<Exec Command="$(PushCommand)" />
</Target>
✅ مزیت: خودکار push میشه
⚠️ نیاز: فقط Version افزایش پیدا کنه
🚀 Workflow پیشنهادی
حالت 1️⃣: Development (Local)
<!-- Debug Mode: استفاده از ProjectReference -->
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<ProjectReference Include="..\..\..\CMS\src\CMSMicroservice.Protobuf\CMSMicroservice.Protobuf.csproj" />
</ItemGroup>
مزایا:
- تغییرات بلافاصله اعمال میشود
- نیازی به build/pack/push نیست
- سرعت توسعه بالا
حالت 2️⃣: Production (Release)
<!-- Release Mode: استفاده از PackageReference -->
<ItemGroup Condition="'$(Configuration)' == 'Release'">
<PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.142" />
</ItemGroup>
<!-- Auto-Push Target -->
<Target Name="PushToFoursatNuget" AfterTargets="Pack" Condition="'$(Configuration)' == 'Release'">
<!-- ... همان کدی که دارید -->
</Target>
مزایا:
- استقلال پروژهها
- Version control دقیق
- امکان Rollback
📝 مثال کامل csproj
CMSMicroservice.Protobuf.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- Package Info -->
<PackageId>Foursat.CMSMicroservice.Protobuf</PackageId>
<Version>0.0.142</Version> <!-- 👈 این خط را با script تغییر میدهیم -->
<Authors>FourSat Team</Authors>
<Company>Afrino</Company>
<Description>gRPC Protobuf contracts for CMS Microservice</Description>
<RepositoryUrl>https://git.afrino.co/FourSat/cms</RepositoryUrl>
</PropertyGroup>
<!-- Dependencies -->
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.23.3" />
<PackageReference Include="Grpc.Core.Api" Version="2.54.0" />
<PackageReference Include="Grpc.Tools" Version="2.55.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<!-- Proto Files -->
<ItemGroup>
<Protobuf Include="Protos\*.proto" ProtoRoot="Protos\" GrpcServices="Both" />
</ItemGroup>
<!-- Auto-Push به GitLab (فقط در Release mode) -->
<Target Name="PushToFoursatNuget" AfterTargets="Pack" Condition="'$(Configuration)' == 'Release'">
<PropertyGroup>
<NugetPackagePath>$(PackageOutputPath)$(PackageId).$(Version).nupkg</NugetPackagePath>
<PushCommand>dotnet nuget push "$(NugetPackagePath)" --source https://git.afrino.co/api/packages/FourSat/nuget/index.json --api-key 061a5cb15517c6da39c16cfce8556c55ae104d0d --skip-duplicate</PushCommand>
</PropertyGroup>
<Exec Command="$(PushCommand)" />
<!-- پاک کردن فایل بعد از push موفق -->
<Delete Files="$(NugetPackagePath)" />
</Target>
</Project>
BackOffice.BFF.Products.Protobuf.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<PackageId>Foursat.BackOffice.BFF.Products.Protobuf</PackageId>
<Version>1.0.0</Version> <!-- 👈 این را با script تغییر میدهیم -->
</PropertyGroup>
<!-- gRPC Dependencies -->
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.28.3" />
<PackageReference Include="Grpc.Core.Api" Version="2.70.0" />
<PackageReference Include="Grpc.Tools" Version="2.68.1">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<!-- 🔧 Development: ProjectReference -->
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<ProjectReference Include="..\..\..\CMS\src\CMSMicroservice.Protobuf\CMSMicroservice.Protobuf.csproj" />
</ItemGroup>
<!-- 🚀 Production: PackageReference -->
<ItemGroup Condition="'$(Configuration)' == 'Release'">
<PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.142" />
</ItemGroup>
<!-- Proto Files -->
<ItemGroup>
<Protobuf Include="Protos\products.proto" ProtoRoot="Protos\" GrpcServices="Both" />
</ItemGroup>
<!-- Auto-Push به GitLab -->
<Target Name="PushToFoursatNuget" AfterTargets="Pack" Condition="'$(Configuration)' == 'Release'">
<PropertyGroup>
<NugetPackagePath>$(PackageOutputPath)$(PackageId).$(Version).nupkg</NugetPackagePath>
<PushCommand>dotnet nuget push "$(NugetPackagePath)" --source https://git.afrino.co/api/packages/FourSat/nuget/index.json --api-key 061a5cb15517c6da39c16cfce8556c55ae104d0d --skip-duplicate</PushCommand>
</PropertyGroup>
<Exec Command="$(PushCommand)" />
<Delete Files="$(NugetPackagePath)" />
</Target>
</Project>
🔄 فرآیند Release جدید
مرحله 1: افزایش Version
# افزایش Patch version (0.0.142 → 0.0.143)
./bump-version.sh patch
# افزایش Minor version (0.0.142 → 0.1.0)
./bump-version.sh minor
# افزایش Major version (0.0.142 → 1.0.0)
./bump-version.sh major
# افزایش version یک پروژه خاص
./bump-version.sh patch /path/to/Project.csproj
مرحله 2: Build & Pack (Auto-Push)
# Build & Pack CMS Proto (Layer 1)
cd /home/masoud/Apps/project/FourSat/CMS/src/CMSMicroservice.Protobuf
dotnet pack -c Release
# ✅ بعد از Pack، خودکار push میشه به GitLab!
مرحله 3: Update BFF Dependencies
# بعد از push CMS Proto، version جدید را در BFF ها update کنید:
# BackOffice.BFF.Products.Protobuf.csproj:
<ItemGroup Condition="'$(Configuration)' == 'Release'">
<PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.143" /> <!-- ⬅️ Update -->
</ItemGroup>
مرحله 4: Build & Pack BFF Protos (Layer 2)
# Build & Pack همه BackOffice.BFF Protos
cd /home/masoud/Apps/project/FourSat/BackOffice.BFF/src/Protobufs
for dir in BackOffice.BFF.*.Protobuf; do
cd "$dir"
dotnet pack -c Release # ✅ Auto-push میشه
cd ..
done
مرحله 5: Update UI Dependencies
# BackOffice.csproj:
<ItemGroup Condition="'$(Configuration)' == 'Release'">
<PackageReference Include="Foursat.BackOffice.BFF.Products.Protobuf" Version="1.0.1" /> <!-- ⬅️ Update -->
<!-- ... other protos -->
</ItemGroup>
🛠️ Scripts خودکار
1. bump-version.sh - افزایش Version
# همه Proto projects
./bump-version.sh patch
# یک پروژه خاص
./bump-version.sh minor CMS/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj
2. release-proto.sh - Release کامل
#!/bin/bash
# 1. Bump version
./bump-version.sh patch
# 2. Build & Pack (Auto-push)
cd CMS/src/CMSMicroservice.Protobuf
dotnet pack -c Release
# 3. Commit changes
git add .
git commit -m "chore: bump proto version"
git push
📊 Version Strategy
0.0.142 → Current CMS Proto version
│ │ │
│ │ └── PATCH: Bug fixes, compatible changes
│ └───── MINOR: New features, compatible
└────── MAJOR: Breaking changes
مثال:
- اضافه کردن فیلد جدید → PATCH (0.0.143)
- اضافه کردن RPC جدید → MINOR (0.1.0)
- تغییر signature RPC → MAJOR (1.0.0)
🔍 بررسی Packages روی GitLab
# اضافه کردن GitLab source
dotnet nuget add source https://git.afrino.co/api/packages/FourSat/nuget/index.json \
--name foursat-gitlab \
--username YOUR_USERNAME \
--password 061a5cb15517c6da39c16cfce8556c55ae104d0d \
--store-password-in-clear-text
# جستجو
dotnet nuget search Foursat --source foursat-gitlab
# نصب
dotnet add package Foursat.CMSMicroservice.Protobuf --version 0.0.142 --source foursat-gitlab
⚙️ nuget.config (Optional)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="foursat-gitlab" value="https://git.afrino.co/api/packages/FourSat/nuget/index.json" />
</packageSources>
<packageSourceCredentials>
<foursat-gitlab>
<add key="Username" value="foursat" />
<add key="ClearTextPassword" value="061a5cb15517c6da39c16cfce8556c55ae104d0d" />
</foursat-gitlab>
</packageSourceCredentials>
</configuration>
🎯 خلاصه
✅ Development → Debug build → ProjectReference → سرعت بالا
✅ Production → Release build → PackageReference → استقلال
✅ Auto-Push → بعد از Pack خودکار به GitLab میره
✅ Version Bump → با bump-version.sh خودکار
✅ Rollback → برگشت به version قبلی ساده
تاریخ: December 6, 2025
NuGet Registry: GitLab (Afrino)
Current CMS Version: 0.0.142