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:
-
Creamos la carpeta de nuestro proyecto.
-
Inicializamos el repositorio git dentro de la carpeta del proyecto.
-
Agregamos la url de nuestro repositorio remoto de github.
-
mkdir my-app
-
cd my-app && git init
-
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.....