|  |  | @@ -0,0 +1,88 @@ | 
    
    |  |  | 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. | 
    
    |  |  | 
 | 
    
    |  |  | 1. `mkdir my-app` | 
    
    |  |  | 2. `cd my-app && git init` | 
    
    |  |  | 3. `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.....** |