0614 - Bloc 3: Desplegament d'aplicacions web
Bloc 3: Explicació del projecte CI/CD amb Docker
Objectiu del projecte
L'objectiu d'aquest projecte és implementar un pipeline de CI/CD (Integració Contínua i Desplegament Continu) per a la vostra landing page utilitzant Docker en local.

Què és la CI/CD?
CI/CD (Integració Continua i Entrega/Implementació/Desplegament Continu) és una pràctica fonamental dins de DevOps (la col·laboració entre els equips de desenvolupament i operacions). CI/CD automatitza gran part del treball manual que històricament era necessari per portar el codi des de la creació fins a la producció. Abarca processos com la compilació, proves automàtiques (unitàries, d’integració, de regressió), i la implementació de les aplicacions, així com l'aprovisionament de la infraestructura.
Amb un pipeline de CI/CD, els equips poden fer canvis al codi que s’han de provar automàticament i que es distribueixen per a la seva implementació. Quan es fa servir CI/CD de manera correcta, el temps de caigudes es redueix al mínim i el codi arriba a producció molt més ràpidament.
CI/CD amb GitHub
Per què és important la CI/CD?
En l'actualitat, on els desenvolupadors treballen en entorns cada vegada més dinàmics i amb l'objectiu de lliurar funcionalitats a gran velocitat, CI/CD no només és una tendència, sinó que és fonamental per al desenvolupament de programari modern.
CI/CD AUTOMATITZA tot el procés des de la codificació fins a la producció. Això permet als equips llançar noves funcionalitats i correccions més ràpidament, millorant la capacitat de resposta del producte a les necessitats dels usuaris. A més, al integrar i implementar de manera contínua, els errors es detecten més aviat, reduint el temps de caigudes i millorant la qualitat del programari.
Un altre avantatge de la CI/CD és que permet obtenir cicles de retroalimentació més ràpids amb les parts interessades, la qual cosa assegura que el producte final sigui més proper a les expectatives dels usuaris. En general, és una pràctica essencial per a qualsevol equip que busqui un desenvolupament ràpid i de qualitat.

Què és la Integració Contínua (CI)?
La Integració Continua és la pràctica de fusionar els canvis de codi a la branca principal del repositori de manera freqüent i automàtica, activant la compilació i les proves de manera immediata per cada canvi que es fa. Així, els errors i problemes de seguretat es poden identificar i corregir més ràpidament, reduint la possibilitat de conflictes de codi entre diversos desenvolupadors.
L'objectiu és evitar esperes llargues per veure si el codi funciona correctament i poder solucionar els errors mentre encara es recorden els canvis fets.
Els processos típics de validació del codi comencen amb l'anàlisi de codi estàtic, on es verifica la qualitat del codi. Després, el sistema de CI empaqueta i compila el codi per realitzar més proves automàtiques.

Què és la Entrega Contínua (CD)?
La Entrega Contínua complementa la CI i automatitza el procés d'aprovisionament d'infraestructura i llançament de les aplicacions. Un cop el codi ha estat provat i construït en el procés de CI, la CD pren el relleu en les etapes finals per assegurar que el codi es pot implementar en qualsevol entorn en qualsevol moment.
Amb la CD, el software està dissenyat per poder ser implementat a producció en qualsevol moment, i el procés d'implementació pot ser manual o automàtic. Això facilita la disponibilitat constant de noves versions i millores de l'aplicació.
Què és la Implementació Contínua?
L'Implementació Contínua va un pas més enllà, permetent que les aplicacions es puguin implementar automàticament a producció sense necessitat d'intervenció manual. Els equips de DevOps establixen prèviament els criteris per als llançaments de codi, i quan aquests criteris es compleixen, el codi s'implementa de manera automàtica al sistema de producció.
Si bé és possible fer integració contínua (CI) sense tenir implementació contínua (CD), no es pot tenir una CD sense primer aplicar una bona CI. Això es deu al fet que és difícil implementar en producció sense les bases de CI, com la integració del codi en un repositori compartit, les proves automatitzades i les compilacions petites i freqüents.

