前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在Gitlab中规范提交的commit message的格式

在Gitlab中规范提交的commit message的格式

作者头像
没有故事的陈师傅
发布于 2023-05-01 07:46:49
发布于 2023-05-01 07:46:49
3.5K00
代码可运行
举报
文章被收录于专栏:运维开发故事运维开发故事
运行总次数:0
代码可运行

我们有时候会遇到开发提交的千奇百怪的commit信息,这样给代码更新追踪溯源增加了麻烦,并且我们使用的gitlab ci 会使用commit信息判断构建步骤,所以有必要为GitLab 增加自定义 Commit 提交格式检测

介绍

Git 支持在不同操作上执行的钩子。这些钩子在服务器上运行,可用于根据存储库的状态强制执行特定的提交策略或执行其他任务。

Git 支持以下钩子:

  • pre-receive
  • post-receive
  • update

服务器端 Git 钩子可以配置为:

  • 单个存储库。
  • 所有存储库。

这里需要注意服务器端的git钩子必须在 GitLab 服务器的文件系统上配置.

创建服务端git钩子

如果您没有使用 hashed storage,,则项目的存储库目录则应该是下面:

  • 对于从源安装,路径通常是 /home/git/repositories/<group>/<project>.git.
  • 对于 Omnibus GitLab 安装,路径通常是 /var/opt/gitlab/git-data/repositories/<group>/<project>.git.

这里我们是rpm安装的gitlab,默认是使用了hashed storage,要先去查找项目的哈希路径,我们需要用如下方式为git仓库设置服务端git钩子:

  1. 在顶部栏上,选择管理中心
  2. 在左侧边栏上,选择“**概览”>“项目”**并选择项目。

image-20210809170728289

  1. 选择要添加服务器git钩子的项目,在出现的页面上找到Gitaly 相对路径

image-20210809170835766

  1. 项目的目录就在**/var/opt/gitlab/git-data/repositories/gitaly相对路径** 下,在该目录下创建一个名为custom_hooks的目录
  2. 在新custom_hooks目录中,创建一个名称与钩子类型匹配的文件。例如,对于预接收钩子,文件名应该pre-receive,没有扩展名且pre-receive文件要有可执行权限并将属主属组设置为 git

在进行 push 操作时,GitLab 会调用这个钩子文件,并且从 stdin 输入三个参数,分别为 之前的版本 commit ID、push 的版本 commit ID 和 push 的分支;根据 commit ID 我们就可以很轻松的获取到提交信息,从而实现进一步检测动作;根据 GitLab 的文档说明,当这个 hook 执行后以非 0 状态退出则认为执行失败,从而拒绝 push;同时会将 stderr 信息返回给 client 端;

我们下面创建一个pre-receive,只允许包含build=(yes|no) deploy=(yes|no)的commit message 提交

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "os/exec"
    "regexp"
    "strings"
)

type CommitType string

const CommitMessagePattern = `(.*build=(yes|no).*deploy=(yes|no).*)|^Merge\ branch(.*)`

const checkFailedMeassge = `GL-HOOK-ERR:##############################################################################
GL-HOOK-ERR:##                                                                          
GL-HOOK-ERR: Commit message 格式检查失败!                                       
GL-HOOK-ERR:                                                                          
GL-HOOK-ERR: Commit message 格式应符合下面的正则表达式:                          
GL-HOOK-ERR:   (.*build=(yes|no).*deploy=(yes|no).*)|^Merge\ branch(.*)
GL-HOOK-ERR:##                                                                          
GL-HOOK-ERR: Commit message Example:                                                                 
GL-HOOK-ERR:   Update date.html build=no,deploy=yes                                   
GL-HOOK-ERR:##                                                                          
GL-HOOK-ERR:##############################################################################`

// 是否开启严格模式,严格模式下将校验所有的提交信息格式(多 commit 下)
const strictMode = false

var commitMsgReg = regexp.MustCompile(CommitMessagePattern)

func main() {

    input, _ := ioutil.ReadAll(os.Stdin)
    param := strings.Fields(string(input))

    // allow branch/tag delete
    if param[1] == "0000000000000000000000000000000000000000" {
        os.Exit(0)
    }

    commitMsg := getCommitMsg(param[0], param[1])
    for _, tmpStr := range commitMsg {
        commitTypes := commitMsgReg.FindAllStringSubmatch(tmpStr, -1)

        if len(commitTypes) != 1 {
            checkFailed()
        } else {
           fmt.Println(" ")
        }
        if !strictMode {
            os.Exit(0)
        }
    }

}

