Salta el contingut
 

Fluxos de treball automatitzats en CI/CD

Joan Puigcerver Ibáñez

j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Automatització en CI/CD

El concepte d'Integració Contínua (Continuous Integration o CI) i Desplegament Continu (Continuous Deployment o CD) és una pràctica que permet als equips de desenvolupament integrar els canvis en el codi de manera regular i distribuir-los de manera automàtica.

Aquesta pràctica és essencial en el desenvolupament modern de software, ja que accelera el procés de lliurament de noves funcionalitats, redueix el temps de parada i millora la qualitat del projecte mitjançant l'automatització de tasques repetitives, sense necessitat d'intervenció manual.

Les tasques més comunes que es poden automatitzar són:

  • Compilació i empaquetatge de l'aplicació
  • Proves i validacions
  • Anàlisi de la qualitat del codi: linters, anàlisi estàtica, etc.
  • Desplegament de l'aplicació i gestió de llançaments
  • Generació i publicació de documentació

Què és la integració contínua (CI)?

La Integració Contínua (Continuous Integration o CI) consisteix en integrar de manera contínua i freqüent els canvis a la branca principal del projecte, provant de manera automàtica cada canvi quan s'integra al repositori.

Això permet detectar i solucionar errors o vulnerabilitats de manera més senzilla i ràpida, ja que els canvis són més xicotets i fàcils de revisar.

A més, la integració contínua facilita la col·laboració entre els membres de l'equip, ja que minimitza la possibilitat de conflictes entre diferents branques encara que es treballa de manera paral·lela.

Un flux de treball típic de CI inclou els següents passos:

  • Anàlisi estàtica del codi, que verifique la qualitat del codi font i assegure que compleix amb els estàndards establerts.

  • Compilació del projecte i execució de proves automatitzades, que assegure que el projecte es pot compilar correctament i que les funcionalitats implementades funcionen com s'espera.

Què és el desplegament continu (CD)?

El Desplegament Continu (Continuous Deployment o CD) és el procés d'automatitzar les tasques necessàries per desplegar una aplicació. El CD pot incloure des de preparar la infraestructura fins a desplegar l'aplicació a un entorn de proves o producció.

Un flux de treball típic de CD inclou els següents passos:

  • Desplegament automàtic a un entorn de proves, on es poden realitzar proves addicionals i validacions.

  • Desplegament automàtic a l'entorn de producció, que permet lliurar noves funcionalitats als usuaris de manera ràpida i segura.

Fluxos de treball

Els fluxos de treball a CI/CD o, també coneguts com a CI/CD pipelines, són processos automatitzats que s'encarreguen de la compilació, la prova i el desplegament de les aplicacions. Es componen de diferents tasques que s'executaran automàticament sense necessitat d'intervenció humana.

Exemple d'un flux de treball

https://katalon.com/

Figura 1. Exemple d'un flux de treball.

Pot ser que cadascuna d'aquestes tasques necessiten portar a terme múltiples accions, que podran ser configurades en l'entorn que s'utilitze.

Entorns i eines de CI/CD

Existeixen diferents entorns i eines de CI/CD que permeten configurar i gestionar els fluxos de treball automatitzats. Algunes de les més comunes són:

  • GitHub Actions: Permet configurar fluxos de treball automatitzats sobre repositoris de Git allotjats a GitHub.
  • GitLab CI/CD: Permet configurar fluxos de treball automatitzats sobre repositoris de Git allotjats a GitLab.
  • Jenkins: Servidor d'automatització de codi obert. Necessita ser instal·lat i configurat.
  • Travis CI: Servei d'automatització de codi allotjat al núvol. Es codi privatiu i requereix d'un compte de pagament.
  • Azure Pipelines: Servei d'automatització de Microsoft Azure.
  • AWS CodePipeline: Servei d'automatització de Amazon Web Services.

GitHub Actions

GitHub Actions és una funcionalitat de GitHub que permet crear fluxos de treball sobre un repositori. Es gestionen des de l'apartat Actions, on es poden consultar les tasques d'automatització configurades i les execucions d'aquestes.

