2013-06-16 17 views
6

Sto eseguendo GitLab v5.2 sullo stesso server del server Web di produzione (Directory del documento in/var/www).GitLab 5.2 WebHook post-ricezione

Sto provando a impostare un GitLab Post-Receive Hook standard, ma sto trovando sorprendentemente poche informazioni su come impostare uno script per elaborare i dati JSON inviati. Non sto cercando di fare qualcosa di personalizzato, appena fuori dalla scatola, voglio ricevere i dati di post-ricezione sul mio sito web (ricordati sullo stesso server), e poi tirare da master di origine quando viene ricevuto (a condizione che il push di origine dei dati di post-ricezione fosse il ramo principale). In questo modo, il sito web trovato in/var/www è sempre lo stesso un master.

Qualcuno potrebbe darmi un esempio di script di pull dai dati del post o indicarmi la direzione giusta per crearne uno?

GitLab Hook esempio di richiesta - Per chi non ha un'istanza GitLab, qui è ciò che il GitLab post-ricezione JSON dati assomiglia (direttamente dal aiuto 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].org", 
    } 
    }, 
    // ... 
    { 
    "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, 
}; 

risposta

6

Bene, dopo ampia scavo I 've sufficienti documenti trovati di creare il mio script e qui è:

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

Quindi, Thi s funziona perfettamente per il suo scopo. Ma ora ho bisogno di ripensare la logica e potenzialmente anche la filosofia. Questa metodologia manterrà automaticamente aggiornata la directory/var/www/website/con master; tuttavia, che dire di vari altri rami? Ho bisogno di qualche metodo in atto per essere in grado di vedere gli altri rami attraverso il mio server web, in modo che le squadre dev possono visualizzare il loro lavoro ...

Ecco quello che sto pensando:

piuttosto che il mio codice appena alla ricerca di "master" all'interno della sezione ref della stringa posta, ho diviso la stringa post sulla "/" delimitatore e pop off l'elemento terminale:

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

Poi ho controllare per vedere se questo ramo ha un lavoro directory all'interno della directory/var/www/website /, come /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"); 
} 

Questa logica sembra relativamente solida, basta pubblicarla qui per vedere le opinioni delle persone. Con questo metodo, uno sviluppatore può creare un nuovo ramo remoto e premere su di esso, quindi il ramo verrà inserito nella directory web/var/www per la visualizzazione.

Qualcuno può pensare a un altro modo per consentire agli sviluppatori di visualizzare i propri rami di sviluppo o eventuali consigli su come rendere questo script migliore?

Grazie

+0

Ho aggiunto un post sulle azioni che ho preso e il blocco pieno di codice utilizzato per l'installazione di questa funzionalità sul mio server, se chiunque è interessato: http://www.kernelops.com/gitlab-post-receive-webhook/ – sadmicrowave