golang自动化Git仓库语义版本控制插件go-semver-release的使用
Golang自动化Git仓库语义版本控制插件go-semver-release的使用
概述
Go Semver Release是一个CLI程序,旨在通过分析Git仓库的格式化提交历史并为其标记正确的SemVer编号来自动化版本控制。
主要特性
- 🏷️ 通过带注释的Git标签自动为Git仓库进行语义版本控制
- 🌐 本地或远程执行模式(本地模式无需秘密令牌)
- 🌴 支持多个发布分支、预发布和构建元数据
- 🗂️ 支持monorepo(即单个仓库中的多个项目,分别进行版本控制)
- ⚙️ 自定义标签前缀
- 📝 使用GPG签名标签
使用前提
要使用此工具,您需要:
- 一个初始化的Git仓库
- 一个发布分支(如
main
) - 该分支上遵循Conventional Commit规范的格式化提交历史
安装
# 使用go install安装
go install github.com/s0ders/go-semver-release/v6@latest
快速开始示例
package main
import (
"fmt"
"github.com/s0ders/go-semver-release/v6/pkg/semver"
)
func main() {
// 初始化配置
config := semver.Config{
RepositoryPath: ".", // 当前目录
Branch: "main", // 主分支
Prefix: "v", // 版本前缀
}
// 创建版本发布器
releaser, err := semver.NewReleaser(config)
if err != nil {
panic(fmt.Errorf("failed to create releaser: %w", err))
}
// 计算并发布新版本
version, err := releaser.Release()
if err != nil {
panic(fmt.Errorf("failed to release: %w", err))
}
fmt.Printf("Successfully released version: %s\n", version)
}
完整工作流示例
package main
import (
"fmt"
"log"
"os"
"github.com/s0ders/go-semver-release/v6/pkg/semver"
)
func main() {
// 1. 检查是否是Git仓库
if _, err := os.Stat(".git"); os.IsNotExist(err) {
log.Fatal("当前目录不是Git仓库")
}
// 2. 配置版本发布器
cfg := semver.Config{
RepositoryPath: ".",
Branch: "main",
Prefix: "v",
PreRelease: "", // 预发布标识(如"beta")
BuildMetadata: "", // 构建元数据
Sign: false, // 是否签名标签
Push: true, // 是否推送标签
}
// 3. 创建发布器实例
releaser, err := semver.NewReleaser(cfg)
if err != nil {
log.Fatalf("创建发布器失败: %v", err)
}
// 4. 执行版本发布
newVersion, err := releaser.Release()
if err != nil {
log.Fatalf("发布版本失败: %v", err)
}
// 5. 输出新版本
fmt.Printf("新版本已发布: %s\n", newVersion)
// 可选: 在CI/CD环境中输出版本供后续步骤使用
fmt.Printf("::set-output name=version::%s\n", newVersion)
}
注意事项
-
该程序只能读取带注释的Git标签。如果需要手动向仓库添加SemVer标签,请确保它是带注释的,否则程序将无法检测到它。
-
提交消息必须遵循Conventional Commit规范,例如:
feat: 添加新功能
fix: 修复bug
BREAKING CHANGE: 重大变更
-
对于monorepo项目,可以为每个子项目配置不同的前缀:
cfg := semver.Config{ RepositoryPath: ".", Branch: "main", Prefix: "pkg1/v", // 子项目1的前缀 }
与CI/CD集成示例
以下是一个GitHub Actions工作流示例,展示如何将go-semver-release集成到CI/CD流程中:
name: Release
on:
push:
branches: [ main ]
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Install Go
uses: actions/setup-go@v3
with:
go-version: '1.20'
- name: Install go-semver-release
run: go install github.com/s0ders/go-semver-release/v6@latest
- name: Release version
run: |
version=$(go-semver-release --branch main --prefix v)
echo "New version: $version"
echo "VERSION=$version" >> $GITHUB_ENV
输出格式
go-semver-release支持多种输出格式,可以通过--output
参数指定:
# JSON格式输出
go-semver-release --output json
# YAML格式输出
go-semver-release --output yaml
# 纯文本格式(默认)
go-semver-release --output text
JSON输出示例:
{
"version": "v1.2.3",
"major": 1,
"minor": 2,
"patch": 3,
"prerelease": "",
"metadata": ""
}
希望这个指南能帮助您开始使用go-semver-release自动化您的Git仓库版本控制!
更多关于golang自动化Git仓库语义版本控制插件go-semver-release的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang自动化Git仓库语义版本控制插件go-semver-release的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go-Semver-Release: Golang自动化Git仓库语义版本控制插件
go-semver-release
是一个用于自动化Git仓库语义版本控制的Golang插件,它可以根据Git提交历史自动生成符合语义化版本(SemVer)规范的版本号。
主要功能
- 自动分析Git提交历史中的约定式提交(Conventional Commits)
- 根据提交类型自动确定版本号升级级别(major/minor/patch)
- 支持预发布版本和构建元数据
- 可集成到CI/CD流程中
安装
go get github.com/go-semver-release/go-semver-release
基本使用示例
package main
import (
"fmt"
"os"
semver "github.com/go-semver-release/go-semver-release"
)
func main() {
// 初始化配置
config := semver.Config{
RepoPath: ".", // 当前目录
PreRelease: "", // 预发布标识,如"beta", "rc"等
BuildMetadata: "", // 构建元数据
TagPrefix: "v", // 版本标签前缀
}
// 创建版本生成器
generator, err := semver.NewGenerator(config)
if err != nil {
fmt.Printf("初始化失败: %v\n", err)
os.Exit(1)
}
// 生成新版本
newVersion, err := generator.Generate()
if err != nil {
fmt.Printf("生成版本失败: %v\n", err)
os.Exit(1)
}
fmt.Printf("新版本: %s\n", newVersion)
}
高级配置
// 更详细的配置示例
config := semver.Config{
RepoPath: "/path/to/repo",
PreRelease: "beta", // 生成类似1.2.3-beta.1的版本
BuildMetadata: "20230315", // 生成类似1.2.3+20230315的版本
TagPrefix: "v",
VersionFile: "VERSION", // 版本文件路径
CommitPattern: `^(?P<type>\w+)(?:\((?P<scope>[\w\-]+)\))?:\s(?P<message>.+)`, // 自定义提交模式
MajorPattern: `^(breaking|major):`, // 触发主版本升级的提交类型
MinorPattern: `^(feat|feature):`, // 触发次版本升级的提交类型
PatchPattern: `^(fix|bugfix):`, // 触发修订版本升级的提交类型
}
CI/CD集成示例
以下是一个在GitHub Actions中使用go-semver-release
的示例:
name: Release
on:
push:
branches:
- main
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: '1.20'
- name: Install go-semver-release
run: go install github.com/go-semver-release/go-semver-release@latest
- name: Generate new version
id: version
run: |
NEW_VERSION=$(go-semver-release --repo-path . --tag-prefix v)
echo "New version: $NEW_VERSION"
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
- name: Create Git tag
uses: actions/github-script@v5
with:
script: |
github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `refs/tags/v${{ steps.version.outputs.new_version }}`,
sha: context.sha
})
命令行使用
go-semver-release
也提供了命令行工具:
# 基本用法
go-semver-release --repo-path /path/to/repo
# 带预发布版本
go-semver-release --pre-release beta
# 带构建元数据
go-semver-release --build-metadata $(date +%Y%m%d)
# 输出JSON格式
go-semver-release --output json
自定义提交约定
默认情况下,go-semver-release
遵循约定式提交规范,但你可以自定义:
config := semver.Config{
// 自定义提交模式
CommitPattern: `^(?P<type>\w+)(?:\((?P<scope>[\w\-]+)\))?:\s(?P<message>.+)`,
// 自定义哪些提交类型触发主版本升级
MajorPattern: `^(breaking|major|api):`,
// 自定义哪些提交类型触发次版本升级
MinorPattern: `^(feat|feature|enhancement):`,
// 自定义哪些提交类型触发修订版本升级
PatchPattern: `^(fix|bugfix|docs|style|refactor|perf|test|chore):`,
}
最佳实践
- 在团队中统一提交消息格式
- 将版本生成集成到CI/CD流程中
- 对于主版本升级(breaking changes)要谨慎
- 使用预发布版本(pre-release)进行测试
- 考虑使用版本文件来持久化版本信息
go-semver-release
通过自动化版本控制减少了人为错误,确保了版本号的语义一致性,是现代化Go项目版本管理的理想选择。