domingo, 29 de septiembre de 2013

Github y php : Hacer commit y push via Https


Este articulo lo escribo como experiencia que una vez tuve con un cliente, no estoy seguro que pueda funcionar para otras personas pero quiera publicarlo para que sea de ayuda para otras personas

Github es el popular servicio para alojar proyectos utilizando el sistema de control de versiones llamado Git. En esta parte quiero aclarar que Github y Git no son lo mismo, para entender un poco mas en detalle la diferencia puedes visitar este link

Hoy he tenido la oportunidad de trabajar en un proyecto donde un script PHP tiene que crear una serie de archivos, y esos archivos tienen que ser subidos automáticamente a un repositorio en Github. Quiero compartir la manera en que logre hacerlo, para que sirva de guía para otras personas. Tal vez no sea una de las  mejores técnicas pero logro obtener el resultado deseado, partiendo de esto puedes mejorar la técnica.

Lo primero que tenemos que hacer es  crear una cuenta en Github y crear un repositorio. Después con nuestro repositorio creado obtener la URL de mismo. Ejemplo:

https://github.com/SaulBurgos/temp.git.

Lo mas importante aquí es  primero verificar si en tu servidor web, tienes instalado Git. En esta sección no
puedo ofrecer mucha ayuda ya que puede variar según tu compañía de host. Pero a manera general puede ser descritos de esta manera:

  • Si tienes acceso a la terminal de tu servidor y puedes ejecutar comandos, pues solo tienes que seguir la guía de instalación en  http://git-scm.com/download/
  • Si no tienes acceso a la terminal, puedes consultar con tu proveedor de hosting de como instalar Git y te puedan dar acceso a la terminal para ejecutar comandos Git.
Lo siguiente es agregar nuestro repositorio Github a Git, donde haremos PUSH para enviar todo los archivos creados. Normalmente la configuración de un repositorio Github en Git seria asi:

git remote add 'origin' https://github.com/SaulBurgos/temp.git

De esta manera normalmente si hacemos push con el comando : 

 git push 'origin' master 

Nos preguntara el user y password y después subirá los archivos a Github. Pero como vamos a ejecutar comandos Git por medio de un script PHP necesitamos hacerlo un tanto diferente, para no tener que escribir el user y password.


 Lo primero es que vamos usar la autenticacion Github OAuth la cual nos permitirá hacer PUSH por medio de autenticacion HTTPS. Para esto necesitamos crear un "Personal Access Tokens" en nuestra  cuenta Github. Esto lo puedes hacer en settings > Applications > Personal Access Tokens.


Una vez que creas el tokens obtendrás algo como esto :

1912313134f10c7fghfghfhfhf506385f3877bedc1e

Este sera el token que usaremos para agregar nuestro repositorio Github a git usando esta estructura :

 "https://<OAuthToken>@github.com/username/application.git"

 La cual la nuestra quedaría de esta manera :

 https://1912313134f10c7fghfghfhfhf506385f3877bedc1e@github.com/SaulBurgos/temp.git

y nuestro comando Git para agregarlo  seria  :

git remote add 'github'  https://19686434f10c7fghfghfhfhf506385f3877bedc1e@github.com/SaulBurgos/temp.git

Con esto hemos terminado la configuracion de Git. Los comandos Git que utilizaremos en nuestro script PHP seran :
  •  git add -A
  • git commit
  • git push

Supongamos que hemos creado un repositorio Git y esta sera la estructura de nuestro proyecto :

/web/repo/   -> Aquí esta nuestro repositorio Git.(archivos a subir)
/web/script.php  -> Script PHP  que ejecutara los comandos Git.

La forma en que esto funciona es que el script PHP ejecutara comandos de terminal Git cuando se ejecute, así cualquier acción que queramos hacer con Git la haremos con PHP. Para ejecutar comandos de terminal con PHP usamos el método : exec. Ahora nuestro código PHP en el script sera este:

<?php
$pathRepo = __DIR__.'/repo';
chdir($pathRepo);  
exec("git add -A");
exec("git commit -m 'description del commit'");
exec("git push 'github' master --progress 2>&1");
?>
Ahora con solo estas linea de codido, cada vez que nuestro script se ejecute hara COMMIT y PUSH hacia Github, con los archivos que se encuentran en /web/repo/ sin pedir credenciales ya que estamos usando nuestro token OAuth. A cada uno de estos comando puedes hacerles un echo para ver los mensajes que devuelven. El método PHP chdir nos cambia de directorio para poder trabajar en la carpeta del repositorio.
Si lo prefieres puedes usar esta libreria para trabajar de una manera mas comoda : https://github.com/ornicar/php-git-repo , pero de antemano les advierto que no la he probado a fondo.

No hay comentarios:

Publicar un comentario