Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

I am using Gitlab on one server and would like to push my git repository on commit of the master branch to another webserver. So when I push a new version of the website the production server gets updated. I know this should be possible with hooks inside gitlab but I am unable to find how exactly. Tried the following guide http://danielmiessler.com/study/git/#website but it is not written for use with gitlab so Im missing parts.

What do I need to do on the production webserver and what do I set the hook URL to then?

share|improve this question
    
you can use the regular git hooks, if you have root access to the git server, see post-commit hook here: git-scm.com/book/en/v2/Customizing-Git-Git-Hooks –  Doka Nov 9 at 13:27
    
You can try Custom Git hooks. –  monsta 2 days ago

4 Answers 4

gitlab already uses the post-receive hook internally. you could fiddle around with that script and call your hook as well, but from the docs it looks like the "official" way would be to use "web-hooks", i.e. let gitlab call your webserver on post-receive and your webserver then pulls the repository. I haven't tried this myself, but since no one answered so far I thought I'd point you in that direction:

to enable web-hooks go into your project's main page and select hooks from the top right, below the main menu. ( http://yourgitlab.example.net/yourproject/hooks ). there is an example&docs linked from that page ( http://yourgitlab.example.net/help/web_hooks ).

edit://

I tried it this morning. Here is a php script example. It assumes the you have already cloned the repo and the webserver has all the necessary permissions/ssh keys set up.

<?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);
} 
share|improve this answer
    
yes I know where to find the hooks page. I just don't know how the file should look like gitlab should post to. –  Tristan van Bokkem Jan 6 '13 at 21:51
1  
see edited answer, I added an example script. may not be perfect but at least a quick test seems to work –  Gryphius Jan 7 '13 at 8:04

Gitlab doesn't have a post-receive hook since the developers replaced gitolite with gitlab-shell.

Therefore you can:

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

Make sure the git user has all the permissions needed to run the commands in this file

share|improve this answer
    
hook folder already exist: hooks -> /opt/gitlab/embedded/service/gitlab-shell/hooks/ –  MariuszS Dec 5 at 18:21

GitLab recently added custom hooks (since as Gryphius the regular hooks are used internally): https://github.com/gitlabhq/gitlabhq/blob/667c0a909bde1cf71f21d8ec9768e98b1c489030/doc/hooks/custom_hooks.md

Basically, you just create a custom_hooks directory in you bare Git repo and put the hooks in it, and GitLab makes sure they get run.

share|improve this answer

Sorry, I can't answer in the comments. I tried the solution from Gryphius. I modified it a little bit and it works if I call my PHP script in the browser (via GET). If I test the webhook of Gitlab it doesn't work, because it sends it as POST. Why isn't the script executed as POST?

$dir = "/srv/www/vhosts/domain.com/httpdocs";

$output = shell_exec("cd ".$dir);
echo $output;
$cmd = "git pull origin master";
$output = shell_exec($cmd);
echo $output;
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.