Salta al contingut principal

CI/CD amb GitHub Actions

 Com actualització del projecte, establiré una integració contínua/entrega contínua: aquesta ens permetrà emmagatzemar el treball, actualitzar-lo de manera automàtica i fer proves contínues.

ci-cd
 Això ens ajudarà pensant en el projecte a tenir un registre clar dels canvis i a validar de forma integrada tant l'aplicació, com la infraestructura (que utilitza Terraform i Docker), assegurant que cada actualització sigui neta i controlada.

00

02
Ens dirigim al repositori flask_s3_file_manager i fem clic a la pestanya on diu Settings. Després a la columna esquerra despleguem el menú de Secrets and variables i fem clic a Actions. Allà trobarem una cosa anomenada Repository secrets on crearem un amb el nom AWS_ACCESS_KEY_ID, introduint com a secret l'ID d'AWS que tenim a la nostra CLI per l'usuari boto3_user, i afegim el secret. Fem el mateix per AWS_SECRET_ACCESS_KEY. En el cas de no recordar aquestes dades, podem executar un cat ~/.aws/credentials a la terminal, recordant com sempre no compartir MAI aquestes claus, ja que estaríem comprometent tot allò a què tingui accés aquest compte.

03
Un cop creats els secrets, creem una carpeta que es digui .github/workflows i a dins d'ella un arxiu anomenat deploy.yml. L'editem i configurem els disparadors (on: push: branches i pull_request) junt amb els blocs de jobs.

Establim on s'executarà la tasca (que serà ubuntu-latest) i a partir d'aquí definim els steps. Afegint un missatge de prova i una comprovació inicial.

Fet això, guardarem els canvis amb git add ., fem un git commit i un git push origin feature/terraform-aws-migration. Si anem a la pestanya Actions del repositori a GitHub, veurem com s'executa el flux de treball de CI/CD. Més endavant configurarem la versió de Python que executarà el codi, instal·larem les dependències necessàries del nostre requirements.txt i afegirem pytest.

Vaig haver d'enfrontar-me amb alguns problemes que ja coneixia de les meves proves locals, la versió de Python xocava amb la versió de Pytest, el que va provocar una fallada al pipeline. Per solucionar-ho, vaig anar directe al detall de l'error a GitHub Actions:


·L'error ens deia que no es podia importar mock_s3 des de moto. Això passa perquè ara la llibreria s'ha actualitzat i ara es fa dir mock_aws.

·Per solucionar-ho, vaig anar a l'arxiu de tests "test_s3_client.py", allà li vaig canviar dues coses, from moto import mock_s3 per mock_aws, i a la "fixture" de @pytest.fixture vaig actualitzar mock_s3() per mock_aws(). Amb això, els tests van tornar a passar sense problemes.

Després d'això, vaig configurar els passos d'autenticació a AWS (enllaçant-los als secrets creats prèviament), i vaig preparar l'integració amb ECR utilitzant l'acció oficial aws-actions/amazon-ecr-login@v2 per construir i pujar la imatge de Docker a ECR.

Per aïllar i provar l'automatització del pipeline de forma neta, vaig crear una nova branca dedicada anomenada feature/terraform-pipeline.

Aquí em vaig trobar amb una peça del trencaclosques que em faltava: creia que tan sols pujant la imatge ja funcionaria, però el pipeline fallava perquè el repositori d'ECR no existia prèviament. En afegir la plantilla de Terraform al deploy.yml i pujar els canvis a la branca feature/terraform-pipeline, Terraform es va encarregar d'aixecar la infraestructura necessària (creant el ECR) i permetent que la imatge de Docker es pugés i es desplegués (que a més incloïa ECS Fargate) amb èxit.

Per últim, per mantenir els costos a ratlla i deixar-ho tot net per les proves, vaig utilitzar l'ordre de la CLI per esborrar els recursos creats aws ecr delete-repository --repository-name flask-s3-file-manager --force --region eu-west-1.

Comentaris

Entrades populars d'aquest blog

Projecte Flask + S3 #3: Del servidor local a S3

  Aquesta és la tercera part que parlo del projecte. Si encara no estàs seguint-lo, et recomano que miris les entrades anteriors dedicades al tema. A la primera part vam configurar l’entorn i decidir les pautes. A la segona , dedicàrem el seu temps a la importància de fer una bona classe S3Client i uns tests de pytest correctes. A l’hora de pensar en desenvolupar l’app , hem de canviar la manera de pensar. Passem d’una filosofia de backend en la que pensem únicament en Python - A una full-stack amb Flask. Què és un full-stack ? La seva traducció literal és una “pila complerta”, es refereix a quan en programació s’escriu un codi des de zero. I disposa de tres parts:  Front-end , la interfície d'usuari, és el que interactua directament des del seu dispositiu i en el nostre cas és HTML/Jinja2. Back-end , el cervell que s'encarrega de processar les peticions del Front-end, executar la lògica de l’aplicació, les autoritzacions i la connexió amb la base de dades. Base de dades , ...

Droidian, cap a l'ordinador a la butxaca o no

  Al nostre dia a dia, poc ens parem a pensar en un company que ens fa la vida més fàcil , ens facilita l'accés a la informació, ens connecta amb els amics locals i d'arreu del món. Hi podem escoltar música, el podem utilitzar de GPS, hi podem editar vídeos o fins i tot dibuixar-hi (tot i que encara no es gaire còmode), podem consultar les nostres pàgines web favorites, aprendre nous idiomes... Si ens hi fixem, encara podem seguir dient més sobre els smartphones. En les seves característiques negatives podem trobar addiccions, estimulacions constants, desconnexió del món real , control sobre nosaltres i de la nostra privacitat. Potser estic fent una introducció massa llarga únicament per descriure i per posar en valor el hardware que tenen aquests petits dispositius. Si parlem d'hardware (o de maquinari) i comparem els primers models amb els dels últims 5 anys, ja estem parlant de supercomputadores . Sense anar més lluny, fa uns pocs mesos, va sortir al mercat el Macbook Ne...

Projecte Flask + S3 #2: El cervell i la xarxa de seguretat

  Aquesta és la segona part del projecte. Si has parat aqui et convido a consultar la primera entrada , on vam configurar l’entorn i vam establir els requisits previs. Ara passem a la implementació del codi. Objectiu d’avui/Introducció Documentar la creació del backend . Tot el desenvolupament del codi i que faré menció el podeu trobar al repositori corresponent al meu perfil de Git , o sigui que pots anar directament allà o obrir-lo a una finestra mentre veus els comentaris que descric. No vull deixar-me a aquesta introducció la importància que ha tingut pel bon i correcte desenvolupament del codi:  La documentació oficial d’ Amazon Web Services de Boto3  i les seves guies de millors pràctiques, per exemple . La Classe S3Client i la seva importància La finalitat de crear una classe S3Client com a façana/embolcall(més conegut com a Wrapper) és que amaga tota la complexitat de boto3. Faig un parèntesi, diguem que:  Estem creant "un embolcall dins d’un altre embol...