func getCommitMsg(odlCommitID, commitID string) []string {
    getCommitMsgCmd := exec.Command("git", "log", odlCommitID+".."+commitID, "--pretty=format:%s")
    getCommitMsgCmd.Stdin = os.Stdin
    getCommitMsgCmd.Stderr = os.Stderr
    b, err := getCommitMsgCmd.Output()
    if err != nil {
        fmt.Print(err)
        os.Exit(1)
    }

    commitMsg := strings.Split(string(b), "\n")
    return commitMsg
}

func checkFailed() {
    fmt.Fprintln(os.Stderr, checkFailedMeassge)
    os.Exit(1)
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@node-02 ~]# cd /var/opt/gitlab/git-data/repositories/
[root@node-02 repositories]# cd @hashed/2c/62/2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3.git
[root@node-02 ~]#  mkdir custom_hooks/ 
[root@node-02 ~]# chowm git:gitcustom_hooks
[root@node-02 2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3.git]# cd custom_hooks/
[root@node-02 custom_hooks]# mv /root/pre-receive ./
[root@node-02 custom_hooks]# ls
pre-receive
[root@node-02 custom_hooks]# chmod +x pre-receive 
[root@node-02 custom_hooks]# chowm git:git pre-receive 

这里我们验证一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@node-02 ~]# git clone https://gitlab.lishuai.fun/argocd/argocd-demo.git
正克隆到 'argocd-demo'...
Username for 'https://gitlab.lishuai.fun': lishuai              
Password for 'https://lishuai@gitlab.lishuai.fun': 
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 82 (delta 0), reused 0 (delta 0), pack-reused 79
Unpacking objects: 100% (82/82), done.
[root@node-02 ~]# cd argocd-demo/
[root@node-02 argocd-demo]# date>date.html
[root@node-02 argocd-demo]# git add date.html
[root@node-02 argocd-demo]# git commit -m "update date.html"
[master 1befbd0] update date.html
 1 file changed, 1 insertion(+)
 create mode 100644 date.html
[root@node-02 argocd-demo]# git push  origin master 
Username for 'https://gitlab.lishuai.fun': lishuai
Password for 'https://lishuai@gitlab.lishuai.fun': 
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 317 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: GL-HOOK-ERR:##############################################################################
remote: GL-HOOK-ERR:##                                                                          
remote: GL-HOOK-ERR: Commit message 格式检查失败!                                       
remote: GL-HOOK-ERR:                                                                          
remote: GL-HOOK-ERR: Commit message 格式应符合下面的正则表达式:                          
remote: GL-HOOK-ERR:   (.*build=(yes|no).*deploy=(yes|no).*)|^Merge\ branch(.*)
remote: GL-HOOK-ERR:##                                                                          
remote: GL-HOOK-ERR: Commit message Example:                                                                 
remote: GL-HOOK-ERR:   Update date.html build=no,deploy=yes                                   
remote: GL-HOOK-ERR:##                                                                          
remote: GL-HOOK-ERR:##############################################################################
To https://gitlab.lishuai.fun/argocd/argocd-demo.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: 无法推送一些引用到 'https://gitlab.lishuai.fun/argocd/argocd-demo.git'

这里我们看到我们提交的commit信息不符合要求,push时候被拒绝了,而如下,我们使用正确的commit信息就能正常push

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##修改我们当前提交的commit信息
[root@node-02 argocd-demo]# git commit  --amend
[master 9af865e] update date.html [build=no,deploy=no]
 1 file changed, 1 insertion(+), 5 deletions(-)
##查看修改后的commit 信息,此时已经是 update date.html [build=no,deploy=no]
[root@node-02 argocd-demo]# git log
commit 9af865ee888513229cf7a6959e9afb2e654b35cb
Author: lishuai <lishuai@liangla.mobi>
Date:   Thu Sep 9 16:23:34 2021 +0800

    update date.html [build=no,deploy=no]
[root@node-02 argocd-demo]# git push  origin master 
Username for 'https://gitlab.lishuai.fun': lishuai
Password for 'https://lishuai@gitlab.lishuai.fun': 
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 345 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:  
To https://gitlab.lishuai.fun/argocd/argocd-demo.git
   237a1df..9af865e  master -> master

