Skip to content

javachanges GitHub Actions 发布流程使用指南

1. 概述

这个仓库现在已经接入了一套基于 javachanges 自身命令的 GitHub Actions 发布流程。

这份文档是当前仓库自举发布流程的专用说明。如果你想看更通用的 GitHub Actions 接入方式,请继续看 GitHub Actions Usage Guide

目标流程如下:

  1. 功能分支合并到 main
  2. main 上如果存在 .changesets/*.md
  3. GitHub Actions 自动生成或更新 release PR
  4. release PR 合并后
  5. GitHub Actions 可以在 snapshot 分支上自动发布 snapshot
  6. GitHub Actions 自动打 tag、发布到 Maven Central、创建 GitHub Release

1.1 工作流流程图

Loading diagram...

2. 工作流组成

仓库包含四条工作流:

文件作用
.github/workflows/ci.yml常规 CI,验证 Java 8 构建和发布 profile
.github/workflows/release-plan.ymlmain 上扫描 changesets,自动生成 release PR
.github/workflows/publish-snapshot.ymlsnapshot 分支当前构建发布到配置好的 snapshot 仓库
.github/workflows/publish-release.yml在 release PR 合并后执行正式发布

3. release PR 工作流

release-plan.yml 的核心逻辑是:

bash
mvn -B -DskipTests exec:java -Dexec.args="github-release-plan --directory $GITHUB_WORKSPACE --write-plan-files false --execute true"

它会:

动作说明
读取 .changesets/*.md收集待发布变更
计算发布版本生成 releaseVersionnextSnapshotVersion
应用发布计划更新 <revision>CHANGELOG.md,不提交生成的 plan 文件
删除已消费的 changeset避免重复发布

工作流随后会把这些变更提交到:

bash
changeset-release/main

并自动创建或更新 PR。

4. snapshot 发布工作流

publish-snapshot.yml 会在 snapshot 分支 push 和手动 workflow_dispatch 时运行。

它会依次做这些事:

  1. 校验 snapshot 仓库变量和凭据
  2. 为本次 workflow 生成稳定的 snapshot build stamp
  3. 执行 javachanges preflight --snapshot
  4. 执行 javachanges publish --snapshot --execute true

最终发布的不是根 1.3.1-SNAPSHOT 原样坐标,而是类似:

text
1.3.1-20260420.154500.abc1234-SNAPSHOT

当前仓库的 workflow 默认使用:

text
<github.run_id>.<github.run_attempt>.<git short sha>

作为构建标识,所以即使同一 commit 重跑,也能在 snapshot 分支上得到可区分的 snapshot 版本。

snapshot 发布需要配置这些 GitHub Actions secrets:

类型名称是否必需
SecretMAVEN_CENTRAL_USERNAME
SecretMAVEN_CENTRAL_PASSWORD
SecretMAVEN_GPG_PRIVATE_KEY
SecretMAVEN_GPG_PASSPHRASE

当前仓库的 snapshot workflow 已切换为使用 central-publishing-maven-plugin 配合 -SNAPSHOT 版本直接上传,不再依赖单独的 maven-snapshots server id 和 distributionManagement 认证入口。

workflow 成功后,建议通过下面这些 snapshot 地址验证:

  • https://central.sonatype.com/repository/maven-snapshots/
  • https://central.sonatype.com/repository/maven-snapshots/io/github/sonofmagic/javachanges/<resolved-snapshot-version>/maven-metadata.xml
  • https://central.sonatype.com/repository/maven-snapshots/io/github/sonofmagic/javachanges/<resolved-snapshot-version>/javachanges-<timestamped-version>.jar

需要注意的是,hosted snapshot 仓库根地址不能直接浏览目录,所以验证时应优先看 metadata URL、具体产物 URL,或者直接用 Maven / Gradle 做一次依赖解析。

5. 正式发布工作流

publish-release.yml 现在有两种运行模式:

  1. release PR 合并后自动触发
  2. 需要对某个已经合并的 release commit 重新发布时,通过 workflow_dispatch 手动触发

自动触发模式只会在以下条件全部满足时运行:

条件说明
PR 已 merged必须是真的合并,不是关闭
base branch 是 main只发布主线
head branch 是 changeset-release/main只处理 release PR

它会依次做这些事:

  1. checkout release PR 的 merge commit
  2. 执行 github-tag-from-plan --execute true
  3. 执行 github-release-from-plan,生成 target/release-notes.md 并导出 releaseVersion
  4. central-publish profile 发布到 Maven Central
  5. 执行 github-release-from-plan --execute true,创建或更新 GitHub Release

5.1 正式发布重试行为

Publish Release 可以安全地针对同一个 release merge commit 重跑。

如果上一次运行已经创建了 release tag,但在 Maven Central 发布或 GitHub Release 创建前失败,请用同一个 release merge commit SHA 重跑 Publish Release。当 GitHub Release 还不存在、远端 tag 又指向这个 commit 时,github-release-publish-state 会继续执行;随后 github-tag-from-plan 会把已存在的 tag 当成可恢复状态,而不是重新创建。

如果远端 tag 已存在但指向另一个 commit,workflow 会在发布前失败。此时应先检查这个 tag,确认后要么用被 tag 的 commit 重跑 workflow,要么在确认旧 tag 指向错误后再移动 tag。

actions/setup-java 导入私钥之后,当前两个发布 workflow 都会先执行 javachanges ensure-gpg-public-key。这一步会:

  1. 读取当前导入的签名指纹
  2. 尝试把公钥上传到 hkps://keyserver.ubuntu.comhkps://keys.openpgp.org
  3. 轮询确认至少一个受支持的 keyserver 已经能查询到该公钥

这样可以避免 Maven Central 在后续校验签名时出现类似 Invalid signature for file ... Could not find a public key by the key fingerprint 的失败。

6. 仓库必须配置的 Secrets

你需要在 GitHub 仓库的 Settings > Secrets and variables > Actions 中配置:

Secret用途
MAVEN_CENTRAL_USERNAMESonatype Central Portal token username
MAVEN_CENTRAL_PASSWORDSonatype Central Portal token password
MAVEN_GPG_PRIVATE_KEYASCII armored GPG 私钥
MAVEN_GPG_PASSPHRASEGPG 私钥口令

publish-release.yml 现在会在准备 Java、Maven settings 和 GPG 之前先校验这些 secrets。只要有任意一个缺失,工作流会立刻失败,并直接指出缺的是哪一个 secret。

针对已经失败的 Publish Release 运行,推荐恢复步骤是:

  1. 把缺少的 secrets 补齐
  2. 如果之前失败日志里提到公钥指纹不可发现,先使用当前仓库版本重新触发,让 workflow 自动发布并校验公钥
  3. 在 Actions 页面重新触发 Publish Release
  4. 确认它能进入 Publish to Maven Central 这一步

7. 推荐使用方式

日常开发时:

  1. 新建分支
  2. 修改代码
  3. 添加 changeset
  4. 提交并发起 PR
  5. 合并到 main

添加 changeset 的示例:

bash
mvn -q -DskipTests compile exec:java -Dexec.args="add --directory $PWD --summary 'add GitHub Actions release automation' --release minor"

这条命令现在会写出官方 package-map 风格的 changeset 文件,例如:

md
```md
---
"javachanges": minor
---

add GitHub Actions release automation
```

8. 版本模式说明

为了支持 release PR 合并后再发布正式版,当前仓库已经切换到:

xml
<version>${revision}</version>

并通过:

xml
<revision>1.0.0-SNAPSHOT</revision>

维护开发版本。

这样 release PR 合并后:

阶段版本
发布版本通过 manifest-field --fresh true 推导,例如 1.0.0
主干版本已提前推进到下一个快照,例如 1.0.1-SNAPSHOT

publish workflow 会在真正部署时使用:

bash
-Drevision=<releaseVersion>

从而发布正式版,而不会把快照版上传到 Central。

snapshot workflow 则会使用:

bash
-Drevision=<baseVersion>-<snapshotBuildStamp>-SNAPSHOT

这样同一个开发 snapshot 线可以连续发布多个唯一构建,而不会都挤在同一个可见版本名下。

在当前仓库里,推荐的开发路径是:

  1. 正式发布相关变更先合并到 main
  2. 想触发对外 snapshot 发布的变更合并到 snapshot
  3. publish-snapshot.ymlsnapshot 分支头部自动发布

9. 手动触发

如果你需要手动重跑某条流程,可以在 GitHub Actions 页面触发:

工作流是否支持 workflow_dispatch
Release Plan
Publish Snapshot
Publish Release是,需要把 release_commit_sha 设为 release PR 合并后的 commit

如果某个已经 merge 的 release PR 触发过失败的 Publish Release,通常不需要重新走一遍 release PR。直接手动触发 Publish Release,并把原始 merge commit SHA 通过 release_commit_sha 传进去即可。

10. 发布前本地验证

在本地,你可以先验证这个自举流程是否正常:

bash
mvn -B verify
mvn -B -Pcentral-publish -Dgpg.skip=true verify
mvn -B -DskipTests compile exec:java -Dexec.args="status --directory $PWD"
mvn -B -DskipTests compile exec:java -Dexec.args="preflight --directory $PWD --snapshot --snapshot-build-stamp local.dev.001"

11. 总结

现在这个仓库的标准发布路径是:

阶段入口
日常校验CI workflow
snapshot 发布Publish Snapshot workflow
生成 release PRRelease Plan workflow
正式发布Publish Release workflow

如果你需要可复用到其它仓库的 GitHub Actions 模板和命令拆分,请继续看 GitHub Actions Usage Guide

基于 Apache-2.0 License 发布。