不需要再到 gitlab 创建 tag 了

132 阅读2分钟

Preface

目前在使用 Pycharm 社区版编程,每次提交代码到 gitlab 之后,还需要再到 gitlab 创建一个 tag,同时说明这个 tag 解决了哪些问题,或者提交了什么新的功能。其实在 commit&push 的时候已经写过一次了,而还需要再写一次,感觉很是麻烦。但是如果不写,下次代码出问题都不知道回滚到哪个版本。为了解决这个问题,决定自动化 tag 创建这一部分,至少半自动化也行。

idea

具体的想法就是将commit message按照一定的规则书写。在 push后获取最后一个push的 message,然后从这个 message中按照规则提取tagnametag message。创建一个tag推送到远程即可。

Plan

CI/CD

一开始想到了 gitlab 的 CI/CD 的功能,折腾了半天,后面发现自己权限不够,根本没法运行 Runner,所以就放弃了这个办法。

git hooks

后面又看到了 git 本身的 hook 脚本,这个是在 .git/hooks 目录下面有一些自动化脚本,比如: commit-msg等之类的脚本。这些脚本没有一个 post-push 的脚本,当然也可以自己创建一个,但是自己创建的并不会在 pycharm的 commit&push 后触发。

makefile

最后想着要不就退一步,写一个 makefile,在这个 makefile 中提取最后一次提交的commit,然后按照规则提取 tag nametag message,最后再创建这个tag后推送的远程。这样每次在 push代码之后,执行一下 make tag也还好

achieve

create template

首先是要创建一个 commit template,这样可以在模版中指定规则,之后提交时,只需要填写必要的信息就好了。具体的模版如下:

TAG:v-0.0.1.1
ReleaseNote:
[feature]
1.xxx
2.xxx
[bug]
1.xxx
2.xxx

要想每次打开 commit 都能显示这个模版,还需要做一些配置。首先,创建一个~/.gitmessage将上面的模型信息添加进去。 接着打开 ~/.gitconfig配置,在这个配置的最下面添加如下信息:

[commit]
template=~/.gitmessage

这样下次打开pycharmcommit就会出现上面的模版了。

makefile

接着就是在 makefile 实现提取 tag_name, tag_message的代码了,具体如下:

tag:
    @echo "获取最新 commit message..."
    @msg=$$(git log -1 --pretty=%B); \
    tag_name=$$(echo $$msg | sed -n 's/.*TAG:([A-Za-z0-9._-]+).*/\1/p'); \
    if [ -z "$$tag_name" ]; then \
       echo "未找到 TAG:xxx,跳过"; \
    else \
        tag_msg=$$(echo "$$msg" | sed 's/TAG:[A-Za-z0-9._-]+//'); \
       if git rev-parse $$tag_name >/dev/null 2>&1; then \
          echo "本地已存在 tag $$tag_name,直接推送到远程"; \
          git push origin $$tag_name; \
       else \
          echo "创建并推送 tag: $$tag_name"; \
          git tag -a $$tag_name -m "$$msg"; \
          git push origin $$tag_name; \
       fi \
    fi

上面的代码会先解析获取tag name,解析之后会先查看本地是否有该tag name,如果存在就直接push到远程,如果没有就会创建一个 tag,然后再推送到远程。要注意的是,在 tag_message中会过滤掉 tag_name