pre-receive代码里不匹配发送的消息中我们使用GL-HOOK-ERR这个参数是为了可以在gitlab ui生成消息

image-20210909163113334

创建全局钩子

要创建适用于实例中所有存储库的 Git 挂钩,请设置全局服务器挂钩。默认的全局服务器端钩子目录在 GitLab Shell 目录中。在那里添加的任何钩子都适用于所有存储库。

全局服务器钩子目录:

  • 对于从源安装通常是/home/git/gitlab-shell/hooks.
  • 对于 Omnibus GitLab 安装通常是/opt/gitlab/embedded/service/gitlab-shell/hooks.

要为全局服务器挂钩使用不同的目录,请custom_hooks_dir在 Gitaly 配置中设置:

  • 对于 Omnibus 安装,这在gitlab.rb.
  • 对于源安装,配置位置取决于 GitLab 版本。为了:
    • GitLab 13.0 及更早版本,这是在gitlab-shell/config.yml.
    • GitLab 13.1 及更高版本,gitaly/config.toml[hooks]部分下设置。

按照以下步骤为所有存储库设置全局服务器钩子:

  1. 在 GitLab 服务器上,进入到的全局服务器钩子目录。
  2. 在此位置创建一个新目录。取决于钩的类型,它可以是一个 pre-receive.dpost-receive.dupdate.d目录。
  3. 在这个新目录中,添加您的钩子。
  4. 确保钩子文件可执行并且用户为git。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发故事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Git hooks与自动化部署
好的 commit message 是至关重要的,如果随意编写 log,带来的后果可小可大,但是无论大小都影响了开发的效率和回朔的难度,所以有必要进行 log 规范化检查。
周陆军博客
2023/06/06
9810
化繁为简的企业级 Git 管理实战(二):多分支子模块持续集成
在本篇文章中,我仔细讨论了对子模块进行持续集成的三种方案,并利用自动化手段实现逐层往上提交子模块 commit id 从而触发主工程构建。这些构建结果为我们快速定位工程的编译问题提供了重要的线索。 需求描述 在 上一篇文章 中,我简单描述了我们一个项目的复杂程度:子模块、嵌套子模块、多分支。除了工程分支切换上的复杂,我们还遇到另一个问题:子模块持续集成。 主工程持续集成 先说说主工程如何做持续集成。我们使用 Gitlab 自带的 Gitlab-Ci 作为我们的持续集成系统。Android 端的主工程的持续
HaHack
2018/07/03
1.8K0
Semgrep结合GitLab实现代码审计实践-服务端
前段时间在做代码审计,发现很多项目都存在安全隐患,大多数是来自于参数未过滤所造成的;为了解决这个问题,我将Web安全开发规范手册V1.0进行了培训,但是效果并不是太理想,原因是培训后开发者的关注点主要在功能完成度上,安全编码对于他们来说并不是核心指标;
汤青松
2022/03/23
9260
Semgrep结合GitLab实现代码审计实践-服务端
GitLab初体验
最近由于工作需要,开始设计和实现一些新的运维工具,打算使用git替代svn来管理代码,尝试一些不同的技术。
bisal
2019/01/29
7490
gitlab-ci的简易入门—基于python项目的CI演示
使用github上开源的一个python的demo项目,地址为:https://github.com/imooc-course/docker-cloud-flask-demo 打开自己的gitlab,点击New project,把项目导入。
没有故事的陈师傅
2020/07/01
3.8K0
gitlab-ci的简易入门—基于python项目的CI演示
Gitlab安装使用及汉化配置
一、GitLab简介 GitHub是2008年由Ruby on Rails编写而成,与业界闻名的Github类似;但要将代码上传到GitHub上面,而且将项目设为私有还要收费。GitLab 是一个用于
shaonbean
2018/01/02
6.4K0
持续集成之GitLab触发Jenkins构建项目
一:目的为在公司的测试环境当中一旦开发向GitLab仓库提交成功代码,GitLab通知Jenkins进行构建项目、代码质量测试然后部署至测试环境,注意这只是测试环境,而生产环境依然需要手动部署代码:
星哥玩云
2022/07/24
7380
持续集成之GitLab触发Jenkins构建项目
Jenkins+Gitlab持续集成简介
持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并进程自动化测试
菲宇
2019/06/11
1.9K0
Jenkins+Gitlab持续集成简介
GitLab的部署、代码克隆和提交、数据备份等
1.配置网卡及Ubuntu仓库源 1)配置网卡eth0,本地内网网卡无需指定网关和域名服务器 network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.1.30/24] 2)配置网卡eth1,要保持以下两个字节的严格缩进,否则会导致网卡起不来 root@ubuntu1804:~# vim /etc/netpl
星哥玩云
2022/07/27
9610
GitLab的部署、代码克隆和提交、数据备份等
Gitlab的基本使用与备份恢复升级
 使用http方式推送代码每次都需要输入账号密码,所以推荐使用ssh方式推送代码,在Gitlab中添加ssh-key的方式就可以了!
