SAIF .NET Core Framework — NuGet Pipelines (Mono-repo)¶
Overview¶
Every component under src/ in this repository is packaged and published to NuGet by its own independent Azure DevOps YAML pipeline — moving to a mono-repo did not change the one-pipeline-per-package model. All pipelines live in the Architecture project of the SAIFCorporation organization and are triggered from this single repository (Framework.NCore), scoped so that a change to one component only queues that component's pipeline.
These 19 pipelines are the same production pipeline definitions that previously built from the 19 standalone Framework.NCore.<Component> repositories (same definition IDs, same names, same build history) — they were retargeted in place to this repository rather than recreated, so existing build history/badges/links are preserved. Each standalone repo's pipeline(s) have since been disabled.
All pipelines share a common shape:
- The pipeline YAML lives at
.azdo/{component}/azure-pipelines.ymland pulls in shared templates fromSAIF/yaml_templates_v3via thetemplatesrepository resource: /templates/shared/variables/vars.yml@templates— org-wide variables./templates/app-types/nuget/variables/vars.yml@templates— NuGet-app-type variables./templates/app-types/nuget/stages/build-deploy-standard.yml@templates— the multi-stage build/pack/push logic (restore → build → test →dotnet pack→ push to the NuGet feed)..azdo/{component}/variables/vars.ymlsupplies per-component parameters (appName,appOwner,dotnetType,releaseBranch: main,vstsFeed: saifnuget,feedPublish: SAIFNuget,solutionPath,projectFile) —solutionPath/projectFilenow point intosrc/{component}/...to reflect the mono-repo layout.- CI trigger is scoped per component: batched pushes to
mainundersrc/{component}/**only (trigger.batch: true,branches.include: [main],paths.include: [src/{component}/**]). A change tosrc/SAIF.NetCore.AuthService/**only queues the AuthService pipeline, not the other 18. - The build pool is parameterized via
$(SAIF.BuildPool), which resolves to the Microsoft-hostedAzure Pipelinespool. - Package version numbers follow
<MajorVersion>.<Year>.<DayOfYear>.<rev>(e.g.8.2026.26266.1).
Current pipeline definitions¶
Component (src/...) |
Pipeline name (definition ID) | Published package | YAML path | Trigger / pool |
|---|---|---|---|---|
| SAIF.NetCore.AuthService | Framework.NCore.AuthService.nuget.Build.Release (5212) |
SAIF.NetCore.AuthService | .azdo/SAIF.NetCore.AuthService/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.AuthService/**), pool Azure Pipelines |
| SAIF.NetCore.Common | Framework.NCore.Common.Build.Release (5213) |
SAIF.NetCore.Common | .azdo/SAIF.NetCore.Common/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.Common/**), pool Azure Pipelines |
| SAIF.NetCore.DbConnectionClient | Framework.NCore.DBConnectionClient.Build.Release (5214) |
SAIF.NetCore.DbConnectionClient | .azdo/SAIF.NetCore.DbConnectionClient/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.DbConnectionClient/**), pool Azure Pipelines |
| SAIF.NetCore.EnvironmentClient | Framework.NCore.EnvironmentClient.Build.Release (5215) |
SAIF.NetCore.EnvironmentClient | .azdo/SAIF.NetCore.EnvironmentClient/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.EnvironmentClient/**), pool Azure Pipelines |
| SAIF.NetCore.ErrorHandler | Framework.NCore.ErrorHandler.Build.Release (5216) |
SAIF.NetCore.ErrorHandler | .azdo/SAIF.NetCore.ErrorHandler/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.ErrorHandler/**), pool Azure Pipelines |
| SAIF.NetCore.HashUtil | Framework.NCore.HashUtil.Build.Release (5217) |
SAIF.NetCore.HashUtil | .azdo/SAIF.NetCore.HashUtil/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.HashUtil/**), pool Azure Pipelines |
| SAIF.NetCore.HttpClients | Framework.NCore.HttpClients.Build.Release (5218) |
SAIF.NetCore.HttpClients | .azdo/SAIF.NetCore.HttpClients/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.HttpClients/**), pool Azure Pipelines |
| SAIF.NetCore.LegacyAuth | Framework.NCore.LegacyAuth.Build.Release (5219) |
SAIF.NetCore.LegacyAuth | .azdo/SAIF.NetCore.LegacyAuth/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.LegacyAuth/**), pool Azure Pipelines |
| Messaging | SAIF.NetCore.Services.Messaging.Build.Release (5220) |
SAIF.NetCore.Services.Messaging | .azdo/Messaging/azure-pipelines.yml |
CI on main (src/Messaging/**), pool Azure Pipelines |
| SAIF.NetCore.Nhibernate | Framework.NCore.NHibernate.Build.Release (5221) |
SAIF.NetCore.Nhibernate | .azdo/SAIF.NetCore.Nhibernate/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.Nhibernate/**), pool Azure Pipelines |
| SAIF.NetCore.NtlmApiAuth | Framework.NCore.NtlmApiAuth.Build.Release (5222) |
SAIF.NetCore.NtlmApiAuth | .azdo/SAIF.NetCore.NtlmApiAuth/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.NtlmApiAuth/**), pool Azure Pipelines |
| SAIF.NetCore.OIDC | Framework.NCore.OIDC.Build.Release (5223) |
SAIF.NetCore.OIDC | .azdo/SAIF.NetCore.OIDC/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.OIDC/**), pool Azure Pipelines |
| SAIF.NetCore.PingableService | Framework.NCore.PingableService.nuget.Build.Release (5224) |
SAIF.NetCore.PingableService | .azdo/SAIF.NetCore.PingableService/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.PingableService/**), pool Azure Pipelines |
| SAIF.NetCore.Logging | Framework.NCore.SaifLog.Build.Release (5225) |
SAIF.NetCore.Logging | .azdo/SAIF.NetCore.Logging/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.Logging/**), pool Azure Pipelines |
| SAIF.NetCore.ServiceContracts | SAIF.NetCore.ServiceContracts.Build.Release (5226) |
SAIF.NetCore.ServiceContracts | .azdo/SAIF.NetCore.ServiceContracts/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.ServiceContracts/**), pool Azure Pipelines |
| SAIF.NetCore.ServiceExtensions | Framework.NCore.ServiceExtensions.Build.Release (5227) |
SAIF.NetCore.ServiceExtensions | .azdo/SAIF.NetCore.ServiceExtensions/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.ServiceExtensions/**), pool Azure Pipelines |
| SAIF.NetCore.SystemHash | Framework.NCore.SystemHash.Build.Release (5229) |
SAIF.NetCore.SystemHash | .azdo/SAIF.NetCore.SystemHash/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.SystemHash/**), pool Azure Pipelines |
| SAIF.NetCore.Clients.UC4 | Framework.NCore.UC4Client.Build.Release (5230) |
SAIF.NetCore.Clients.UC4 | .azdo/SAIF.NetCore.Clients.UC4/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.Clients.UC4/**), pool Azure Pipelines |
| SAIF.NetCore.WindowsService | Framework.NCore.WindowsService.nuget.Build.Release (5231) |
SAIF.NetCore.WindowsService | .azdo/SAIF.NetCore.WindowsService/azure-pipelines.yml |
CI on main (src/SAIF.NetCore.WindowsService/**), pool Azure Pipelines |
All 19 pipelines above are enabled, live at path \ (root) in the Architecture project's pipeline list, point their repository at this repo (Framework.NCore, default branch refs/heads/main), and were verified with a green build against main in this repository as part of the mono-repo migration.
Migration to the mono-repo¶
- All source and
.azdo/{component}pipeline configuration were copied from the 19 standaloneFramework.NCore.<Component>repositories into this repository undersrc/{component}and.azdo/{component}respectively. - Each pipeline YAML's trigger path filter was narrowed from the previous repo-wide
src/**to a component-scopedsrc/{component}/**, and themasterbranch references were updated tomain. - Each existing pipeline definition (same ID, same name, same build history) was retargeted via the Azure DevOps REST API to point its
repositoryatFramework.NCore(refs/heads/main) instead of its old standalone repo — this preserves build history/links rather than creating new pipelines. - Every retargeted pipeline was verified with a successful build against this repository's
mainbranch. - The old standalone repos' pipelines were disabled (including one,
SAIF.NetCore.Services.Messaging(1781), that had been missed by the earlier classic-pipeline retirement and was still enabled — it has now been disabled and moved to\Retiredas well). The standalone repositories themselves are left in place, but are no longer built.
Branch protection on main¶
- Minimum reviewers: 1 (blocking) — every PR into
mainrequires at least one approval. - Optional auto-reviewers (non-blocking, automatically added for awareness/visibility):
Technology Architect,Technology Architecture Mgr,Site Reliability Engineer II. (Site Reliability Engineer III/IVgroups do not currently exist in Azure DevOps for this org and were not added — create them and add as reviewers if/when they exist.)
How to inspect a pipeline yourself¶
# Get a pipeline definition (includes repository, triggers, queue/pool)
az devops invoke --area build --resource Definitions --route-parameters project=Architecture definitionId=<id> --http-method GET --api-version 7.1
# List builds / get status for a definition
az pipelines build list --definition <id> --project Architecture
az pipelines build show --id <buildId> --project Architecture