如何使用 post-receive 钩子设置 Gitlab?

如何使用 post-receive 钩子设置 Gitlab?

我在一台服务器上使用 Gitlab,并希望在提交主分支时将我的 git 存储库推送到另一台网络服务器。因此,当我推送网站的新版本时,生产服务器会更新。我知道这应该可以通过 gitlab 中的钩子来实现,但我找不到具体方法。尝试了以下指南http://danielmiessler.com/study/git/#website但它不是为与 gitlab 一起使用而编写的,所以我缺少一些部分。

我需要在生产网络服务器上做什么,然后我应该将钩子 URL 设置为何值?

答案1

gitlab 已经在内部使用了 post-receive 钩子。您可以摆弄该脚本并调用您的钩子,但从文档来看,“官方”方式似乎是使用“web-hooks”,即让 gitlab 在 post-receive 上调用您的 Web 服务器,然后您的 Web 服务器提取存储库。我自己还没有尝试过,但由于到目前为止还没有人回答,所以我想向您指出这个方向:

要启用 web-hook,请进入项目主页并从主菜单下方的右上角选择 hooks。(http://yourgitlab.example.net/你的项目/hooks)。该页面有一个示例和文档链接(http://yourgitlab.example.net/help/web_hooks)。

编辑://

我今天早上试过了。这是一个 php 脚本示例。它假设您已经克隆了 repo,并且 web 服务器已设置了所有必要的权限/ssh 密钥。

<?php
$mirrordir='/srv/http/gitlabhooktest/gitmirror';
$gitdir=$mirrordir."/.git";

$json= file_get_contents('php://input');
#error_log($json);
$jsarr=json_decode($json,true);
#error_log(print_r($jsarr,true));
$branch=$jsarr["ref"];
if($branch=='refs/heads/master'){
 $cmd="git --work-tree=$mirrordir --git-dir=$gitdir pull";
 #error_log($cmd);
 exec($cmd);
} 

答案2

自定义钩子是最近添加的(因为正如 Gryphius 所说,常规钩子在内部使用):https://github.com/gitlabhq/gitlabhq/blob/667c0a909bde1cf71f21d8ec9768e98b1c489030/doc/hooks/custom_hooks.md

您只需custom_hooks在裸 Git 存储库中创建一个目录,并将钩子放入其中,然后 GitLab 确保它们运行。

答案3

Gitlab 没有 post-receive 钩子,因为开发人员用 gitlab-shell 替换 gitolite

因此您可以:

sudo -u git bash
touch /home/git/repositories/<repository name>.git/hooks/post-receive
vim /home/git/repositories/<repository name>.git/hooks/post-receive

确保 git 用户具有运行此文件中的命令所需的所有权限

相关内容