非著名运维
2022/06/22
6470
Gitlab的基本使用与备份恢复升级
K8S容器环境下GitLab-CI和GItLab Runner 部署记录
注意:本示例部署所涉及到的image镜像均导入到Harbor私有私仓(172.16.60.230) 。
洗尽了浮华
2021/04/01
7.6K0
K8S容器环境下GitLab-CI和GItLab Runner 部署记录
Git详解及 github与gitlab使用
惨绿少年
2017/12/27
3.2K1
Git详解及 github与gitlab使用
Jenkins+Gitlab+Nginx实现自动发布与回退基于tag版本的静态项目(解决重复构建问题)
 因为我们需要依托jenkins将gitlab上的项目获取至本地,为后续网站的的代码发布工作做好准备。
非著名运维
2022/06/22
2.1K0
Jenkins+Gitlab+Nginx实现自动发布与回退基于tag版本的静态项目(解决重复构建问题)
git hook实践心得
优秀的团队必不可缺少源代码的质量管理,比如eslint、sasslint等代码检测工具,借助git hook能力,我们可以将这些工具无缝地整合到git开发工作流中。
IMWeb前端团队
2019/12/03
1.2K0
git hook实践心得
自动化发布-GitLab WEB Hooks 配置
钩子(hooks) Git是在特定事件发生之前或之后执行特定脚本代码功能(从概念上类比,就与监听事件、触发器之类的东西类似)。 Git Hooks就是那些在Git执行特定事件(如commit、push、receive等)后触发运行的脚本。 gitlab的web hooks跟git hook类似。也是当项目发生提交代码、提交tag等动作会自动去调用url,这个url可以是更新代码,或者其他操作。 配置目的 由于系统属于后台接口系统,开发提交完git仓库后要实时的部署到测试环境,这时候就需要用到gitlab的w
小小科
2018/05/03
2.2K0
自动化发布-GitLab WEB Hooks 配置
CentOS 7下版本管理 GitLab 的安装及管理
GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。
星哥玩云
2022/07/19
9460
CentOS 7下版本管理 GitLab 的安装及管理
Gitlab备份和恢复操作记录
前面已经介绍了Gitlab环境部署记录,这里简单说下Gitlab的备份和恢复操作记录: 1)Gitlab的备份目录路径设置 [root@code-server ~]# vim /etc/gitlab/gitlab.rb gitlab_rails['manage_backup_path'] = true gitlab_rails['backup_path'] = "/data/gitlab/backups" //gitlab备份目录 gitlab_rails['backup_archive_permis
洗尽了浮华
2018/01/23
1.7K0
使用Git与GitHub协同开发并搭建私有GitLab代码托管服务器
Linus在1991年创建了开源的Linux,从此全世界的工程师参与了Linux的开发,期初Linus是通过手动diff的方式进行代码审核和合并的,后来BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!如果当时BitMover公司专门为Linux发布一个社区版,也许这家公司也就名垂青史了,可是当时这家公司思想境界没那么高而且Linus也那么牛!
星哥玩云
2022/07/24
1.6K0
使用Git与GitHub协同开发并搭建私有GitLab代码托管服务器
Git提交之后自动打版本并钉钉通知
post-receive是在提交代码到服务器之后自动执行 然后进入/www/wwwroot/hook.com/git/test.git/hooks
OwenZhang
2021/12/08
4260
Git提交之后自动打版本并钉钉通知
​gitlab+jenkins打造ceph的rpm自动编译
需要添加的插件:Gitlab Hook、Build Authorization Token Root、Gitlab Authentication、Gitlab
用户1260683
2019/05/09
1.1K0
​gitlab+jenkins打造ceph的rpm自动编译
相关推荐
Git hooks与自动化部署
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验