.NET MAUI 如何用 pushPackages:false 对 NuGet 发布流水线做 dry-run 验证【免费下载链接】maui.NET MAUI is the .NET Multi-platform App UI, a framework for building native device applications spanning mobile, tablet, and desktop.项目地址: https://gitcode.com/GitHub_Trending/ma/maui在把 .NET MAUI或相关 dotnet 仓库的 NuGet 包正式推送到 NuGet.org 之前release owner 需要先确认BAR 构建解析 → 包收集 → 过滤 → 身份校验 → 审计工件这一整条链路是正确的而不希望真的推出去任何包。.NET MAUI 的唯一发布流水线 eng/pipelines/ci-official-release.yml 提供了pushPackages参数其 displayName 为If false, prepare a dry-run artifact without publishing设为false时流水线只收集和发布发布工件不做 workload 构建提升、不执行审批、也不请求生产 NuGet 服务连接。下面按实际操作顺序说明如何配置并核对这次 dry-run。前提该流水线在内部 Azure DevOps 的dnceng/internal项目中手动运行构建与发布环境是内部镜像https://dev.azure.com/dnceng/internal/_git/dotnet-maui公共 GitHub 仓库仍是开发源镜像与已发布源码保持一致因此 dry-run 需要在内部项目环境中执行。适用流水线与前置条件流水线eng/pipelines/ci-official-release.yml是唯一的 release 流水线手动触发无 trigger/PR 触发。BAR 构建已注册待发布的 commit 必须已经过内部azure-pipelines-internal.yml完成构建、签名、打包并把产物注册到 Maestro 的 Build Asset RegistryBAR。BAR 记录与源 commit 共同标识本次发布使用的不可变资产。dry-run 传入的commitHash就是这个 commit。仓库白名单prepare 阶段只接受dotnet/maui、dotnet/android、dotnet/macios、dotnet/android-libraries传入其他仓库会直接抛出Repository … is not enabled for this release pipeline.。workload 推断ghOwner为dotnet且ghRepo是android、macios、maui之一时走 workload 路径pack 与 manifest 分开审批和发布其余允许的仓库如android-libraries走普通 NuGet 包路径。配置 dry-run 参数参数及其默认值以 ci-official-release.yml 的parameters段为准参数类型默认值dry-run 建议值用途说明来自文档/YAMLghOwnerstringdotnetdotnet用于解析 BAR 构建的 GitHub ownerghRepostringmaui目标仓库名与ghOwner组合确定 workload/非 workload 路径commitHashstringskipBAR 构建的完整 commit SHAskip会阻止一切准备、审批、workload-channel 与 NuGet 发布 jobpushWorkloadSetbooleantruefalse是否把 BAR 构建加入 workload 发布 channelpushNugetOrgbooleantruetrue启用 NuGet.org 发布阶段pushPackagesbooleantruefalsefalse时只准备 dry-run 工件不发布nugetIncludeFiltersstringskip可选分号分隔的包文件名通配过滤nugetExcludeFiltersstringskip可选分号分隔的排除过滤docs/ReleaseProcess.md 给出的官方 dry-run 示例输入非 workload 路径ghOwner: dotnet ghRepo: android-libraries commitHash: FULL_COMMIT_SHA pushWorkloadSet: false pushNugetOrg: true pushPackages: false其中FULL_COMMIT_SHA是文档中的占位符替换为你要验证的那个 BAR 构建的完整 commit SHA。两点参数语义需要注意commitHash: skip时流水线只会运行skip_release阶段输出一行 No release operations were requested.不执行任何 gather 或发布。要验证真实发布 commit 的 dry-run必须传实际 SHA。流水线还有一个短路条件pushNugetOrg: false且非 workload或 workload 仓库同时pushWorkloadSet: false时同样直接进入skip_release。所以示例里保留pushNugetOrg: true让prepare_release阶段真正跑起来。pushPackages:false 时哪些步骤会执行当pushPackages: falseprepare_releasedisplayName: Prepare release artifacts阶段完整运行包含用 Darc 按 commit 解析 BAR 构建取第一个匹配构建并校验该构建确实属于请求的 GitHub 仓库执行一次darc gather-drop只下载 BAR 中的 NuGet 包资产——asset 过滤规则为^[^/]$符号包等带路径的 blob 资产不属于 NuGet.org 发布输入不会被下载。workload 发布对 gather 失败 fail-fast非 workload 发布加--continue-on-error但每个未下载成功的选中包必须在 NuGet.org 上已存在其精确 ID/version否则发布被拒绝对每个收集到的包从 nuspec 读取 package ID 与 version拒绝格式错误或重复的包重复文件名、重复 ID/version 对都会 throw并应用 include/exclude 过滤阶段结束报告选中的包身份与数量。随后按路径产出不同的工件这是 dry-run 核对的核心对象workload 路径dotnet/maui、dotnet/android、dotnet/macios发布两个 1ES pipeline 工件MauiPacksForNuGet与MauiManifestsForNuGet各自包含expected-packages.json和包可用性辅助脚本 nuget_release_packages.ps1。prepare 阶段会记录该脚本的 SHA-256后续每个生产步骤执行前先校验这个哈希。过滤必须同时选中 pack 和 manifest 集合否则报 Package filtering must select workload packs and manifests.且全部 manifest 只能属于同一个 workload 主版本号当前映射了 .NET 8/9/10/11 的 channel 与 feed。非 workload 路径如android-libraries产出NuGetPackagesForReleasestaged 的.nupkg、expected-packages.json、辅助脚本和审计工件NuGetReleaseAudit——其中release-audit.json记录barBuildId、commit、repository、selectedPackages、stagedPackages在人工审批之前就把选中清单与实际 staged 清单固定下来。prepare 阶段还会对 staged 目录运行FilterExisting过滤掉 NuGet.org 上已存在的精确 ID/version 对所以stagedPackages与selectedPackages的差集就是已存在于 NuGet.org 的包。以下部分在pushPackages: false时全部不会运行这些 stage 的启用条件都显式要求pushPackages: trueworkload channel 提升publish_maestro阶段的darc add-build-to-channel所有人工会签点ManualValidation0包括 non-workload-publish.yml 中Review NuGetReleaseAudit, then press Resume的审批通过1ES.PublishNuget1请求nuget.org (dotnetframework)服务连接的生产发布 job发布后 30 分钟窗口内轮询 NuGet.org 可见性的Verify步骤。文档明确给出的边界dry-run 会产出上述工件但不验证服务连接授权、外部 NuGet.org 认证或网络出向egress。如何判断 dry-run 成功docs/ReleaseProcess.md 的 Required internal validation 表格为 dry-run 给出了明确的证据要求阶段要求证据YAML preview1ES 展开、条件、任务输入、工件接线与服务连接引用有效commitHash: skip没有任何 gather、审批、服务连接、workload-channel 或发布 job 运行Artifact dry run一个真实发布 commit 执行了一次 gather两个工件中的 filters、identities、counts 和 SBOMs 正确对照检查清单阶段日志prepare_release成功且日志中对每个包集合打印了id/version/fileName表和计数Workload packs: N / NuGet packages: N 形式。把它与预期发布集合比对。审计工件非 workload 下载NuGetReleaseAudit核对release-audit.json中 selected 与 staged 两个列表workload 则核对MauiPacksForNuGet、MauiManifestsForNuGet中的expected-packages.json。skip 路径先用commitHash: skip跑一次确认除skip_release外没有任何 job——这是文档证据表的第二行。本地断言参考仓库自带 Pester 测试 eng/pipelines/ci-official-release.Tests.ps1 断言了 dry-run 相关行为例如非 workload 发布模板只有在pushPackages为true时才被包含eq(parameters.pushPackages, true).*non-workload-publish.yml、审计工件先于审批存在。可以在本地参考这些断言核对流水线门禁行为。限制与后续步骤dry-run 不能替代生产验证NuGet.org 上的包不可变生产发布无法被普通 dry-run 完全测出。文档要求在首次生产发布前按证据表逐项记录YAML preview、commitHash: skip、artifact dry run、test-feed run把同样的1ES.PublishNuget1形态发布到批准的非生产 feed、duplicate/recovery run、production preflight最后才是受控的 planned release。内部 Azure Artifacts feed 只能证明任务机制不能证明外部 feed 的精确认证与出向路径如果没有有代表性的外部测试 feed要在投产前记录这一限制。所有权检查任何仓库首次推送前先确认现有nuget.org (dotnetframework)服务连接拥有审计工件中所有 package ID。恢复过滤器仅限 workloadnugetAlreadyAttemptedPackFilters/nugetAlreadyAttemptedManifestFilters只用于 workload 发布中上一次任务已提交给 NuGet.org、仍在验证窗口的包非 workload 发布会直接拒绝这两个参数Non-workload releases do not support workload recovery filters。android-libraries 的特殊性其 BAR 构建是逐构建增量而非 channel 资产并集要按 commit 顺序逐个发布挂起的构建。dry-run 通过上述核对后按文档证据表顺序进入 test-feed run 与 duplicate/recovery run再谈真正的生产发布不要跳过这些阶段直接从 dry-run 结论跳到 scheduled release。【免费下载链接】maui.NET MAUI is the .NET Multi-platform App UI, a framework for building native device applications spanning mobile, tablet, and desktop.项目地址: https://gitcode.com/GitHub_Trending/ma/maui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考