Git + github + Service Hooks = renovado flujo de trabajo en PHP

Reemplazando el uso de FTP por Git + github

…o Bitbucket

aaaa-mm-dd: 2012-05-28 | Por: Agutín Amenabar

Finalmente me he sentado a aprender cómo usar Git y particularmente cómo conectar git a mi servidor, para que se vayan publicando inmediatamente los cambios hechos.

La verdad me ha tomado varios intentos y fracasos.

La mayor parte la logré siguiendo el tutorial
The Perfect Workflow, with Git, GitHub, and SSH
de net tut+ que tiene hasta un video.

Sólo lo he traducido y he agregado algunas cosas que me complicaron al seguir el tutorial.

Hace tiempo tengo una cuenta en github, pero más que nada la usaba para estar pendiente de algunos proyectos y reportar bugs
, lo mismo con la línea de comando y SSH, siempre con un ojo en el tutorial y el otro en la consola. Pero hace un par de días estoy batallando con las múltiples cosas que hay que echar a andar y finalmente lo he logrado, no fue tan terrible como pensé originalmente, dado que Chris Coyier había comentado lo complicado que era hacer esto.

Debo aclarar que soy un diseñador, que hasta hace un mes no tenía idea sobre:

  • SSH
  • Línea de comando
  • PuTTY
  • GIT

Y aunque aún entiendo muy poco de esas cosas esotéricas, han pasado a ser parte de mi flujo de trabajo y no entiendo cómo vivía sin ellos. Todo es mucho más rápido y lo mejorde todo es que son gratis!

Voy a hacer el ejemplo con el código de este mismo blog mientras lo construyo.

Paso por paso.

Repositorio local

OK, asumiendo que ya está GIT instalado, corriendo localmente (con Tortoise en mi caso) y tenemos una cuenta Github, hacemos un nuevo repositorio en la carpeta del sitio, agregamos los archivos del sitio y hacemos el primer commit.


cd carpeta/de/proyecto
git init
git add .
git commit -m ‘primer commit’

Cómo hacerlo desde la línea de comando.

Menú contextual, Crear repositorio aquí
Nuevo repositorio con tortoise.

Subirlo a github

Ahora a hacer un nuevo repositorio en github.

Clic en “nuevo Repositorio”
Se llena el simple formulario y se crea el proyecto.

En la página que aparece luego sale la dirección HTTP del proyecto, hay que buscar la dirección SSH.

El formato de la dirección es: git@github.com:nombreUsuario/nombreProyecto.git

Esta dirección es útil porque nos permitirá hacer push desde nuestro repositorio local, como siempre se puede hacer de 2 maneras:

SSH


git remote add origin git@github.com:nombreUsuario/nombreProyecto.git
git push -u origin master

GUI, como TortoiseGIT

Haciendo click derecho en la carpeta del proyecto se abre TortoiseGIT &rquo; Push…

En la ventana que aparece, en el grupo Destination haceer click en Manage.

Ojo que en el primer push hay que marcar la opción Force Overwrite Existing Branch (May discard changes) para que no entre en conflicto con la versión del repositorio que tiene github.

En la ventana que aparece hay que llenar los campos con: el nombre del proyecto, la URL de SSH que copiamos de Github y cargamos la putty key, navegando hasta donde esté guardada.

Esta configuración es práctico guardarla apretando el botón: Add new/Save

Ahora sólo hay que apretar OK, probablemente va a pedir la contraseña de la llave putty.

Si revisamos en github, está todo arriba.

Actualizar el servidor desde GIT

Hasta ahora no hay nada nuevo, ninguna ventaja sobre FTP (aparte del versionamiento), pero ahora haremos que el servidor cargue los archivos desde github, o sea que haga un pull.

Requisitos

Empecemos

Entrando por SSH con PuTTY

Luego navegamos hasta nuestro directorio, que en este caso es cd domains/code.medula.cl/html

Desde ahí podemos clonar el repositorio de github.

git clone git@github.com:nombreUsuario/nombreProyecto.git

Toma unos segundos y ya tenemos una carpeta con el nombre del repositorio.

En este caso eso es un problema, yo quería que el index quedara directo en el sub-dominio code.medula.cl y no dentro de la carpeta code.medula.cl/codeBlog .

Así que debo borrar recursivamente la carpeta que se creó, para eso usamos el siguiente comando:

<kbd>rm -r -f nombreProyecto</kbd>
En mi caso escribo: rm -r -f codeBlog

Al hacer una búsqueda en Google por “git clone empty directory” llegué a un grupo de Google donde se toca el tema, y Lee Henson da la respuesta que necesitaba

git clone git@github.com:nombreUsuario/nombreProyecto.git ./

Al parecer el comando git clone acepta un segundo parámetro que es la dirección donde clonar (estoy suponiendo).

De aquí en adelante no hay que hacer git clone git@github… si no que usaremos git pull

Automatizar

Todo esto está muy bien, pero sigue siendo bastante más aparatoso que FTP ¿no?

Bueno, aquí viene la magia, vamos a automatizar el proceso para que cada vez que hagamos un push a Github queden inmediatamente publicados los cambios en el servidor con el sitio.

En github

En la página del proyecto en github, hay que apretar el botón admin.

Este botón nos llevará a la página de admin del proyecto.

En la página de admin hay que apretar Service Hooks.

En el campo URL hay que poner la dirección del archivo que ejecutará el pull http://code.medula.cl/gitpull.php (no lo hemos hecho aún, pero le inventamos el nombre ahora)

Esto hará que Github envíe un POST a la dirección escrita ahí, en el post irá info asociada al push, pero en este caso no nos interesa.

Apretamos Update Settings y estamos con github.

En Bitbucket

En la página del repositorio ir a la pestaña Admin , apretar Services a la izquierda y en el select que aparece, seleccionar POST de la lista, y apretar Add Service donde aparecerá un campo para llenar con una URL, se usa la misma que usaríamos en github http://code.medula.cl/gitpull.php .

El archivo PHP

Ahora, en la raíz del proyecto haremos un nuevo archivo gitpull.php y lo agregamos a git.

Los iconitos delatan que aún tengo a Dreamweaver como editor predeterminado para PHP :$
Abrimos el archivo y escribimos lo siguiente (dentro de un tag de php):

exec(‘git pull’);
Si, eso es todo.

. EDIT: hasta el monento no me ha resultado hacer esto automatizado en Dreamhost

. EDIT 2: Ya lo he logrado! Era porque estaba usando tildes graves en vez de exec(); por alguna razón a Dreamhost no le gustaba el comando con tildes graves

Se hace un nuevo commit y push a Github.

Entramos una última vez al servidor por SSH, navegamos hasta la carpeta y hacemos un último git pull

En mi caso el servidor me pide el pass phrase de la llave, pero igual funciona automáticamente, creo que es porque tengo otra llave sin clave para Github (eso lo veré en otro artículo).

Y eso es todo, ya podemos ver los cambios reflejados en este sitio a penas hago un push a Github o Bitbucket.

Fuentes:

  • http://net.tutsplus.com/tutorials/other/the-perfect-workflow-with-git-github-and-ssh/ (+comment from Todd)
  • http://www.endreywalder.com/blog/authenticate-github-on-mediatemple-grid-shared-server/
  • http://douglasjarquin.com/post/1273916314/git-on-media-temple
  • http://blog.newgoldleaf.com/post/187406428/git-on-mediatemple (con (gs))
  • http://www.geekgumbo.com/2010/05/16/removing-deleted-files-from-your-git-working-directory/ (sacar arhivos eliminados)//git add -A && git add -u

Published :

Last modified :

Comments

comments powered by Disqus