2013-06-16 17 views
6

Używam GitLab v5.2 na tym samym serwerze co mój serwer produkcyjny (Document Root w/var/www).GitLab 5.2 Post-Receive WebHook

Próbuję skonfigurować standardowy hak Post-Receive GitLab, ale znajduję zaskakująco mało informacji o tym, jak skonfigurować skrypt do przetwarzania wysłanych danych JSON. Nie próbuję robić niczego niestandardowego, tuż po wyjęciu z pudełka, chcę otrzymywać dane po odebraniu w mojej lokalizacji na stronie (pamiętaj na tym samym serwerze), a następnie ściągnij od mistrza pochodzenia, kiedy zostanie odebrany (pod warunkiem, że dane pochodzące z wysyłania danych były przekazywane do głównego oddziału). W ten sposób strona znajdująca się w/var/www jest zawsze taka sama jak wzorzec.

Czy ktoś mógłby podać przykład skryptu z danymi pocztowymi lub wskazać mi właściwy kierunek, aby utworzyć?

GitLab Hook Zapytanie Przykład - Dla tych bez instancji GitLab, tutaj jest to, co GitLab Post-Otrzymuj JSON danych wygląda (prosto z pomocą GitLab)

{ 
"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, 
}; 

Odpowiedz

6

porządku, po rozległej kopania I zostały stwierdzone wystarczająco docs utworzyć mój własny skrypt, a tutaj jest:

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'); 
} 

Tak, jes s działa idealnie w tym celu. Ale teraz muszę przemyśleć logikę i potencjalnie nawet filozofię. Ta metodologia automatycznie aktualizuje katalog główny/var/www/website/z wzorcem; jednak co z różnymi innymi gałęziami? Potrzebuję metodologii w miejscu, aby móc przeglądać inne oddziały przez mój serwer WWW, więc zespoły dev może zobaczyć swoją pracę ...

Oto co mam na myśli:

Zamiast mojego kodu tylko patrząc na „master” w sekcji ref łańcucha post, podzielić ciąg post na „/” separatora i pop off element końcowy:

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

Potem sprawdź, czy ta gałąź ma pracę katalog w katalogu/var/www/website/directory /, taki jak /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"); 
} 

Ta logika wydaje się stosunkowo solidna, po prostu publikuj ją tutaj, aby zobaczyć opinie ludzi. Dzięki tej metodzie programista może utworzyć nowy zdalny oddział i do niego wcisnąć, a następnie gałąź zostanie wciągnięta do katalogu/var/www w celu przeglądania.

Czy ktoś może wymyślić inny sposób, aby umożliwić programistom przeglądanie ich oddziałów deweloperskich lub wszelkich zaleceń, jak ulepszyć ten skrypt?

Dzięki

+0

Dodałem blogu o działaniach wziąłem i pełnego bloku kodu używanego do konfiguracji tej funkcji na moim serwerze, jeśli ktoś jest zainteresowany: http://www.kernelops.com/gitlab-post-receive-webhook/ – sadmicrowave