ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Spinnaker 项目如何通过 Nexus 发布到 Maven Central:Gradle 发布流程与实现剖析

Spinnaker 项目如何通过 Nexus 发布到 Maven Central:Gradle 发布流程与实现剖析 后端DevOps云原生微服务【免费下载链接】spinnakerSpinnaker is an open source, multi-cloud continuous delivery platform for releasing software changes with high velocity and confidence.项目地址https://gitcode.com/gh_mirrors/sp/spinnaker点击查看免费下载导读本文围绕 Spinnaker 构建体系中一条真实且核心的发布链路展开Spinnaker 的各微服务clouddriver、orca、echo、front50 等如何通过 Sonatype 托管的 Nexus 仓库将 jar 发布并同步至 Maven Central。读完本文你将掌握publishToNexus、closeAndReleaseNexusStagingRepository两条关键 Gradle 任务的使用方式、四个发布级 GitHub Secrets 的用途、PGP 签名机制以及NexusPublishPlugin在源码层面的实现原理可直接用于理解或复现 Spinnaker 系项目的制品发布流程。发布链路总览从 Nexus 到 Maven Central自 2021 年 3 月起Spinnaker 的各 Java/Groovy 项目不再直接向 Maven Central 推送而是经由 Sonatype 为 OSS 项目托管的 Nexus 实例完成发布。其核心机制是通过 Gradle 将制品jar 及其 POM、sources、javadoc 等附属产物发布stage到 Nexus 的 staging repository在 Nexus UI 中对 staged release 执行Close触发 Nexus 与 Maven Central 的同步同步完成后制品即可在 Maven Central 的io/spinnaker/路径下被任何构建工具解析。文档明确指出这一同步过程大约需要10 分钟才能完成。因此从staging 完成到外部可下载之间存在一个时间窗口发布者需要对此有预期。这条链路对 Spinnaker 的多模块工程至关重要每个仓库如 clouddriver、orca、echo包含大量子项目最终都需要统一发布为io.spinnaker组织下的 Maven 制品。制品签名PGP 密钥与指纹发布到 Maven Central 的制品要求具备 PGP 签名Spinnaker 的 jar 统一使用由tocspinnaker.io邮箱所持有的 PGP 密钥进行签名其公钥指纹为9C88 1F6B 9595 3116 4FE3 CCD2 6A3E 0DDE A960 2C12签名在 Gradle 构建层面由SigningPlugin完成。从源码 NexusPublishPlugin.groovy 可以看到签名密钥通过内存方式注入而非常规的密钥环文件project.extensions.configure(SigningExtension) { signingExtension - signingExtension.useInMemoryPgpKeys(nexusExtension.pgpSigningKey(), nexusExtension.pgpSigningPassword()) signingExtension.sign(spinnakerPublication) }其中pgpSigningKey()与pgpSigningPassword()分别读取项目属性nexusPgpSigningKey与nexusPgpSigningPassword详见 NexusPublishExtension.groovy。这意味着 CI 中无需在机器上维护密钥环直接以环境变量/项目属性形式注入即可。凭据管理四个组织级 GitHub Secrets发布到 Nexus 需要四类敏感信息Spinnaker 以组织级org-levelGitHub Secrets统一管理供各仓库的 CI 工作流使用Secret 名称用途NEXUS_USERNAMENexus 账号用户名用于 repository 认证NEXUS_PASSWORDNexus 账号密码NEXUS_PGP_SIGNING_KEYPGP 私钥内容用于制品签名NEXUS_PGP_SIGNING_PASSWORDPGP 私钥口令这四者在 Gradle 端最终映射为 NexusPublishExtension.groovy 中的项目属性nexusUsername、nexusPassword、nexusPgpSigningKey、nexusPgpSigningPassword。CI 中通常做法是在.github/workflows里将 Secrets 通过-P或ORG_GRADLE_PROJECT_前缀环境变量传递给 Gradle。此外若需要登录 Nexus 的 Web UI 手动操作例如执行Close/Drop、获取 staging URL 进行验证文档说明需要向 Spinnaker 的 TOCTechnical Oversight Committee申请 root 用户名与密码。也就是说机器自动化发布使用上述四个 Secrets人工 UI 操作另有一套 root 凭据两者职责分离。Spinnaker 的 Nexus 实例托管于 Sonatype 官方平台central.sonatype.com其 staging API 与 snapshot 仓库的默认地址在扩展中直接固化详见下文。使用 Gradle 发布到 Nexus基础命令仅发布不发布到 Maven Central./gradlew -P nexusPublishEnabledtrue publishToNexus-P nexusPublishEnabledtrue是发布总开关。它对应 NexusPublishExtension.groovy 中的enabled()属性默认值为false当且仅当通过项目属性-P或gradle.properties传入nexusPublishEnabledtrue时NexusPublishPlugin 才会真正装配 Nexus 发布能力否则插件直接返回、不产生任何任务。执行后制品会被staging到 Nexusrelease 状态为Open。此时 Nexus UI 会为本次 staged 制品提供一个staging URL可用于在发布前测试制品是否可用。发布生命周期Open → Close / Dropstaged release 处于Open状态时在 Nexus UI 中你有两个操作选择Close关闭并开始与 Maven Central 的同步流程约 10 分钟同步完成后制品对外可见Drop直接删除本次 staged 制品放弃发布。这是文档明确给出的 UI 操作路径适用于人工把关发布内容的场景。程序化发布并关闭如果 CI 希望全自动完成发布 关闭 触发同步可使用组合命令./gradlew -P nexusPublishEnabledtrue publishToNexus closeAndReleaseNexusStagingRepositorycloseAndReleaseNexusStagingRepository会关闭 staging repository 并触发 release从而自动进入同步流程无需人工在 UI 中点击。这条命令是自动化发布流水线的标准用法。扩展默认值与可覆盖参数从 NexusPublishExtension.groovy 可确认以下扩展项及其默认值扩展属性对应项目属性-P/gradle.properties默认值说明enablednexusPublishEnabledfalse是否启用 Nexus 发布不传则插件静默退出nexusStagingUrlnexusStagingUrlhttps://ossrh-staging-api.central.sonatype.com/service/local/staging repository API 地址nexusSnapshotUrlnexusSnapshotUrlhttps://central.sonatype.com/repository/maven-snapshots/snapshot 仓库地址nexusStagingProfileIdnexusStagingProfileIdb6b58aed9c738由 Sonatype 分配的 staging profile ID—nexusUsername无Nexus 用户名—nexusPassword无Nexus 密码—nexusPgpSigningKey无PGP 私钥—nexusPgpSigningPassword无PGP 私钥口令值得注意的实现细节enabled、nexusStagingUrl、nexusSnapshotUrl、nexusStagingProfileId均通过withSysProp包装即项目属性可以覆盖扩展的默认值见 NexusPublishExtension.groovy。例如在多租户或自定义 Sonatype 实例场景下可以通过-P nexusStagingUrl...重定向 staging 地址。源码剖析NexusPublishPlugin 如何工作理解了命令后再看 NexusPublishPlugin.groovy 的完整装配逻辑可以更清楚地把握这条链路的边界。插件装配入口NexusPublishPlugin 的apply顺序为创建名为nexusSpinnaker的扩展即上面表格中的默认值来源若enabled为 false立即返回不产生任何发布能力仅当当前项目是root project时才应用底层的io.github.gradlenexus.publishplugin.NexusPublishPlugin第三方 Gradle Nexus 发布插件并将仓库地址、凭据、staging profile 写入名为nexus的 repositoryNexusPublishPlugin.groovy对每个应用了JavaLibraryPlugin或JavaPlatformPlugin的子项目补充MavenPublishPlugin与SigningPlugin并为其配置 Spinnaker 专用的 Maven publication。这一点解释了为什么文档中的命令只需要在仓库根目录执行一次Nexus 相关的全局配置与任务聚合都发生在 root project 上。多模块任务聚合Spinnaker 的每个仓库如 clouddriver、orca都是包含大量子模块的 Gradle 工程。由于底层 Nexus 插件似乎只会为某个项目创建一次同名任务NexusPublishPlugin.groovy 在projectsEvaluated阶段做了三件事若根项目上不存在publishToNexus、findNexusStagingRepository、closeAndReleaseNexusStagingRepository则注册同名空任务让根项目上的这三个任务dependsOn 所有子项目上的同名任务project.subprojects*.tasks*.findByName(...)从而保证在根目录执行一次命令即可递归发布整个仓库的所有模块。findNexusStagingRepository任务可用来按 staging profile 查找当前 open 的 staging repository是程序化发布流程中的辅助任务。Spinnaker 专用 Maven Publication发布到 Maven Central 的制品并非通用 Maven 产物而是由 PublishingPlugin.groovy 预先创建的名为spinnaker的 publicationPUBLICATION_NAME spinnaker。其要点包括对 Java Library附加sourceJar产物PublishingPlugin.groovy使用versionMapping将版本解析为 enforcedPlatform 版本语义保证java-api/java-runtime两个 usage 的版本正确显式禁用 Gradle Module Metadata.module 文件因为其存在会导致 IntelliJ 无法关联-sourcesjarJava Platform 模块还会引发 kork 依赖解析问题PublishingPlugin.groovy。Javadoc 产物Dokka 优先Maven Central 要求制品附带 javadoc。NexusPublishPlugin 的装配逻辑是若项目应用了DokkaPluginKotlin 项目则生成dokkaJarclassifier 为javadoc并附加到 publication否则若应用了JavaPlugin则基于javadoc任务生成javadocJar附加到 publication。对应源码见 NexusPublishPlugin.groovy。这也印证了 Spinnaker 仓库中 Java如 front50、gate与 Kotlin如 keel、orca 的 queue 模块项目均走同一条发布链路。POM 元数据生成configurePomNexusPublishPlugin.groovy为每个 publication 生成完整 POM 元数据关键字段包括nameroot project 名如clouddriver、orcadescription为Spinnaker ${service.capitalize()}licensesApache License 2.0developersid toc、name Technical Oversight Committee、email tocspinnaker.io与 PGP 签名邮箱一致inceptionYear2014scm与issueManagement指向各服务对应的源码仓库与 Spinnaker 主仓的 issue 跟踪。发布到 Nexus 的完整操作清单综合文档与源码一个完整的发布流程可归纳为准备凭据确保 CI 或本地环境具备四个 SecretsNEXUS_USERNAME、NEXUS_PASSWORD、NEXUS_PGP_SIGNING_KEY、NEXUS_PGP_SIGNING_PASSWORD并以项目属性形式注入 Gradle-P或ORG_GRADLE_PROJECT_*环境变量发布 staging在仓库根目录执行./gradlew -P nexusPublishEnabledtrue publishToNexus等待所有子模块发布完成release 处于Open状态可选人工验证在 Nexus UI 中获取 staging URL下载并验证制品包括 PGP 签名与 POM 内容触发同步二选一——UI 操作在 Nexus UI 中点击Close触发与 Maven Central 同步约 10 分钟或Drop放弃本次发布程序化执行./gradlew -P nexusPublishEnabledtrue publishToNexus closeAndReleaseNexusStagingRepository一次性完成发布与关闭确认同步约 10 分钟后在 Maven Central 的io/spinnaker/组下确认制品可被外部解析。多模块与版本属性传播的注意事项Spinnaker 各仓库在发布时的工程结构特点是多模块 可能的 composite build。对此SpinnakerProjectPlugin.groovy 提供两个值得了解的机制递归默认任务configureDefaultTasks会为根项目注册publish、publishToMavenLocal、assemble、test等生命周期任务并递归 dependsOn 所有子项目同名任务SpinnakerProjectPlugin.groovy因此根目录一条命令即可覆盖全仓库io.spinnaker.前缀属性传播propagateRootLevelProperties会把根gradle.properties中以io.spinnaker.开头的属性去除前缀后传播到子项目且不覆盖子项目已有的同名属性SpinnakerProjectPlugin.groovy。发布相关的版本号、nexusPublishEnabled等属性可借此在 composite build 中统一传递。也就是说NexusPublishPlugin由SpinnakerProjectPlugin统一装配见 SpinnakerProjectPlugin.groovy它并非一个需要各仓库单独引入的插件而是 Spinnaker 标准化 Gradle 工程的一部分。小结Spinnaker 的 Maven Central 发布链路是一条Gradle 插件封装 Nexus staging 定时同步的成熟实践NexusPublishPlugin负责在 root project 装配第三方 Nexus 插件、聚合子项目任务、注入 PGP 签名并生成标准 POM发布者只需提供四个 GitHub Secrets并通过-P nexusPublishEnabledtrue打开开关即可用两条命令完成从 staging 到 release 的全过程。理解这一机制对任何基于 Spinnaker 构建体系做二次开发、镜像发布或搭建同类发布流水线的团队都有直接的参考价值。赞分享后端DevOps云原生微服务【免费下载链接】spinnakerSpinnaker is an open source, multi-cloud continuous delivery platform for releasing software changes with high velocity and confidence.项目地址https://gitcode.com/gh_mirrors/sp/spinnaker点击查看免费下载相关推荐Spinnaker Keel 发布 JAR 指南io.spinnaker.keel 制品的 Sonatype Nexus 发布流程与 Maven Central 同步机制Spinnaker Keel 发布 JAR 指南io.spinnaker.keel 制品的 Sonatype Nexus 发布流程与 Maven Centra后端DevOps云原生微服务Gson 版本发布全流程实战指南Maven Release 插件、Sonatype Nexus 发布与本地演练Gson 版本发布全流程实战指南Maven Release 插件、Sonatype Nexus 发布与本地演练 Gson 的版本发布并非简单的 mvn dep后端Marten入门指南5分钟快速搭建.NET文档数据库和事件存储Marten入门指南5分钟快速搭建.NET文档数据库和事件存储 Marten是.NET生态系统中功能强大的 PostgreSQL文档数据库和事件存储库 它为数据库后端上一篇如何利用GVirt构建企业级AI推理平台架构设计与实施案例下一篇深入理解UBS-mem架构如何实现超节点间的内存共享与借用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表