Cada projecte té unes característiques i necessitats pròpies i, per tant, caldrà adaptar els processos de la naturalesa del projecte.

Consulteu els Exemples de fluxos de treball per trobar exemples de fluxos de treball més complexos i adaptats a diferents tipus de projectes.

Configuració d'un flux de treball

Les tasques d'automatització es defineixen en fitxers de configuració YAML, que s'han de situar dins del directori .github/workflows/.

Repositori d'exemple: exemple-actions

.github/workflows/demo.yml
name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
on:
  push:
  workflow_dispatch:
jobs:
  Explore-GitHub-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v5
      - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."

GitHub Docs

La configuració bàsica d'una tasca d'automatització es fa amb els següents camps:

  • name: Nom de la tasca
  • on: Esdeveniments que faran que s'execute la tasca.
  • jobs: Llista de tasques a executar.

Cada tasca té les següents seccions:

  • runs-on: Tipus de màquina on s'executarà la tasca.
  • if: (Opcional) Condició que ha de complir-se per a executar la tasca.
  • steps: Llista de passos a executar.

    Cada pas ha de ser una comanda de shell (run) o una acció de GitHub predefinida (uses).

    • name: Nom del pas
    • run: Comanda de shell que s'executarà.
    • uses: Acció de GitHub predefinida que s'executarà.

      Cada acció pot tenir els seus propis paràmetres de configuració, que s'estableixen dins de la secció with.

Execució d'una automatització

Les tasques d'automatització s'executen automàticament quan es compleixen les condicions definides en la secció on de la configuració.

A la secció Actions es poden consultar les execucions de les tasques d'automatització definides en el repositori.

A més, és possible configurar una tasca perquè es puga executar manualment si s'especifica workflow_dispatch en la secció on de la configuració.

on:
  workflow_dispatch:

Això permet llançar l'automatització manualment des de la secció Actions.

Execució manual d'una automatització

Figura 2. Execució manual d'una automatització des de Actions.

En cas de necessitar provar una tasca d'automatització localment sense haver de publicar canvis al repositori, es pot fer ús d'eines com act.

Aquesta eina utilitza Docker per simular l'entorn d'execució semblant a l'entorn de GitHub Actions, que permet provar les tasques sense haver de publicar els canvis al repositori remot.

jpuigcerver@fp:~/exemple-actions (main) $ act
INFO[0000] Using docker host 'unix:///var/run/docker.sock', and daemon socket 'unix:///var/run/docker.sock' 
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Set up job
[GitHub Actions Demo/Explore-GitHub-Actions] 🚀  Start image=catthehacker/ubuntu:act-latest
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker pull image=catthehacker/ubuntu:act-latest platform= username= forcePull=true
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker create image=catthehacker/ubuntu:act-latest platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[] network="host"
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker run image=catthehacker/ubuntu:act-latest platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[] network="host"
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[node --no-warnings -e console.log(process.execPath)] user= workdir=
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Set up job
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main echo "🎉 The job was automatically triggered by a push event."
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash -e /var/run/act/workflow/0] user= workdir=
| 🎉 The job was automatically triggered by a push event.
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main echo "🎉 The job was automatically triggered by a push event." [68.068069ms]
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main echo "🐧 This job is now running on a Linux server hosted by GitHub!"
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash -e /var/run/act/workflow/1] user= workdir=
| 🐧 This job is now running on a Linux server hosted by GitHub!
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main echo "🐧 This job is now running on a Linux server hosted by GitHub!" [66.309582ms]
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main echo "🔎 The name of your branch is refs/heads/main and your repository is cursgit/exemple-actions."
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash -e /var/run/act/workflow/2] user= workdir=
| 🔎 The name of your branch is refs/heads/main and your repository is cursgit/exemple-actions.
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main echo "🔎 The name of your branch is refs/heads/main and your repository is cursgit/exemple-actions." [65.540094ms]
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main Check out repository code
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker cp src=/home/jpuigcerver/exemple-actions/. dst=/home/jpuigcerver/exemple-actions
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main Check out repository code [15.128121ms]
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main echo "💡 The cursgit/exemple-actions repository has been cloned to the runner."
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash -e /var/run/act/workflow/4] user= workdir=
| 💡 The cursgit/exemple-actions repository has been cloned to the runner.
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main echo "💡 The cursgit/exemple-actions repository has been cloned to the runner." [65.674574ms]
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main echo "🖥 The workflow is now ready to test your code on the runner."
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash -e /var/run/act/workflow/5] user= workdir=
| 🖥 The workflow is now ready to test your code on the runner.
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main echo "🖥 The workflow is now ready to test your code on the runner." [75.593933ms]
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main List files in the repository
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash -e /var/run/act/workflow/6] user= workdir=
| README.md
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main List files in the repository [85.435409ms]
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main echo "🍏 This job's status is success."
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash -e /var/run/act/workflow/7] user= workdir=
| 🍏 This job's status is success.
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main echo "🍏 This job's status is success." [67.346446ms]
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Complete job
[GitHub Actions Demo/Explore-GitHub-Actions] Cleaning up container for job Explore-GitHub-Actions
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Complete job
[GitHub Actions Demo/Explore-GitHub-Actions] 🏁  Job succeeded

