2013-06-16 14 views
6

Ich führe GitLab v5.2 auf dem gleichen Server wie meine Produktion Webserver (Document Root in/var/www).GitLab 5.2 Post-Receive WebHook

Ich versuche, einen Standard-Post-Receive-Hook von GitLab einzurichten, finde aber überraschend wenig Informationen darüber, wie man ein Skript zur Verarbeitung der geposteten JSON-Daten einrichtet. Ich versuche nicht, irgendetwas Brauchbares zu tun, ich möchte die Post-Receive-Daten auf meiner Website empfangen (auf dem gleichen Server merken) und dann vom Ursprungs-Master abrufen, wenn er empfangen wird (vorausgesetzt, die Post-Receive-Daten, die den Push-Vorgang ausgelöst haben, waren an den Master-Zweig). Auf diese Weise ist die Website in/var/www immer gleich ein Master.

Könnte jemand mir entweder ein Beispiel für ein Pull-Skript aus den Post-Daten geben oder mich in die richtige Richtung weisen, damit ich einen erstellen kann?

Gitlab Haken anfordern Beispiel - Für diejenigen ohne Gitlab Beispiel ist hier, was die Gitlab Post-Receive JSON-Daten sieht aus wie (gerade aus der Gitlab Hilfe)

{ 
"before": "95790bf891e76fee5e1747ab589903a6a1f80f22", 
"after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", 
"ref": "refs/heads/master", 
"user_id": 4, 
"user_name": "John Smith", 
"repository": { 
    "name": "Diaspora", 
    "url": "[email protected]:diaspora.git", 
    "description": "", 
    "homepage": "http://localhost/diaspora", 
}, 
"commits": [ 
    { 
    "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327", 
    "message": "Update Catalan translation to e38cb41.", 
    "timestamp": "2011-12-12T14:27:31+02:00", 
    "url": "http://localhost/diaspora/commits/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327", 
    "author": { 
     "name": "Jordi Mallach", 
     "email": "[email protected]", 
    } 
    }, 
    // ... 
    { 
    "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", 
    "message": "fixed readme", 
    "timestamp": "2012-01-03T23:36:29+02:00", 
    "url": "http://localhost/diaspora/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7", 
    "author": { 
     "name": "GitLab dev user", 
     "email": "[email protected](none)", 
    }, 
    }, 
], 
"total_commits_count": 4, 
}; 

Antwort

6

Okay, nach umfangreichen Graben I gefunden habe genug docs mein eigenes Skript zu erstellen, und hier ist es:

PHP

error_reporting(E_ALL); 
ignore_user_abort(true); 

function syscall ($cmd, $cwd) { 
    $descriptorspec = array(
      1 => array('pipe', 'w') // stdout is a pipe that the child will write to 
    ); 
    $resource = proc_open($cmd, $descriptorspec, $pipes, $cwd); 
    if (is_resource($resource)) { 
      $output = stream_get_contents($pipes[1]); 
      fclose($pipes[1]); 
      proc_close($resource); 
      return $output; 
    } 
} 

if($HTTP_RAW_POST_DATA && !empty($HTTP_RAW_POST_DATA['ref'])){ 
    // pull from master 
    if(preg_match('(master)', $HTTP_RAW_POST_DATA['ref'])) 
      $result = syscall('git pull origin master', '/var/www/website/directory'); 
} 

Also, thi s funktioniert perfekt für seinen Zweck. Aber jetzt muss ich die Logik und möglicherweise sogar die Philosophie überdenken. Diese Methode hält automatisch das Verzeichnis/var/www/website/auf dem neuesten Stand mit dem Master; aber was ist mit verschiedenen anderen Branchen? Ich brauche eine Methode anstelle der Lage sein, andere Zweige durch meine Web-Server zu sehen, so dass die Entwickler-Teams ihre Arbeit sehen können ...

Hier ist, was ich denke:

Anstatt mein Code nur für „Master“ im ref Abschnitt der Post Saiten, spaltete ich die Post Zeichenfolge auf dem „/“ Trennzeichen und das Endglied Pop-off:

$branch = array_pop(split("/", $HTTP_RAW_POST_DATA['ref'])); //this will return which branch the post data was sent from 

Dann überprüfe ich, ob dieser Zweig eine Arbeits hat Verzeichnis innerhalb des/var/www/website/Verzeichnis /, wie /var/www/website/directory/master:

if(is_dir("/var/www/website/directory/$branch")){ //check if branch dir exists 
    $result = syscall("git pull origin $branch", "/var/www/website/directory/$branch"); 
} else { 
    //if branch dir doesn't exist, create it with a clone 
    $result = syscall("git clone ssh://[email protected]/sadmicrowave/someproject.git $branch", "/var/www/website/directory"); 
    //change dir to the clone dir, and checkout the branch 
    $result = syscall("git checkout $branch", "/var/www/website/directory/$branch"); 
} 

Diese Logik scheint relativ solide zu sein, es einfach hier zu veröffentlichen, um die Meinungen der Leute zu sehen. Mit dieser Methode kann ein Entwickler eine neue entfernte Verzweigung erstellen und dorthin drücken, dann wird die Verzweigung in das Verzeichnis/var/www zur Ansicht gezogen.

Kann jemand an eine andere Möglichkeit denken, um Entwicklern zu ermöglichen, ihre Dev-Zweige zu sehen, oder irgendwelche Empfehlungen, wie man dieses Skript besser macht?

Dank

+0

ich eine Blog-Post über die Aktionen hinzugefügt habe ich Code nahm und den vollen Block Setup auf meinem Server diese Funktionalität verwendet, wenn Jeder ist interessiert: http://www.kernelops.com/gitlab-post-receive-webhook/ – sadmicrowave