El siguiente archivo recibirá las peticiones desde el proveedor del repositorio git (como github, gitlab o bitbucket)
Para que todo esto funcione, la cuenta de usuario desde la que se ejecuten los scripts debe usar SSH key hacia el repo.
gitHook.php
<?php
/**
* gitHook.php
*
* Herramienta para recibir solicitudes del hook "POST" del servidor, que cuando hay cambios en determinada rama
* ejecuta un script bash externo (pull.sh cuyo códio fuente está en mi repositorio tambiénel cual clona o pullea
* el repositorio en cuestión, dejándolo habilitad para ser accedido desde un servidoreb
*
* Evolucion del script original que hice para IDA, que generaba reglas de rewrite de Apache para
* permitir acceder directamente desde el servidor web mediante <repo>.<persona>.ida.cl
*
* @author Sebastian del Valle <i@seb.cl>
* @version 2014.12.10
* @rev 2015.08.13
*/
$script = "bash /home/pruebasgit/gitPull.sh"; //el codigo de este archivo se encuentra a continuacion en mi gist
$log = "/home/pruebasgit/hooklog.log";
$rama = "release";
$r = rand(); //el id generado para relacionar los logs de ambos scripts
$f=fopen($log, "a"); //guarda un log de los requests
$cuerpo = json_decode(file_get_contents('php://input'));
if (!$cuerpo->ref) {
//llamado incorrecto
header("HTTP/1.0 403 Forbidden");
die();
}
$commit = $cuerpo->after;
$ref = explode("heads/", $cuerpo->ref); $ref=$ref[1];
fwrite($f, "--- Iniciando hook $r ($commit)\n");
fwrite($f, "rama $ref");
if (strstr($ref, $rama)) {
fwrite($f, "[ OK ]\n");
exec(sprintf("%s %s %s %s", $script, $r, $commit, $ref));
}
else {
fwrite($f, "[ Invalida ]\n");
}
fwrite($f, "\n");
fclose($f);