Execució d'una automatització a una Pull Request

Les tasques d'automatització també es poden combinar amb les Pull Requests per comprovar que els canvis proposats compleixen amb els estàndards de qualitat del projecte abans de ser integrats a la branca principal, facilitant la integració contínua (CI).

Algunes de les tasques més comunes que es defineixen en aquest cas són

  • Execució de proves automatitzades
  • Anàlisi de l'estil del codi
  • Anàlisi de la qualitat del codi

Execució d'una automatització a una Pull Request

Figura 3. Exemple d'una tasca d'automatització que s'executa a una Pull Request

Execució correcta d'una automatització a una Pull Request

Figura 4. Exemple d'una tasca d'automatització que s'ha executat correctament a una Pull Request

Secrets

De vegades, les tasques d'automatització necessiten informació sensible per a executar-se, com ara credencials d'accés a serveis externs, claus d'API, etc.

En aquests casos, és important no incloure aquesta informació directament en els fitxers de configuració, ja que aquests fitxers són públics i poden ser accedits per qualsevol persona que tinga accés al repositori.

GitHub Actions permet gestionar aquesta informació sensible d'una manera segura mitjançant els Secrets. Són variables d'entorn que es poden utilitzar en les tasques d'automatització, però que no són visibles ni accessibles des dels fitxers de configuració.

Per a configurar un secret, cal anar a la secció Settings del repositori, a l'apartat Secrets and variables > Actions.

GitHub Pages

GitHub Pages és un servei de GitHub que permet publicar llocs web estàtics1 directament des d'un repositori de GitHub.

En comptes de GitHub gratuïts, es permet configurar GitHub Pages en repositoris públics.

En canvi, en els repositoris privats, es requereix d'un compte de pagament.

No obstant això, GitHub proporciona llicències gratuïtes per a estudiants i professors des de GitHub Education.

Aquest servei és útil per a publicar:

  • La documentació d'un projecte.
  • Portafolis personals o de projectes.
  • Llocs web estàtics generats per eines com Jekyll o MkDocs.

Per exemple, aquest lloc web està publicat amb GitHub Pages.

Configuració de GitHub Pages

GitHub Pages pot ser habilitat i configurat en la secció Settings del repositori, dins de l'apartat Pages.

Configuració de GitHub Pages

Figura 5. Configuració de GitHub Pages en aquest repositori.

GitHub Pages pot ser configurat per publicar-se de dues maneres diferents:

  • Mitjançant una automatització: Un flux de treball que construeix, carrega i desplega els continguts del lloc web.

  • A partir del contingut d'una branca i directori concrets del repositori.

    Es pot triar qualsevol branca, però sols els directoris / (arrel del repositori) o /docs.

Bibliografia


  1. Un lloc web estàtic és un lloc web que no requereix d'un servidor web per generar les pàgines HTML, sinó que les pàgines ja estan generades i són servides directament. 

📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.