ARTICLE DETAIL

资讯详情

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

Apereo CAS 发布工程实践:从 GPG 签名到 GitHub Actions 的完整发布流程

Apereo CAS 发布工程实践:从 GPG 签名到 GitHub Actions 的完整发布流程 后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载本文基于 Apereo CAS 官方的发布流程文档 Release-Process.md 与仓库内的发布脚本、CI 工作流和 Gradle 构建约定整理而成完整覆盖 CAS 服务端发布的全部操作路径本地与 GitHub Actions 两种发布方式、Maven Central 账号与 GPG 签名配置、发布分支与 CI 工作流的改造、以及发布完成后的文档与维护策略更新。读完本文后你可以完整复现一次 CAS 版本的切割cut release流程并理解ci/release.sh脚本背后签名、上传、打标签、生成发布说明、版本回滚 bump 等关键动作的实际实现。两种发布方式概览CAS 的发布流程有两种执行入口两者步骤大体一致仅在细节上有少量差异本地执行Locally在发布工程师自己的机器上运行需要提前完成 Maven Central 授权、GPG 密钥、环境准备等多项前置配置GitHub Actions推荐方式通过 dispatch 一次Release工作流运行来完成发布几乎无需本地预先配置只需更新版本号等信息后在 GitHub 上触发即可。两种方式的凭据来源不同这一点贯穿整个流程凭据本地方式GitHub Actions 方式仓库上传用户/令牌环境变量REPOSITORY_USER/REPOSITORY_PWD仓库 Secrets 注入同名环境变量PGP 私钥~/.gradle/gradle.properties中的三项signing.*属性SecretsPGP_PRIVATE_KEY/PGP_PASSPHRASE以内存内密钥方式注入触发方式手动执行./ci/release.sh手动 dispatchReleaseworkflowMaven Central 账号准备仅本地方式需要如果选择本地发布需要先完成注册一个 Sonatype Central 账号申请org.apereo命名空间的发布授权过程中可能需要现有项目成员为你做担保vouch。CAS 所有构件的 group ID 即为org.apereo.cas这一点可以从根目录的 gradle.properties 中确认grouporg.apereo.cas当前开发版本为version8.1.0-SNAPSHOT。构件最终以org.apereo.cas聚合的形式发布到 Maven Central。GPG 签名配置仅本地方式需要发布构件在上传到中央仓库之前必须完成签名。本地方式需要自行生成 OpenPGP 密钥对并向构建提供三样信息公钥 ID取 keyId 的最后 8 位可用gpg -K查看私钥环文件的绝对路径gpg 2.1 起需要通过如下命令导出密钥环文件gpg --keyring secring.gpg --export-secret-keys ~/.gnupg/secring.gpg保护私钥的口令passphrase。三项配置写入~/.gradle/gradle.propertiessigning.keyId7A24P9QB signing.passwordP$$w0rd signing.secretKeyRingFile/Users/example/.gnupg/secring.gpg源码中的签名实现签名行为统一由项目约定脚本 org.apereo.cas.project-conventions.gradle 处理所有子工程在应用maven-publish插件后都会进入同一段逻辑required project.publishReleases !project.skipArtifactSigning只有在发布 release而非 SNAPSHOT且未显式跳过签名时签名才是强制的如果环境变量中存在PGP_PRIVATE_KEY与PGP_PASSPHRASE即 GitHub Actions 场景构建通过useInMemoryPgpKeys(...)直接使用内存内密钥签名完全不依赖本地密钥环文件——这正是 CI 方式无需配置secring.gpg的原因对每一个MavenPublication执行signing.sign(publication)即对 POM、JAR、sources、javadoc 等全部构件逐一签名。本地执行时则回落到 Gradle 官方 signing plugin 读取signing.*属性的默认行为。本地环境准备仅本地方式需要加载你的 SSH 密钥并确保该 SSH 密钥已在 GitHub 上登记视需要调整$GRADLE_OPTS初始化 JVM 堆内存检出 CAS 项目源码确认已安装最新的JDK 25并用java -version验证。当前仓库对 JDK 版本有硬性约束gradle.properties 中sourceCompatibility25/targetCompatibility25且根构建脚本 build.gradle 注册了verifyRequiredJavaVersion任务当前 JVM 与targetCompatibility不兼容时会直接抛出GradleException。CI 侧同样写死了JDK_CURRENT: 25corretto 发行版见 release.yml。准备发布分支与 CI 工作流改造创建发布分支仅针对major / minor 版本如6.5.x需要执行。如果目标版本已存在远端跟踪分支直接git checkout该分支跳过本步进入发布环节。# Replace $BRANCH with CAS version (i.e. 6.5.x) git checkout -b $BRANCH调整 GitHub Actions 工作流触发条件新建分支后需要让 CI 工作流只监听新分支。涉及六个工作流文件analysis.ymlvalidation.ymlpublish.ymlpublish-docs.ymlfunctional-tests.ymltests.yml触发条件改为以$NEW_BRANCH为新分支名on: workflow_dispatch: push: branches: - $NEW_BRANCH - !**.**.** - !heroku-* pull_request: types: [ labeled ] branches: [ $NEW_BRANCH, pr-* ]注意确认这些工作流中没有其他地方仍指向master分支。同时将以下四个与主线开发绑定的工作流禁用build.ymlperformance.ymldependencies.ymlnative-tests.yml禁用方式on: workflow_dispatch: push: branches-ignore: - **最后提交所有改动并推送到远端创建用于跟踪本次发布的远端分支。以仓库现状为例analysis.yml 与 validation.yml 的on:段都采用workflow_dispatchpush.branchespull_request.branches: [ master, pr-* ]的组合改造时就是在这两处把master替换为新的发布分支名。执行发布方式一GitHub Actions推荐在 GitHub 的 Actions 页面于正确的分支上 dispatchRelease工作流运行会被要求输入两个参数releaseVersion本次发布版本如8.0.0-RC1不能是-SNAPSHOT版本nextVersion下一个开发版本如8.0.1-SNAPSHOT可选。该工作流.github/workflows/release.yml的完整行为是check作业先判定版本是否为 SNAPSHOT——若是则直接走快照发布路径跳过正式发布作业release-to-central作业检出代码、安装 JDK 25corretto、chmod x ./ci/*.sh并执行初始化脚本、通过gpg --batch --import导入 Secrets 中的私钥最终调用./ci/release.sh --release-version $RELEASE_VERSION --next-version $NEXT_VERSION完成全部动作。工作流会自动完成构建项目、签名字节码、将构件暂存stage到中央仓库、为发布版本打 tag并创建附带有发布说明和构件的 GitHub Release此时是草稿状态需要你审阅后手动发布以最终完成。一旦发布暂存完成并通过校验将自动对外发布。其中NEXT_VERSION若未提供工作流会回退读取gradle.properties中的当前版本作为下一版本release.yml。方式二本地执行官方文档明确提醒本地发布仅适用于确实清楚自己在做什么的场景最好只用于问题排查与诊断。第一步导出凭据环境变量。凭据在 Sonatype 平台生成会收到一个用户 ID 和一个用户令牌# Credentials here are generated at https://central.sonatype.com/account # You will receive a user id and a user token. export REPOSITORY_USER... export REPOSITORY_PWD...第二步执行发布命令./ci/release.sh --release-version 8.0.0-RC1 --next-version 8.0.1-SNAPSHOT深入ci/release.sh的实际执行链ci/release.sh 是两种方式的共同终点读懂它能验证整个发布过程的关键细节。脚本支持四个参数--release-version、--next-version、--publishing-type默认AUTOMATIC对应 Sonatype 的自动发布模式、--private私有发布跳过打 tag 与 GitHub Release 创建和--split拆分为多个构件包。脚本启动时L330-L372会做三项前置检查版本以v开头会直接报错防止误把 tag 当版本号REPOSITORY_USER/REPOSITORY_PWD任一缺失则终止按版本号是否含SNAPSHOT分流正式版走clean → init → publish快照版走snapshot。快照发布snapshot 函数执行./gradlew assemble publishAggregationToCentralSnapshots \ -x test -x javadoc -x check --no-daemon --parallel --quiet \ -DskipAottrue -DpublishSnapshotstrue --stacktrace \ --configure-on-demand -DpublishingType${publishingType} \ -DrepositoryUsername$REPOSITORY_USER \ -DrepositoryPassword$REPOSITORY_PWD正式版发布publish 函数的完整顺序是依赖版本校验先运行./gradlew verifyDependencyVersions。该任务在根构建脚本 build.gradle 中注册逻辑是逐行扫描版本目录gradle/libs.versions.toml只要发现任何SNAPSHOT依赖即抛出GradleException——这保证了正式发布的 POM 中不会携带快照依赖聚合发布执行./gradlew assemble publishAggregationToCentralPortal -Pversion... -PnextVersion...携带与快照发布相同的-D参数并加上-DpublishReleasestrue若指定--split则改用nmcpZipAggregation任务产出build/nmcp/zip/aggregation.zip将其解压后重新打包为cas-webapp-tomcat.zip、cas-webapp-undertow.zip、cas-webapp-jetty.zip、cas-webapp.zip、cas-webapp-config-server.zip与cas-rest-of-release.zip并通过 Sonatype 的central.sonatype.com/api/v1/publisher/uploadREST 接口Bearer 令牌认证逐个上传清理旧 tag 与旧 Release删除本地/远端同名vversiontag 及既有 GitHub Release避免重复发布冲突打 taggit tag vversion并推送CI 环境下会先把 git 身份设置为casapereo.org创建 GitHub Release草稿版本匹配*-RC*时使用--prerelease标记RC 版本标记为预发布否则标记为--latest若为 RC 版本自动为RC1..RCn生成文档链接列表作为 changelog通过gh api repos/apereo/cas/compare/previousTag...releaseTag提取该版本区间内的所有贡献者写入 Contributions 一节的发布说明中发布说明固定包含 Documentation、Commit Log、Maintenance Policy、Release Policy、Release Schedule 五类链接并附上cas-server-support-shell的 jar 作为 CAS Command-line Shell 附件L240-L265。关闭 GitHub Milestone按版本名查找 milestone 并 PATCH 为 closed版本 bump用sed把gradle.properties中的version改写为--next-version指定的下一开发版本若确有变更则提交到release/bump-branch-to-nextVersion分支并自动创建 PR标题为Release: Bump version to nextVersion把主干版本推回 SNAPSHOT 线L278-L300。文档中给出的发布成功后自动发布结论即对应脚本末尾的提示Done! The release is now automatically published. There is nothing more for you to do!——在publishingTypeAUTOMATIC模式下Sonatype 校验通过后无需人工介入。收尾工作Housekeeping若通过 GitHub Actions 发布本节大部分会自动处理。若手动执行且要更新发布描述请保持与以往版本一致的排版格式。发布 RC 版本时记得把发布 tag 在 GitHub 上标记为pre-release脚本已自动带--prerelease手动场景需自行确认如果 GitHub Release 已创建为草稿审阅发布描述、按需编辑后正式发布才算完成收尾。发布后的文档与策略更新以下事项仅在 major/minor 版本创建新分支时才需要执行将文档站点中的current指向最新发布版本docs 站点的 current 入口修改文档构建配置 docs/cas-server-documentation/_config.yml把对应的旧分支/目录从构建中排除在文档的可用版本列表中加入新发布版本视需要更新项目 README.md 中的版本信息更新构建流程文档补充构建新发布版所需的信息为新文档版本更新 Algolia 索引使搜索覆盖新空间更新 release notes 总览页并移除旧条目release_notes。另有一个独立的维护策略更新步骤同样只针对 major/minor 版本更新项目的 Maintenance Policy记录新的发布计划与 EOL停止维护时间线。最后文档还要求确保CAS Initializr基于 Starter 的脚手架服务同步更新使其支持基于刚发布的新版本生成项目。参考文件索引主题仓库内路径发布流程文档本文主体docs/cas-server-documentation/developer/Release-Process.md发布脚本ci/release.shRelease 工作流.github/workflows/release.yml快照/主线发布工作流.github/workflows/publish.yml签名与发布约定buildSrc/src/main/groovy/org.apereo.cas.project-conventions.gradle依赖版本校验任务build.gradle版本与平台元数据gradle.properties版本线策略配套阅读docs/cas-server-documentation/developer/Release-Policy.md需要说明的适用前提本文所有版本号、JDK 要求与工作流名称均以当前仓库快照为准当前开发版本8.1.0-SNAPSHOT、JDK 25。文档中引用的4.2.x/5.0.x等分支命名示例为历史惯例实际操作时以当年真实分支为准发布相关凭据Sonatype 用户令牌、PGP 私钥均只应存放在受控的 Secrets 或本机环境中切勿入库。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS项目发布流程详解Apereo CAS项目发布流程详解 概述 Apereo CAS作为一个开源的企业级单点登录系统其发布流程遵循严格的规范和步骤。本文将详细介绍CAS项目的完整后端认证鉴权单点登录go.opentelemetry.io/otel 发布流程全指南从 Semantic Convention 升级到 GPG 签名与 GitHub Releasego.opentelemetry.io/otel 发布流程全指南从 Semantic Convention 升级到 GPG 签名与 GitHub Releas测试开发工具CI/CDPlantUML 发布流程全解析基于 GitHub Actions 的 Tag 驱动版本发布、快照、Docker 镜像与 GPG 签名PlantUML 发布流程全解析基于 GitHub Actions 的 Tag 驱动版本发布、快照、Docker 镜像与 GPG 签名 本篇技术指南以仓库内开发工具文档上一篇Logseq 开源项目教程下一篇Rufus如何让老旧电脑也能安装Windows 11技术原理深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表