====== 9. Despliegue continuo ====== ===== Introducción ===== * [[https://blog.develat.io/pipelines-ci-cd/|Integración continua y despliegue continuo]] * [[https://devopsti.wordpress.com/2014/09/26/integracion-continua-ci-entrega-continua-cd-y-despliegue-continuo-cd/|Integración continua (CI), Entrega continua (CD) y Despliegue Continuo (CD)]] * [[https://geeks.ms/jorge/2019/02/25/integracion-entrega-y-despliegue-continuo-diferencias-y-similitudes/|Integración, entrega y despliegue continuo. Diferencias y similitudes]] ===== Contenedor con Jenkins ===== Jenkins es lo que se llama un "Servidor de automatización". {{:clase:daw:daw:2eval:jenkins_logo.png?200|}} Hay abundante documentación sobre él , en los siguientes enlaces: * [[https://www.jenkins.io/|Jenkins]]: Página del proyecto. * [[https://www.javiergarzas.com/2014/05/jenkins.html|¿Qué es Jenkins? Explicado en menos de 10 min para quienes no lo conocen de nada]] * [[https://www.arsys.es/blog/programacion/jenkins-cloud-integracion-continua/|Automatiza las tareas de desarrollo e integración continua con Jenkins]] * [[https://www.ionos.es/digitalguide/paginas-web/desarrollo-web/jenkins-tutorial/|Jenkins: tutorial para esta herramienta de CI]] Aunque Jenkins pueda parecer sencillo o superfluo, usar Jenkins //**es el camino**// para hacer software de calidad.: {{:clase:daw:daw:2eval:jenkins-is-the-way.png?100|}} {{:clase:daw:daw:2eval:the_mandalorian.jpg?100|}} En ejercicios de temas anteriores hemos visto como instalar Jenkins.Ahora vamos a ejecutar un Script desde Jenkins en la máquina real. ===== root por SSH ===== Antes que nada debemos permitir que se pueda acceder por SSH como root desde la máquina real. Esto lo vamos a necesitar ya que desde Jenkins vamos a ejecutar "npm run deploy" en la máquina real y para ello necesitamos ser root. Para permitirlo hay que lanzar las siguientes órdenes: sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config sudo systemctl restart ssh.service Despues habrá que cambiar la contraseña a root con la siguiente orden: sudo passwd root En un entorno real o sin que haya un cortafuegos delante de la máquina, nunca deberíamos permitir que con root se pueda acceder a la máquina real. Sin embargo lo vamos nosotros a permitir ya que estamos en un entorno educativo. ===== Plugin SSH2 Easy ===== Otra cosa que necesitamos hacer es instalar y configurar el plugin "SSH2 Easy" para poder acceder por SSH a la máquina real y así lanzar las órdenes en la máquina real. * Instalar en Jenkis el plugin "SSH2 Easy": * En Jenkins pulsa "Administrar Jenkins" , "Administrar Plugins" y "Todos los plugins" * En el campo de búsqueda, escribe "SSH2 Easy" * Marca el plugin "SSH2 Easy" y pulsa "Instalar sin reiniciar" * Espera unos segundos y pulsa en "Volver al inicio de la página" \\ \\ * Configurar el plugin "SSH2 Easy": * Vuelve a "Administrar Jenkins" y pulsa en "Configurar el sistema" * Ves al apartado de "Server Groups Center" * En el apartado "Server Group List" pulsa en Añadir y rellena lo siguiente * Group Name: Máquina Real * Password: La contraseña de root de tu máquina real. * Pulsa en el botón "Guardar" que hay al final de la página. * Vuelve a "Administrar Jenkins" y pulsa en "Configurar el sistema" * Ves al apartado de "Server Groups Center" * En el apartado "Server List" pulsa en Añadir y rellena lo siguiente: * Server Group: Máquina real. * Server Name: maquina-real * Server IP: La IP de la máquina real. ===== Crear un Job ===== Vamos ahora a crear una tarea para poder ejecutar un script desde Jenkins en la máquina real. * Pulsa en "Nueva Tarea" , escribe "Desplegar" , selecciona "Crear un proyecto de estilo libre" y luego pulsa el botón "OK". * Ves al apartado de "Ejecutar" y en el desplegable de "Añadir una acción", selecciona "Remote shell". * El el campo "shell" , escribe las ordenes de Linux que quieres que se ejecuten en la máquina real como root. * Pulsa el botón de "Guardar". * Pulsa en "Construir ahora" y si todo ha ido bien, en tu máquina real se deberá haber ejecutado el Script Los Script que querremos ejecutar lo normal es que sean los siguientes: cd /carpeta del proyecto git fetch --prune git checkout master git merge --ff-only origin/master npm run deploy ===== GitHub Actions ===== Ahora vamos a ver con configurar Jenkins y GitHub para que al hacer un cambios en "main" se ejecute el Job que despliega la aplicación. Para ello vamos a usar una funcionalidad de GitHub llamada GitHub Actions que son acciones que se ejecutan cuando hay algún cambio en el repositorio. En Jenkins vamos a creara un Token (Es como una contraseña del usuario) * Pulsa en nuestro nombre de usuario en la parte superior derecha. * En el menu lateral, ves a "Configurar". * Pulsa en el botón de "Add new Token" y en el botón "Generate" * Copia en algún lugar seguro el Token generado * Pulsa en el botón "Guardar" que hay al final de la página. Ves al Job y en "configurar" * Ves al apartado "Disparadores de ejecuciones" * Marca la opción "Lanzar ejecuciones remotas (ejem: desde 'scripts')" * Escribe el Token que habías generado antes. En el código fuente del proyecto , añade el fichero ''.github/workflows/main.yml'' con el siguiente contenido: name: deploy on: push: branches: - main jobs: build: name: desplegar runs-on: ubuntu-latest steps: - name: trigger single Job uses: appleboy/jenkins-action@master with: url: "URL del servidor de Jenkins" user: "nombre del usuario de Jenkins" token: "El Token que has generado antes" job: "nombre del Job a ejecutar" Ahora al hacer cualquier cambio en la rama ''main'' se ejecutará el Job de Jenkins ===== Ejercicios ===== ==== Ejercicio 1 ==== Ahora vamos a automatizar la ejecución del Script anterior usando Jenkins * Crea un nuevo contenedor de Jenkins de forma que la carpeta ''/var/jenkins_home'' se almacene dentro de ''/opt/tuNombre/docker/jenkins'' * Instala Jenkins * Instala el plugin de SSH2 Easy sabiendo que la IP es la de la máquina real de Linux de Francia. La contraseña es la misma que la del usuario ''alumno''. * Crea un Job llamado ''Desplegar'' que ejecute lo siguiente en la máquina real cd /opt/tuNombre/ejemplodaw git fetch --prune --force git checkout master git merge --ff-only origin/master npm run deploy Ahora haz un cambio en el SASS en master , súbelos a GitHub y ejecuta el Job de Jenkins.Prueba a navegar a http://tuNombre.daw2.pve2.fpmislata.com y se verán los cambios. Ahora haz un cambio en el HTML en master , súbelos a GitHub y ejecuta el Job de Jenkins.Prueba a navegar a http://tuNombre.daw2.pve2.fpmislata.com y se verán los cambios. ==== Ejercicio 2 ==== Ahora vamos a automatizar todo el proceso de despliegue de forma que cuando haya un cambio en master que se despliegue automáticamente el código. ==== Ejercicio 3 ==== Mira lo que son en GitHub los "secrets" en [[https://docs.github.com/es/free-pro-team@latest/actions/reference/encrypted-secrets|Encrypted secrets]] Ahora modifica el fichero ''.github/workflows/main.yml'' para que no se vea el Token