Skip to content

Instantly share code, notes, and snippets.

@sebolio
Last active September 4, 2015 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sebolio/4538bf82d710c22345fe to your computer and use it in GitHub Desktop.
Save sebolio/4538bf82d710c22345fe to your computer and use it in GitHub Desktop.
Hook para automatizar publicación de repositorio Git en un servidor web

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

Este archivo será llamado desde gitHook.php para realizar las operaciones de control del repositorio local de Git, luego copiará los archivos a una carpeta conocida por el servidor web.

gitPull.sh

#!/bin/bash
#
# gitPull.sh
#
# Este script se llama dede gitHook.php (cuyo cóedigo estáe en mi repositorio) y ejecuta un 'git pull'.
# Al usarlo pullea la rama de "release" solicitada, y está diseñado como parte del flujo
# de Git Flow: cambia hacia la rama solicitada, creándola y trackeándola de ser necesario.
#
# Uso: 'pull.sh <id> <commit> <rama>'
# (los primeros dos datos no necesitan ser reales, se usan para correlacionar con gitHook)
#
#
# @author Sebastian del Valle <i@seb.cl>
# @version 2014.12.10
# @rev 2015.08.14



#Ajustes manuales
  ruta="/home/pruebasgit/repo"
public="/home/pruebasgit/public_html"
   log="/home/pruebasgit/logpulls.log"
  hook="/home/pruebasgit/gitHook.php"



#inicializar
cd $ruta
echo "* Guardando log en $log"
[[ $3 ]] || (echo "solicitud incorrecta. uso: pull.sh <id> <commit> <rama> >> $log"; kill $$)
rama="$3"
printf "\n--- `date +"[%m/%d/%Y @ %H:%M]"` Iniciando pull.sh: $1 (${2:0:7}) en $3 \n" >> $log

#buscar la rama en el remoto
printf "\n>> Buscando rama $rama en remoto ..\n" >> $log
git fetch 2>>$log 1>>$log
(git branch -a | grep "remotes/origin/$rama" >> $log) || (printf "[ERR] la rama $rama no existe en el remoto\n\nPull finalizado\n\nfin--------------------------------------\n\n\n" >> $log; kill $$)


#cambiar hacia la rama
printf "\n\n>> Pulleando $rama ..\n" >> $log
git checkout $rama || git checkout -t $rama || (printf "falla al cambiar a $rama\n\n" >> $log; kill $$)


#realizar el pull y salir
git pull origin "$rama" >> $log
printf "\n\n>> Pull finalizado, procesando archivos..\n" >> $log
( ([[ -f $public/index.html ]] && (rm -fr "$public/*" 2>>$log 1>>$log && echo "[OK] Archivos anteriores borrados" >> $log)) || echo "[ERR] No pude borrar archivos anteriores" >> $log8 ) || echo "[INFO] '$public' no tiene un index.html, omitiendo borrado de archivos" >> $log
(cp -R $ruta/dist/* $public 2>>$log 1>>$log && echo "[OK] Archivos nuevos instalados" >> $log) || echo "[ERR] No pude mover archivos nuevos" >> $log
[[ -f $public/gitHook.php ]] || (ln -s $hook $public 2>>$log 1>>$log && echo "[OK] Script hookGit linkeado" >> $log) || echo "[ERR] Script hookGit no pudo ser intalado" >> $log
printf "\nfin---------------------------------------------\n\n\n" >> $log

echo fin;echo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment