自动Tag与Changelog

# 介绍

我们假定一个项目的工作流是这样的:

从主分支 master 拉出版本分支,每当要发版本时,版本分支合并到 master 并在 master 上打 tag

此时我们希望能在 master 有代码提交时自动打 tag,自动生成 changelog 提交到 master。

当然实际的工作流可能不是这样,我们以此为例展示下如何用用多个插件实现该效果:

# 示例

# 设置git账号信息,供不同流水线复用
.git-set-credential: &git-set-credential
  name: set token
  image: tencentcom/git-set-credential:latest
  imports: https://xxx/env.yml
  settings:
    userName: coding
    userEmail: coding@coding.com
    loginUserName: coding
    loginPassword: $PRIVATE_TOKEN

# master有新代码时自动打tag
master:
  push:
    - ifModify:
        # CHANGELOG.md文件修改会跳过流水线执行,避免陷入循环提交
        - "!(CHANGELOG.md)"
      stages:
        - *git-set-credential
        # 打tag并提交
        - name: tag
          image: tencentcom/git-auto-tag:latest
          settings:
            tagFormat: v\${version}

# 有新tag时,自动生成changelog并提交到分支
v*:
  tag_push:
    - stages:
        # 生成changelog
        - name: changelog
          image: codingci/changelog
          settings:
            discard: true
        - name: show changelog
          script: cat CHANGELOG.md
        - *git-set-credential
        # 提交changelog到指定分支
        - name: commit changelog
          image: tencentcom/git-commit:latest
          settings:
            branchName: auto-tag-branch

# 创建 changelog 提交分支到master的mr
auto-tag-branch:
  push:
    - stages:
        - name: make mr
          image: codingci/make-mr:latest
          imports: https://codingcorp.cnb.codingcorp.net/p/folger-project/d/folger-test/git/tree/master/env.yml
          settings:
            token: $PRIVATE_TOKEN
            target: master
            title: changelog mr
            description: merge changelog to master

# 解读

以上示例用到了五个插件:

  • tencentcom/git-set-credential: 设置 git 相关账号信息,供后续提交代码用
  • tencentcom/git-auto-tag: 根据提交信息自动打 tag
  • codingci/changelog: 根据历史提交信息生成 changelog
  • tencentcom/git-commit: 将生成的 changelog 提交到分支 auto-tag-branch
  • codingci/make-mr: 创建分支 auto-tag-branch 到 master 的 mr

我们以时间为顺序说明下各流水线流程:

  1. master 有代码更新,触发执行 master push 流水线 A
    1. A 流水线设置 git 相关账号信息
    2. A 流水线自动打 tag(举例:tag 名 v1.3.0) 并推送到远端
  2. 有新的 tag,触发执行 v* 下 tag_push 流水线 B
    1. B 流水线生成 changelog
    2. B 流水线设置 git 相关账号信息
    3. B 流水线提交 changelog 文件到分支 auto-tag-branch
  3. auto-tag-branch 有代码更新,触发执行 auto-tag-branch 下 push 流水线 C
    1. C 流水线创建 auto-tag-branch 到 master 的 mr
    2. 此时可以手动合并 mr 或者用插件自动合并mr
  4. 此时 master 又有更新,但更新文件是 CHANGELOG.md,未命中 ifModify,跳过 push 流水线

此流水线稍有复杂,可根据情况灵活使用各插件达到想要的效果。