大家在使用gitlab的时候,有时候领导是不是想控制一下研发提交代码的日志啥的?比如说要按日志格式写,然而只是口头提要求的话,研发同学根本不care你,哪怕你提供了客户端的git hook模板给研发同学,他也不用!
那只能在服务器端卡住你了┑( ̄Д  ̄)┍
gitlab-ce版本没有推送规则设置,只好通过服务器端的server hooks来实现功能。
尽管gitlab官方文档有提供server hooks的文档,但是很多细节都没有说,再加上是英文文档,看起来有些蛋疼,所以自己在这里整理了一下:
官方文档地址:Server hooks | GitLab
本文使用的gitlab-ce版本为 15.0
1.全局的hook,配置脚本后gitlab系统上所有仓库都受影响,开关在配置文件gitlab.rb中(默认安装路径/etc/gitlab/gitlab.rb),找到下面这条
#gitaly['custom_hooks_dir'] = "/var/opt/gitlab/gitaly/custom_hooks"
去掉注释,配置自己的hook脚本存放路径。
2.配置单独仓库,只对单个仓库生效:
注意:按单个仓库配置的时候,必须也把全局设置中的gitlab.rb文件中的设置打开,指定的目录可以什么都不放,gitlab会自动跳过,也不会报错。
单个仓库配置就必须找到单个仓库实际地址,在仓库目录下加上custom_hooks文件夹,然后再添加hook脚本
如何找到仓库地址?
仓库实际地址就存放在/var/opt/gitlab/git-data/repositories里,老版本的gitlab是按群组和项目路径存储,一目了然。
但14.0之后gitlab的仓库实际存储地址都变成hash后地址了,只能在管理员界面去寻找路径。
如图,举个例子,在管理员界面下的test/1112.git仓库信息

然后在仓库目录下建custom_hooks目录
例如目录:/var/opt/gitlab/git-data/repositories/@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f99da3a666eec13ab35.git/custom_hooks目录
第一种方式:
在custom_hooks目录下可以建三个hook文件,名字必须是下面三个之一
pre-receive,update,post-receive
钩子的作用和入参区别具体解释在git官网: Git - Git 钩子 (git-scm.com)
这个钩子其实是属于git使用的范畴了,gitlab只是套了一层

一般来说只使用pre-receive的脚本就可以实现功能了
第二种方式:
custom_hooks目录下建这三个目录
pre-receive.d
update.d
post-receive.d
这样在这三个目录下放任意名字的脚本文件都会被执行
1.为啥我按目录放了,但是脚本就是不执行?
是liunx的权限问题,我是把权限直接都开了,没仔细做分辨
chmod 777 -R custom_hooks
chown -R git:git custom_hooks
chmod +x custom_hooks/pre-receive
2. 权限已经改了,单独仓库已经配置好了,但是脚本死活不生效?
那应该就是全局的设置没打开
hook脚本就得自己写了,可以使用shell,python,ruby等脚本语言,要在脚本文件中明确执行的脚本语言
Gitlab官方文档还提供了一些环境变量可以直接获取,看情况使用,会很方便。
两个hook脚本的例子:
https://fulizhe.blog.csdn.net/article/details/119994111?spm=1001.2014.3001.5502
https://github.com/git/git/blob/master/templates/hooks--update.sample
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述
我正在构建一个应用程序,想知道是否将未使用的对象设置为nil是生产级编码中的常见做法。我知道这只是垃圾收集器的提示,并不总是处理对象。 最佳答案 根据这个thread如果您使用完一个成员对象,将其设置为nil将引发被引用对象被垃圾回收。如果它是局部变量,方法exit将做同样的事情。也就是说,如果您要求将成员显式设置为nil,我会质疑您的设计。 关于ruby-将对象设置为nil是否很常见?,我们在StackOverflow上找到一个类似的问题: https://
我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不