Índice
- Introducción
- Prerrequisitos
- Conceptos importantes
- Integración continua – GitHub actions
- Entrega continua – GitHub actions
- Despliegue continuo – Netlify
- Ejemplo practico I: siguiendo el flujo
- Ejemplo practico II: Sacar release
- Conclusión
1. Introducción
El objetivo principal de CI/CD es reducir el tiempo de comercialización que, de otro modo, solía llevar años debido a procesos rotos y una colaboración mínima entre el desarrollo y las operaciones.
A continuación verás una guía rápida y sencilla explicando algunos conceptos fundamentales que deberías de saber y además verlos en práctica, para ello vamos a utilizar los servicios de GitHub actions y Netlify.
2. Prerrequisitos
React app con TypeScript y las siguientes librerías:
- Jest
- esLint
- Prettier
Para ello he creado un template base para que no tengas que complicarte creando todo desde cero:
<< react-template >>
3. Conceptos importantes
Integración continua (continuos integration en inglés o CI): consiste en hacer integraciones automáticas de un proyecto tan a menudo como sea posible. Los cambios del desarrollador se validan creando una compilación y ejecutando pruebas automatizadas contra la compilación. De este modo, se evitan los problemas de integración que pueden producirse cuando se espera al día de la publicación para fusionar los cambios en la rama de publicación.
La integración continua pone en gran énfasis en la automatización de las pruebas para comprobar que la aplicación no se rompe cada vez que se integran nuevos cambios en la rama principal.
Entrega continua (continuos delivery en inglés o CD): es una extensión de la integración continua, ya que despliega automáticamente todos los cambios de código en un entorno de pruebas y/o de producción después de la etapa de construcción.
Con esto queremos decir que, además de las pruebas automatizadas, tienes un proceso de lanzamiento automatizado y puedes desplegar tu aplicación en cualquier momento pulsando un botón.
Despliegue continuo (continuos deployment en inglés o CD): este va un paso más allá de la entrega continua. Con esta práctica, todos los cambios que superan todas las etapas de su canal de producción se liberan para sus clientes. No hay intervención humana, y solo una prueba fallida impedirá que un nuevo cambio se despliegue.
Como desarrolladores nos interesa estar más centrados en la creación de software, y ver nuestro trabajo lo antes posible después de haberlo terminado.
3.1. Esquema general CI/CD
3.2. ¿Cuál es la diferencia entre Entrega Continua y Despliegue Continuo?
La Entrega Continua se centra en la estrategia de lanzamiento y puesta en marcha, mientras que el Despliegue Continuo se centra en el despliegue en sí.
4. Integración continua – GitHub actions
Este workflow se ejecutará automáticamente cuando se cree una PR o se agreguen nuevos cambios a la rama master, y hará lo siguiente:
- Instalar las dependecias
- Ejecutar esLint
- Ejecutar prettier
- Ejecutar las pruebas (en este caso en concreto los test unitarios)
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions name: CI # Controls when the workflow will run on: # Triggers the workflow on push or pull request events but only for the master branch push: branches: [ master ] pull_request: branches: [ master ] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: test: name: Test # The type of runner that the job will run on runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: node-version: '15.14.0' cache: 'npm' - name: Install dependencies run: npm ci env: CI: true - name: Run esLint run: npm run lint - name: Run prettier run: npm run prettier - name: Run the tests and generate coverage report run: npm run test:unit:coverage
5. Entrega continua – GitHub actions
Este workflow solo se ejecutará manualmente cuando se quiera sacar versión y va a hacer lo siguiente:
- Ejecutar los pasos anteriores que vimos en CI (excluyendo el ESLint y formateador del código).
- Hacer la build de la aplicación.
- Crear una tag con los artefactos de la build.
- Sacar versión a partir de la tag generada.
- Preparar la siguiente versión (ej.: 0.0.1-SNAPSHOT.0)
- Finalmente, actualizar la rama en remoto con el SNAPSHOT para la siguiente versión.
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions name: CD on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: jobs: release: name: Release runs-on: ubuntu-latest env: NODE_ENV: test steps: - name: Clone repository uses: actions/checkout@v2 - name: Use Node.js 15 uses: actions/setup-node@v2 with: node-version: '15.14.0' cache: 'npm' - name: Install dependencies run: npm ci env: CI: true - name: Run the tests run: npm run test # When we need to make commits it is important to set up the Git User - name: Configure Git User run: | git config user.email "actions@github.com" git config user.name "GitHub Actions" # Get version number and save it in a variable - name: Get package version run: echo "::set-output name=tag-version::$(jq '.version' package.json | sed 's/-SNAPSHOT.0//' | xargs npm version --no-git-tag-version | sed 's/v//')" id: version shell: bash - name: Build run: npm run build # Allows you to release using an already created tag, if the given tag does not exist it will fail - name: Create GitHub Release uses: ncipollo/release-action@v1 with: generateReleaseNotes: true tag: ${{ steps.version.outputs.tag-version }} token: ${{ secrets.GITHUB_TOKEN }} # Prepare prerelease with the preid SNAPSHOT (ex.: 0.0.0-SNAPSHOT.0) - name: Create SNAPSHOT run: npm version prerelease --preid SNAPSHOT --no-git-tag-version - name: Update version in remote run: | git add package.json git add package-lock.json git commit -m "Update SNAPSHOT" git push
6. Despliegue continuo – Netlify
Para este apartado no se necesita ninguna configuración de código sino que lo que haremos sería enlazar nuestro repositorio de GitHub con Netlify para cuando agreguemos un cambio en la rama master y luego de que pase el workflow de CI, se despliegue automáticamente.
Enlazar Netlify con el repositorio de GitHub
Pasos a realizar:
-
- Agregar un nuevo sitio
En este aparado tenemos 3 opciones a elegir, pero la que nos interesa es la primera opción agregar un proyecto existente.
2. Conectar con el proveedor (en este caso GitHub)
3. Elegir un repositorio
Después de dar los permisos necesarios, debemos elegir el repositorio deseado, el cual aparecerá en la lista de repositorios dependiendo del acceso dado.
4. Finalmente, agregamos las configuraciones de la build
Una vez indiquemos la rama, el comando para generar la build y el directorio que queremos publicar hacemos clic en desplegar sitio y ya estaría.
¡Buen trabajo!
7. Ejemplo practicó I: siguiendo el flujo
En este punto ya tenemos todo configurado, por lo tanto, veremos el flujo automático que tendrá nuestra aplicación una vez creamos PR y luego unifiquemos (merged) en master.
-
- Creamos PR a la rama master con las nuevas funcionalidades
Automáticamente se ejecutará el workflow de CI y a su vez las comprobaciones de Netlify que incluso podrás ver un preview de los cambios realizados antes de mergear la PR.
Después de que hayan pasado las comprobaciones y hayamos revisado todo mergeamos.
2. Después de mergear
Además de que se ejecuta nuevamente el workflow de CI por los cambios agregados a master, si nos vamos a Netlify podremos ver que nuestra app ya se esta desplegando:
APP desplegada:
¡Felicidades! ?
8. Ejemplo practico II: Sacar release
Este paso lo he dejado para el final porque es manual, si revisamos nuevamente el esquema general nos daremos cuenta que forma parte de la Entrega Continua.
-
- Nos vamos a la parte de acciones
Ejecutamos el workflow de CD:
2. Una vez ejecutado el workflow podremos ver que
Se ha preparado el package.json con el SNAPSHOT de la siguiente versión
Hay una nueva release disponible
¡Nueva versión disponible! ?
9. Conclusión
Como has podido ver, es bastante fácil empezar a configurar un entorno CI/CD y que además tu equipo se ahorra un montón de tiempo en tareas rutinarias que no son necesarias hacerlas manualmente nunca más.
Recuerda que esto es una guía introductoria así que te invito a que sigas investigando más a fondo sobre el tema.
Puedes dejar cualquier duda y/o sugerencia en la caja de comentarios, como también recomendaciones para otro tutorial que te gustaría sobre cualquier tecnología en concreto en el marco de Front-end.