Què són els Pipelines de CI/CD?
Un pipeline de CI/CD és un procés automatitzat que utilitzen els equips de desenvolupament per millorar la creació, prova i implementació d'aplicacions. Com el seu nom indica, combina Integració Continua (CI) i Entrega Contínua (CD) en un únic flux de treball, que automatitza tot el procés de desenvolupament.
La integració d'un pipeline de CI/CD al teu flux de treball ajuda a minimitzar el risc d'errors en el procés d'implementació, ja que les proves i compilacions automàtiques detecten i corregeixen errors de manera ràpida.
Fonaments de CI/CD
Hi ha vuit elements fonamentals de CI/CD que cal tenir en compte per assegurar l'eficiència de tot el procés de desenvolupament:
- Repositori de codi centralitzat: És imprescindible tenir un repositori centralitzat que albergui tot el codi i els scripts necessaris per compilar i provar l’aplicació.
- Revisions freqüents de la branca principal: Cal integrar els canvis de manera freqüent a la branca principal per reduir conflictes de codi.
- Compilacions automatitzades: Els scripts han de permetre la compilació automàtica del codi des d'un sol comandament.
- Autoproves durant la compilació: Les proves han de ser automàtiques i han d'assegurar que un error en les proves pari la compilació.
- Iteracions petites i freqüents: Fer canvis petits i freqüents facilita la detecció de conflictes i errors.
- Entorns de prova estables: El codi ha de ser provat en un entorn de prova que sigui una còpia del d’producció.
- Màxima visibilitat: Tots els desenvolupadors han de poder veure l'estat dels executables i els canvis fets al codi.
- Implementacions predecibles i segures: Les implementacions han de ser tan rutinàries i segures que es puguin fer en qualsevol moment sense por a causar errors.
Beneficis de CI/CD
Alguns dels beneficis més destacats de CI/CD són:
- Millor experiència per a usuaris i clients: Menys errors en producció milloren l’experiència de l'usuari.
- Llançaments més ràpids: Permet llançar funcionalitats més ràpidament, amb costos de desenvolupament més baixos i un major avantatge competitiu.
- Menys correccions tardanes: Proves més freqüents redueixen la necessitat de canvis importants i poden resoldre els errors més ràpidament.
- Compliment de terminis amb més fiabilitat: La predictibilitat de les implementacions permet complir millor els terminis.
- Reducció de l’estrès i l’esgotament de l’equip de desenvolupament: Automatitzant processos, el temps dels desenvolupadors es pot dedicar a tasques més gratificants.
Com s'integra CI/CD en l'entorn de DevOps?
CI/CD és una pràctica clau dins de DevOps, ja que elimina les barreres entre el desenvolupament (Dev) i les operacions (Ops). Automatitzant processos com la compilació, les proves i la implementació, CI/CD permet entregar versions de software de manera més ràpida i fiable. La seva aplicació dins de DevOps millora la col·laboració, la qualitat del producte i l'eficiència dels equips.
Integrar CI/CD amb altres pràctiques de DevOps, com la seguretat al principi del desenvolupament i la millora dels cicles de retroalimentació, ajuda a crear una cultura de millora contínua, afavorint una producció de programari més àgil i segura.

Aplicació al projecte en local de la landing page amb integració CI/CD i Docker
Com que en el projecte actual no podem utilitzar serveis externs de CI/CD (com GitHub Actions, GitLab CI, Jenkins, etc.) ja que tenim els contenidors docker en local, implementarem un pipeline de CI/CD bàsic en local utilitzant git hooks per automatitzar la construcció, prova i desplegament de la nostra landing page.
Introducció a Git Hooks
Els Git Hooks són una funcionalitat integrada de Git que permet als desenvolupadors automatitzar tasques i establir polítiques en diferents punts del flux de treball de Git. Mitjançant l’escriptura de scripts personalitzats que Git pot executar en moments clau del procés de desenvolupament, els Git Hooks permeten als desenvolupadors optimitzar el seu flux de treball, garantir la qualitat del codi i imposar polítiques específiques del projecte. En aquest tutorial, explorarem què són els Git Hooks i com utilitzar-los de manera efectiva.

