Skip to content

Examples Guide 使用指南

1. 概述

这篇文档说明仓库里已经提交好的 Maven 示例工程 examples/basic-monorepo/ 和 Gradle 示例工程 examples/basic-gradle-monorepo/ 应该怎么使用。

这个示例刻意保持很小,但已经覆盖了 javachanges 的完整链路:

路径作用
examples/basic-monorepo/pom.xml带统一 revision 的根 Maven monorepo
examples/basic-monorepo/.changesets/待发布变更文件
examples/basic-monorepo/snapshots/plan --apply true 之后的整理结果
examples/basic-monorepo/.github/workflows/最小 GitHub Actions 模板
examples/basic-monorepo/.gitlab-ci.yml最小 GitLab CI 模板
examples/basic-gradle-monorepo/等价 Gradle monorepo 示例,并交给 Gradle 原生 publishing

如果你不想只看零散文档,而是想直接参考一套完整的最小项目,就从这个示例开始。

2. 仓库结构

这个示例仓库包含两个 Maven 模块:

text
examples/basic-monorepo/
├── .changesets/
├── .github/workflows/
├── env/
├── modules/
│   ├── api/
│   └── core/
├── snapshots/
├── .gitlab-ci.yml
├── CHANGELOG.md
└── pom.xml

核心约定如下:

  • pom.xml 负责统一管理 revision
  • pom.xml 里声明了 modules/coremodules/api
  • CHANGELOG.md 在应用 plan 之前就已经存在
  • 待发布变更保存在 .changesets/*.md

3. 示例 changeset 格式

这个示例使用的是官方 Changesets 风格的 package map:

md
---
"javachanges-basic-monorepo-core": minor
"javachanges-basic-monorepo-api": minor
---

Add release notes generation workflow.

- Demonstrates a feature changeset for a two-module Maven monorepo.
- Shows how `javachanges plan` aggregates release metadata.

可以这样理解:

  • javachanges-basic-monorepo-corejavachanges-basic-monorepo-api 是 Maven artifactId
  • minor 表示这两个包都贡献一次 minor 升级
  • 正文第一条非空文本会被当成 summary
  • 后续 bullet 会进入 changelog 补充说明

4. 快照对照

javachanges 源码仓库根目录运行:

bash
mvn -q -DskipTests compile exec:java -Dexec.args="status --directory examples/basic-monorepo"
mvn -q -DskipTests compile exec:java -Dexec.args="plan --directory examples/basic-monorepo --apply true"

如果你直接在 javachanges 源码仓库里原地运行这个示例,带 Git 语义的版本计算仍然可能看到外层仓库的 tag。 下面 snapshots/ 里的基线值,对应的是把该示例复制到独立 Git 仓库之后的结果。

如果你不想直接改动示例目录,可以先看 snapshots/ 里的整理结果:

快照文件展示内容
examples/basic-monorepo/snapshots/release-plan.json机器可读的发布元数据
examples/basic-monorepo/snapshots/release-plan.mdrelease PR 正文
examples/basic-monorepo/snapshots/CHANGELOG.after.md本次发布生成的 changelog 片段
examples/basic-monorepo/snapshots/pom.after.xml发布后推进到下一个快照版本的根 revision

这个 release-plan 快照对应的关键值如下:

字段示例值
releaseVersion0.2.0
nextSnapshotVersion0.2.0-SNAPSHOT
releaseLevelminor
modulesjavachanges-basic-monorepo-corejavachanges-basic-monorepo-api

5. GitHub Actions 示例

示例仓库里包含 4 份 GitHub Actions 模板:

文件作用
examples/basic-monorepo/.github/workflows/ci.yml构建 Maven 仓库并执行 status
examples/basic-monorepo/.github/workflows/release-plan.ymlgithub-release-plan 创建或更新 release PR
examples/basic-monorepo/.github/workflows/tag-release.ymlgithub-tag-from-plan 给合并后的 release commit 打 tag
examples/basic-monorepo/.github/workflows/publish.yml在 tag push 后用 publish --execute true 完成发布

这些模板默认假设:

  • javachanges 以 jar 形式从 Maven Central 下载
  • 固定版本由 JAVACHANGES_VERSION 控制
  • Maven 凭据来自 GitHub Actions variables / secrets
  • actions/setup-java 开启了 cache: maven
  • 示例 POM 坐标已经足够唯一,可先安全演示发布,之后再替换成真实命名

这样做的好处是:目标仓库不需要把 javachanges 源码整个 vendoring 进去,也能直接复用这套流程。

6. GitLab CI 示例

examples/basic-monorepo/.gitlab-ci.yml 对应的是同一套生命周期:

  1. verify
  2. release-plan
  3. tag
  4. publish

现在示例模板直接复用官方 Maven plugin 入口,保留 Maven 依赖缓存,并把每个 job 压到一条 javachanges 命令:

  • 校验阶段执行 status
  • 默认分支执行 gitlab-release-plan --execute true
  • release plan 合并后执行 gitlab-tag-from-plan --execute true
  • snapshot pipeline 和 tag pipeline 都直接执行 publish --execute true,由命令内部处理 preflight、tag 判定、snapshotBranch 判定和 settings 生成
  • 正式版 tag 发布成功后,再执行 gitlab-release --execute true 创建或更新 GitLab Release

7. Gradle 示例

仓库里也包含了一个可以直接复制的 Gradle monorepo:examples/basic-gradle-monorepo/。 它继续使用同样的 .changesets/CHANGELOG.md 和 release-plan 文件。 CI 模板固定使用 Java 8 和 Gradle 7.6.6,确保示例仍兼容 Java 8 运行环境。 构建模型文件如下:

text
examples/basic-gradle-monorepo/
├── .changesets/
├── .github/workflows/
├── env/
├── modules/
│   ├── api/
│   └── core/
├── snapshots/
├── .gitlab-ci.yml
├── CHANGELOG.md
├── build.gradle.kts
├── gradle.properties
└── settings.gradle.kts

gradle.properties

properties
version=0.2.0-SNAPSHOT

settings.gradle.kts

kotlin
rootProject.name = "basic-gradle-monorepo"
include(":core", ":api")

等价 Gradle changeset:

md
---
"core": minor
"api": minor
---

Add release notes generation workflow.

javachanges 源码仓库根目录运行这个已提交示例:

bash
mvn -q -DskipTests compile exec:java -Dexec.args="status --directory examples/basic-gradle-monorepo"
mvn -q -DskipTests compile exec:java -Dexec.args="plan --directory examples/basic-gradle-monorepo"

Gradle plan 会更新 gradle.properties,而不是 pom.xml。GitHub / GitLab release-plan 自动化会 stage gradle.propertiesCHANGELOG.md.changesets/

snapshots/ 目录里整理了预期生成结果:

快照文件展示内容
examples/basic-gradle-monorepo/snapshots/release-plan.json机器可读的发布元数据
examples/basic-gradle-monorepo/snapshots/release-plan.mdrelease PR 正文
examples/basic-gradle-monorepo/snapshots/CHANGELOG.after.md本次发布生成的 changelog 片段
examples/basic-gradle-monorepo/snapshots/gradle.properties.after发布后推进到下一个快照版本的根 version

实际发布 artifact 时继续交给 Gradle:

bash
RELEASE_VERSION="$(java -jar .javachanges/javachanges-1.12.2.jar manifest-field --directory examples/basic-gradle-monorepo --field releaseVersion --fresh true)"
cd examples/basic-gradle-monorepo
gradle publish -Pversion="$RELEASE_VERSION"

8. 如何改造成真实仓库

把这个示例复制到真实项目时,建议按这个顺序调整:

  1. 替换示例里的 groupId、artifactId 和模块路径
  2. .changesets/*.md 里的包名改成你的真实 Maven artifactId 或 Gradle project name
  3. 更新 env/release.env.example 里的仓库地址和认证信息
  4. 固定 CI 中要使用的 JAVACHANGES_VERSION
  5. 在真正开启自动发布前,先本地运行一次 statusplan

9. 相关阅读

需求文档
本地初始化和第一次生成 release planGetting Started
Gradle 仓库配置Gradle 使用指南
CLI 命令细节CLI Reference
生成的 manifest 字段说明Release Plan Manifest
GitHub Actions 完整配置GitHub Actions Usage Guide
GitLab CI/CD 完整配置GitLab CI/CD Usage Guide

基于 Apache-2.0 License 发布。