golang自动化Git仓库语义版本控制插件go-semver-release的使用

Golang自动化Git仓库语义版本控制插件go-semver-release的使用

概述

Go Semver Release是一个CLI程序,旨在通过分析Git仓库的格式化提交历史并为其标记正确的SemVer编号来自动化版本控制。

Go Semver Release Logo

主要特性

  • 🏷️ 通过带注释的Git标签自动为Git仓库进行语义版本控制
  • 🌐 本地或远程执行模式(本地模式无需秘密令牌)
  • 🌴 支持多个发布分支、预发布和构建元数据
  • 🗂️ 支持monorepo(即单个仓库中的多个项目,分别进行版本控制)
  • ⚙️ 自定义标签前缀
  • 📝 使用GPG签名标签

使用前提

要使用此工具,您需要:

  1. 一个初始化的Git仓库
  2. 一个发布分支(如main)
  3. 该分支上遵循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)
}

注意事项

  1. 该程序只能读取带注释的Git标签。如果需要手动向仓库添加SemVer标签,请确保它是带注释的,否则程序将无法检测到它。

  2. 提交消息必须遵循Conventional Commit规范,例如:

    • feat: 添加新功能
    • fix: 修复bug
    • BREAKING CHANGE: 重大变更
  3. 对于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

1 回复

更多关于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)规范的版本号。

主要功能

  1. 自动分析Git提交历史中的约定式提交(Conventional Commits)
  2. 根据提交类型自动确定版本号升级级别(major/minor/patch)
  3. 支持预发布版本和构建元数据
  4. 可集成到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):`,
}

最佳实践

  1. 在团队中统一提交消息格式
  2. 将版本生成集成到CI/CD流程中
  3. 对于主版本升级(breaking changes)要谨慎
  4. 使用预发布版本(pre-release)进行测试
  5. 考虑使用版本文件来持久化版本信息

go-semver-release通过自动化版本控制减少了人为错误,确保了版本号的语义一致性,是现代化Go项目版本管理的理想选择。

回到顶部