Què són els Git Hooks?
Els Git Hooks són scripts que Git pot executar de manera automàtica quan es produeixen certs esdeveniments, com ara abans o després d’un commit, push o merge. Existeixen diversos tipus de Git Hooks, cadascun amb una finalitat específica. Per exemple, el hook pre-commit es pot utilitzar per garantir que el codi segueixi un format determinat o per executar proves abans d’efectuar un commit. El pre-push pot servir per evitar que es faci un push a determinades branques o per executar proves addicionals abans d’enviar el codi. El post-merge es pot fer servir per realitzar accions un cop s'ha completat un merge, com actualitzar les dependències o generar documentació.
Els scripts de hook estan només limitats per la imaginació del desenvolupador. Alguns exemples comuns de scripts de hook inclouen:
- pre-commit: Verificar l'ortografia dels missatges de commit.
- pre-receive: Imposar estàndards de codi del projecte.
- post-commit: Enviar un correu electrònic o SMS a l'equip informant d'un nou commit.
- post-receive: Fer un push del codi a producció.
Com Utilitzar els Git Hooks
Per utilitzar els Git Hooks, només cal que creïs scripts executables a la carpeta .git/hooks dins del teu repositori Git. Els scripts han de portar el nom de l’esdeveniment del Git Hook al qual corresponen (per exemple, pre-commit, pre-push, post-merge) i cal que tinguin els permisos adequats (per exemple, utilitzant chmod +x). Un cop els scripts estan configurats, Git els executarà automàticament quan es produeixin els esdeveniments corresponents.
Exemple d'ús de Git Hooks
Imagina que vols assegurar-te que cada commit compleix certs estàndards de format o que es realitzen proves automàtiques abans d'acceptar els canvis. Per això, pots crear un script pre-commit que executi aquestes accions abans de permetre que el commit es faci:
- Afegeix un script de hook al directori
.git/hooksdel teu repositori. - Anomena el fitxer com pre-commit i fes-lo executable (
chmod +x pre-commit). - En l'interior del script, escriu la lògica necessària (per exemple, executar proves de format o unitàries).
Això garantirà que només es puguin fer commits que compleixin les condicions establertes, ajudant a mantenir el codi net i de qualitat.
Exemple bàsic d'un script pre-commit en bash:
-
Crea o edita el script pre-commit: El fitxer ha d’estar a la carpeta
.git/hooksdins del teu repositori. Si no existeix, crea'l amb el nompre-commit. -
Escriu l'script: A dins del fitxer, escriu el següent codi:
Exemple d'script pre-commit
#!/bin/sh
# Mostra un missatge indicant que s'està executant el pre-commit
echo "Estic executant el pre-commit..."
# Obté la branca actual en què es troba
branch_name=$(git rev-parse --abbrev-ref HEAD)
# Mostra la branca actual
echo "El commit s'està fent des de la branca: $branch_name"
echo "ara podriem aplicar lògica específica segons la branca"
# En realitat aquests tipus d'scripts serveixen per fer comprovacions abans del commit,
# revisar la qualitat del codi, lintejar codi, ...
# Gracies a saber la branca actual, podríem afegir lògica per impedir commits en certes
# branques, per exemple:
# if [ "$branch_name" = "main" ]; then ...
# El script pre-commit es completa aquí i permet que el commit segueixi
exit 0
Explicació del codi:
#!/bin/sh: Aquesta línia indica que el script s'ha d'executar amb l'intèrpret de shell.echo "Estic executant el pre-commit...": Imprimeix un missatge a la consola indicant que s'està executant el hook de pre-commit.branch_name=$(git rev-parse --abbrev-ref HEAD): Aquesta línia utilitza el comandamentgit rev-parse --abbrev-ref HEADper obtenir el nom de la branca actual.echo "El commit s'està fent des de la branca: $branch_name": Imprimeix el nom de la branca en la qual es troba l'usuari al moment de fer el commit.exit 0: Aquesta línia indica que el script ha acabat correctament i que es permet el commit. Si retornessis un valor diferent de 0, es cancel·laria el commit.
Passos per utilitzar el script:
- Crea el fitxer
.git/hooks/pre-commitdins del teu repositori. - Fes-lo executable amb el següent comandament:
chmod +x .git/hooks/pre-commit
- Prova el pre-commit fent un commit qualsevol i veuràs que es mostren els missatges a la consola indicant en quina branca es troba i que s’està executant el pre-commit.
Aquest script és molt bàsic, però pots afegir més funcionalitat, com fer comprovacions de format de codi o provar l'estat de l'aplicació abans de permetre el commit.
Conclusió
Els Git Hooks són una eina poderosa per a l’automatització de tasques repetitives i per a l’aplicació de polítiques dins de Git, millorant la qualitat del codi i optimitzant el flux de treball de desenvolupament. Amb una mica de creativitat i les eines adequades, pots personalitzar els Git Hooks per adaptar-los a les necessitats específiques del teu projecte.