Skip to content

Instantly share code, notes, and snippets.

@roadev
Created January 7, 2016 17:26
Show Gist options
  • Save roadev/4b636a6837a17264ae4b to your computer and use it in GitHub Desktop.
Save roadev/4b636a6837a17264ae4b to your computer and use it in GitHub Desktop.
Automatizar deploy a servidor (VPS) con git

Aquí explicaré cómo realizar un deploy automático en servidor (VPS de DigitalOcean). Realizaremos un push primero a github y necesitaremos una conexión ssh para poder jalar automáticamente desde el servidor de deploy. Para comenzar, debemos tener nuestra llave ssh agregada en github, así que seguimos los siguientes pasos (ésto si nunca lo hemos hecho...).

En nuestro equipo, ejecutamos:

ssh-keygen

Con ello generamos una clave ssh en nuestro directorio home, si ya la tenemos la terminal les preguntará si quieren sobre-escribir la llave. Elegimos según corresponda (nota, si ya está generada, tener en cuenta si se ha usado con otros servidores o para otro tipo de autenticación...). Nos pedirá una passphrase, la cuál no es más que una contraseña segura que deseemos colocarle a nuestra llave privada. Para efectos prácticos no colocaremos ninguna, ésto es importante para evitar que alguien más tenga accesos ssh con su llave pública, pero por efecto de agilidad y de ejemplo, la dejaremos sin passphrase.

Ahora para obtenerla, ejecutamos:

cat ~/.ssh/id_rsa.pub

Nos saldrá un hash y lo copiamos desde donde dice ssh-rsa hasta <user@pc> NOTA -> "No saldrán los < >, simplemente es nomenclatura"

Ahora vamos a Settings en nuestra cuenta de github, SSH Keys, Add SSH Key y colocamos un título para identificar que esa llave es de uno de nuestros PCs, las llaves ssh son únicas por PC por usuario/cuenta.

En el campo Key pegamos la ssh-key que copiamos luego de hacer cat a id_rsa.pub y tecleamos Add Key.

Éste mismo proceso debemos hacerlo en nuestro VPS, así que accedemos a él y ejecutamos los mismos comandos que ejecutamos para obtener la llave en nuestro PC local y la agregamos en github.

¿Por qué?

Porque nuestro servidor de deploy también debe conectarse via ssh (más seguro que hacerlo por http) y github identificarlo con la llave única que se generó, y así, permitirle hacer pull de los cambios.

Ahora editamos nuestro archivo .gitignore (si no existe, lo creamos) y agregamos una línea para ignorar los archivos con extensión .sh

nano .gitignore

Agregamos:

*.sh

Guardamos y salimos.

Creamos el archivo deploy.sh en la raíz de nuestro proyecto con:

touch deploy.sh

Ahora generamos el hook post-commit como lo explico en el siguiente gist

https://gist.github.com/roadev/fc3f9c366d7ce875c4fb

Pero adicional a ese proceso, debemos agregar otras líneas para el script post-commit:

#!/bin/sh
git push origin master
ssh [email protected] 'bash -s' < deploy.sh

En el anterior post-commit tenemos una línea nueva comenzando por la instrucción ssh, explicaré de qué se trata.

Ésta línea genera una conexión remota ssh al servidor VPS al cuál haremos el deploy, y justo después de ese login, ejecutaremos una terminal temporal con la instrucción bash -s. Ésto lo hacemos para realizar el segundo paso del automatic deployment. la instrucción: 'bash -s' < deploy.sh como ya expliqué, abre la terminal temporal pero además, le "inyecta" por así decirlo, el script deploy.sh, el cuál es un archivo local de nuestro proyecto.

En el archivo deploy.sh deben ir las instrucciones de lo que debe hacer nuestro servidor justo después de generar la conexión remota después del push.

Antes de proceder con el archivo deploy.sh asumiremos de que será nuestro primer deploy, o al menos el primero con git a nuestro server. Así que seguimos estos pasos:

  1. Creamos la carpeta de nuestro proyecto.

  2. Inicializamos el repositorio git dentro de la carpeta del proyecto.

  3. Agregamos la url de nuestro repositorio remoto de github.

  4. mkdir my-app

  5. cd my-app && git init

  6. git remote add origin [email protected]:mygithubuser/myremoterepo.git

Usamos la url remota de ssh para agregarla a nuestro proyecto tanto en el server como en local...

========

Ahora con nano o con su editor favorito, creamos el archivo deploy.sh (en nuestro repositorio local) y agregamos lo siguiente:

#!/bin/sh
cd ~/<carpeta_del_proyecto>
git pull origin master

En la conexión en la que se inyecta el deploy.sh se utiliza shell, posteriormente se accede a la carpeta donde haremos el deploy y por último hacemos un pull de github a nuestroo servidor.

Todo ésto lo hacemos asumiendo que queremos hacer deploy cada vez que tengamos cambios en nuestra rama master.

Si por algún motivo, corremos nuestro server como root, por ejemplo en PHP sobre /var/www/ debemos hacer unos pasos adicionales.....

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