语境: 我经常使用 git 和 gitlab,我们使用 gitlab-CI 来执行检查。
效果很好。对于 Python 项目来说,其中一个步骤是执行编码风格检查。
- 检查没有制表符
- 检查行尾是否全部为 unix 格式,而不是 dos/mac 格式
- 执行 flake8 检查
问题: 用空格替换制表符以及将 dos 行尾转换为 unix 行尾是相当愚蠢的任务,但可以轻松实现自动化。
我想知道的是。 有没有什么方法可以让 gitlab(在推送之后或至少对于任何合并请求)不仅检查制表符/行尾是否正确,而且如果需要还可以修改文件并在给定的分支/MR 上创建新的提交?
那么有没有办法创建一个 CI 步骤来更新分支?gitlab 上还有其他自动化步骤挂钩可以执行所需的任务吗?
我知道,这可以在客户端使用预提交钩子或类似方法完成,但我不能保证所有开发人员都安装了钩子,特别是他们的钩子是最新的,并且他们的环境具有执行这些脚本的所有依赖项。
因此我正在寻找服务器端解决方案
答案1
这是可以做到的。默认情况下,GitLab 的 CI 令牌是只读的,因此您必须将具有适当权限的用户的令牌添加到机密存储中并使用该令牌。您可以使用以下命令从环境中使用任意令牌:
git -c credential.helper='!f(){echo username=$USERNAME; echo password=$TOKEN;};f' \
push origin
然而,这通常不是推荐的做法。通常的做法是让您的 CI 系统检查但不修复它,然后提供一个易于使用的脚本来修复所有这些问题。如果您的开发人员习惯于编写合理、合乎逻辑的提交,他们不会喜欢将修复提交放在顶部。此外,将提交推送到分支将启动另一项 CI 作业,这意味着如果您无法达到稳定状态,您将启动无休止的 CI 作业。
修复行尾和制表符的脚本非常简单(假设没有人使用旧版 Mac OS 9 CR 行尾并且没有二进制文件):
#!/bin/sh
git ls-files | xargs perl -pi -e 's/\t/ /g; s/\r//g;'
任何具有完整 Git 实现的系统必然会配备 Perl,并且不需要额外的命令。
由于flake8
目前没有提供自动修复选项,因此无论如何您都必须让开发人员手动修复这些错误。