如何使用极狐GitLab 代码推送规则,提高代码质量?
简述
极狐 GitLab 中的推送规则(Push Rules)是一种强制执行代码仓库规范和最佳实践的方法。推送规则解决了以下场景的痛点:
- 第三方需求管理工具集成:比如与Jira集成需要开发者提交代码时的commit message中携带
JIRA-ID
,通过推送规则的正则约束,可以有效的避免野生commit的存在,确保commit都是可追踪到Jira原始需求的。 - 代码质量和风格一致性:推送规则可以确保团队成员在提交代码时遵循统一的代码风格和质量标准。例如,您可以设置规则来要求提交信息遵循特定的格式,或者禁止提交包含某些关键字的代码。这有助于提高代码质量和可读性,降低维护成本。
- 防止敏感信息泄露:推送规则可以帮助您防止团队成员不小心将敏感信息(如密码、密钥等)提交到代码仓库。您可以设置规则来检查提交的内容,如果发现包含敏感信息,将阻止提交操作。这有助于保护项目的安全性。
- 确保分支策略:推送规则可以帮助您实施团队的分支策略。例如,您可以设置规则来限制只有特定用户或用户组才能向受保护的分支提交代码。这有助于确保项目的关键分支保持稳定和干净,便于管理和维护。
- 用户信息校验:对提交的用户进行多维度校验,避免不存在的用户推送代码到极狐GitLab中
图示:推送规则设置页
图示:分支名(branch name)的约束示例
图示:推送消息(commit message)的约束示例
详述
支持的配置层级
实例级
您可以为所有要继承的新项目创建推送规则,但可以在项目级别或群组级别覆盖它们。 配置全局推送规则后创建的所有项目都继承此配置。但是,必须使用覆盖每个项目的全局推送规则中描述的过程,手动更新每个现有项目。
实例级推送规则设置仅针对私有化部署场景,且配置人员需要管理员权限,配置方法:
- 在顶部栏上,选择 主菜单 > 管理员。
- 在左侧边栏上,选择 推送规则。
- 展开 推送规则。
- 设置您想要的规则。
- 选择 保存推送规则。
图示:实例级推送规则配置
群组级
群组级配置参数与实例级没有区别,只是配置位置不同。群组级配置位于:
- 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
- 在左侧边栏上,选择 设置 > 仓库。
- 展开 推送规则。
- 设置您想要的规则。
- 选择 保存推送规则。
项目级
项目级配置参数与实例级没有区别,只是配置位置不同。项目级配置位于:
- 在顶部栏上,选择 主菜单 > 项目 并找到您的项目。
- 在左侧边栏上,选择 设置 > 仓库。
- 展开 推送规则。
- 设置您想要的规则。
- 选择 保存推送规则。
推送规则详解
验证用户
- 拒绝未经验证的用户:用户必须有一个已确认的电子邮件地址。
- 提交作者的电子邮件:作者和提交者的电子邮件地址都必须与正则表达式匹配。要允许任何电子邮件地址,请留空。
- 检查提交作者是否是 GitLab 用户:提交作者和提交者必须具有经过极狐GitLab 验证的电子邮件地址。如果开启此选项,当用户的ssh公钥中包含的邮箱地址,如
some@email.com
并非GitLab用户时,会报错如下:
git.exe push --progress "origin" feature-issue7LEAPESC SYY 0523:feature-issue7LEAPESC SYY 0523
Counting objects: 6,done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4),done.
writing objects: 100% (6/6),537 bytes 537.00 KiB/s, done.Total 6 (delta 4), reused 3 (delta 2)remote: Gitlab: You cannot push commits for 'some@email.com'. You can only push commits if the committer email is
one of your own verified emails .
To 192.168.20.9:group esc/project leap/app all leap.git
[remote rejected feature-issue7LEAPESC ABB 0523 -》 feature-isue7LEAPESC ABB 0523 (pre-receive hook declined)
error: failed to push some refs to 'git@192.168.20.9:group esc/project leap/app all leap.git
git 未能顺利结束 (退出码 1) (2281 ms @ 223/5/24 1:29:19)
如果需要此问题,创建正确的ssh公钥添加到账户中即可。如果不开启此检查,可能会导致很多没有关联(关联行为是基于邮箱地址)到GitLab账户的野生提交存在,而且,仓库统计时,野生提交也不会被算在GitLab用户名下,这个设置就是为了避免这种情况。配置了合适的ssh公钥后,以后就不存在这种问题了。
验证提交消息
- 在提交消息中的需要表达式:消息必须与表达式匹配。要允许任何提交消息,请留空。使用多行模式,可以使用
(?-m)
禁用。例如,如果每个提交都应该引用 Jira 议题(例如Refactored css. Fixes JIRA-123.
),则正则表达式将是JIRA-\d+
。 - 提交消息中的拒绝表达式:提交消息不能与表达式匹配。要允许任何提交消息,请留空。使用多行模式,可以使用
(?-m)
禁用。
验证分支名称
要验证您的分支名称,请为分支名称输入正则表达式。 要允许任何分支名称,请留空。始终允许您的默认分支。出于安全目的,某些格式的分支名称默认受到限制。禁止使用 40 个十六进制字符的名称,类似于 Git 提交哈希。
一些验证示例如下:
- 必须以
feature
或者bugfix
开头。 (feature|bugfix)/.+
- 分支必须以
JIRA-
开头。 ^JIRA-
- 分支必须以
-JIRA
结尾。 -JIRA$
- 分支的长度必须在
4
到15
个字符之间,只接受小写字母、数字和破折号。 ^[a-z0-9-]{4,15}$
防止意外后果
- 不允许用户使用
git push
删除 Git 标签:用户不能使用git push
删除 Git 标签。用户仍然可以通过UI删除标签。
验证文件
- 防止推送秘钥文件:文件不得包含 secret。
- 绝不能将诸如凭证文件和 SSH 私钥之类的 secret 提交给版本控制系统。在极狐GitLab 中,您可以使用预定义的文件列表来阻止仓库中的这些文件。任何包含与列表匹配的文件的合并请求都将被阻止合并。 已提交到仓库的文件不受此推送规则的限制。 您必须使用覆盖每个项目的全局推送规则中描述的过程,更新现有项目的配置来使用该规则。
- 下面列出了此规则阻止的文件。有关标准的完整列表,请参阅
files_denylist.yml
。 - AWS CLI credential blobs:
.aws/credentials
aws/credentials
homefolder/aws/credentials
- 私有 RSA SSH 密钥:
/ssh/id_rsa
/.ssh/personal_rsa
/config/server_rsa
id_rsa
.id_rsa
- 私有 DSA SSH 密钥:
/ssh/id_dsa
/.ssh/personal_dsa
/config/server_dsa
id_dsa
.id_dsa
- 私有 ed25519 SSH 密钥:
/ssh/id_ed25519
/.ssh/personal_ed25519
/config/server_ed25519
id_ed25519
.id_ed25519
- 私有 ECDSA SSH 密钥:
/ssh/id_ecdsa
/.ssh/personal_ecdsa
/config/server_ecdsa
id_ecdsa
.id_ecdsa
- 任何以这些后缀结尾的文件:
*.pem
*.key
*.history
*_history
- 禁止的文件名:仓库中不存在的文件不得与正则表达式匹配。要允许所有文件名,请留空。请参阅常见示例。
- 在 Git 中,文件名既包括文件名,也包括文件名之前的所有目录。 当您执行
git push
命令时,推送中的每个文件名都会与禁止的文件名中的正则表达式进行比较。 - 您的禁止的文件名推送规则中的正则表达式可以包含多个要排除的独立匹配项。您可以将文件名广泛匹配到仓库中的任何位置,或仅在某些位置进行限制。文件名匹配也可以是部分的,并按扩展名排除文件类型。
- 这些示例使用 regex(正则表达式)字符串边界字符来匹配字符串的开头 (
^
) 和结尾 ($
),还包括目录路径或文件名可以包含.
或/
的实例。如果您想在匹配条件中将它们用作普通字符,则必须使用反斜杠 `` 对这两个特殊的正则表达式字符进行转义。 - 防止将
.exe
文件推送到仓库中的任何位置 - 此正则表达式匹配任何末尾包含.exe
的文件名:
.exe$
- 防止在仓库根目录中推送特定的配置文件:
^config.yml$
- 防止将特定配置文件推送到已知目录:
^directory-name/config.yml$
- 防止将特定文件推送到仓库中的任何位置,- 此示例测试任何名为 install.exe 的文件。带括号的表达式 (^|/) 匹配目录分隔符后面的文件或仓库根目录中的文件:
(^|/)install.exe$
- 将所有前面的表达式组合成一个表达式** - 前面的表达式依赖于字符串结尾字符
$
。我们可以将每个表达式的该部分移动到匹配条件分组集合的末尾,将其附加到所有匹配项:
(.exe|^config.yml|^directory-name/config.yml|(^|/)install.exe)$
- 最大文件大小:添加或更新的文件不得超过此文件大小(以 MB 为单位)。要允许任何大小的文件,请设置为
0
。Git LFS 跟踪的文件被豁免。