Frontend Angular : démonstration CI/CD, DevSecOps et déploiement Cloud AWS
Objectif : Configurer un dépôt Git et GitHub pour automatiser le déploiement d'une application Angular (un site web statique) vers AWS S3 et CloudFront.
Contexte
Vous avez à votre disposition un projet Angular complet ainsi qu'un fichier de workflow GitHub Actions (.github/workflows/ci-cd.yml).
Votre infrastructure AWS est déjà prête (un bucket S3 pour stocker les fichiers et une distribution CloudFront pour les diffuser rapidement).
Votre mission est de vous concentrer uniquement sur la partie Git et GitHub Actions pour "connecter" votre code à l'infrastructure AWS et automatiser le déploiement.
Étapes à réaliser
1. Prise de connaissance et configuration du pipeline
Le fichier .github/workflows/ci-cd.yml est le "cerveau" de notre automatisation.
- Ouvrez et lisez ce fichier dans PyCharm. Essayez de comprendre son fonctionnement :
-
on: push: branches: [ master ]: le pipeline se déclenche à chaquepushsur la branchemaster. -
jobs:: il y a deux "jobs" (travaux) qui s'enchaînent.- Job
test(La CI) : il installe Node.js, teste le code (npm test), "lint" le code (npm run lint), et surtout, il "build" l'application (npm run build). L'étape finale,upload-artifact, met de côté le résultat (les fichiers statiques HTML/CSS/JS). - Job
deploy-aws-cloudfront(La CD) : il ne se lance que si la CI a réussi. Il télécharge les fichiers, se connecte à AWS, les envoie sur S3 (stockage), puis force CloudFront (le cache) à se mettre à jour.
graph TD subgraph "Workflow GitHub Actions" A[Push sur 'master'] --> B(Lancement du job 'test'); B -- "npm test, npm run build" --> C{CI Réussie ?}; C -- Oui --> D(Lancement du job 'deploy-aws-cloudfront'); C -- Non --> F(Échec); D -- "upload S3, invalidation CloudFront" --> E(Site web déployé); end - Job
- Modifiez le fichier : ce pipeline a besoin d'une information cruciale.
- Trouvez la ligne :
CLOUDFRONT_DISTRIBUTION_ID: "VOTRE-ID-CLOUDFRONT" - Remplacez
VOTRE-ID-CLOUDFRONTpar l'identifiant qui vous a été fourni dans le canal TEAMS de ce cours. - Enregistrez le fichier.
2. Initialiser Git dans PyCharm
Votre projet n'est pas encore suivi par Git.
- Allez dans le menu
VCS(Version Control System). - Cliquez sur
Enable Version Control Integration.... - Choisissez Git dans la liste et validez. (Vous verrez vos fichiers changer de couleur).
3. Créer le dépôt distant (GitHub)
- Allez sur GitHub.com et connectez-vous.
- Créez un Nouveau Dépôt (New Repository).
- Nommez-le (ex:
hello-world-angular). - Sélectionnez
Private(Privé). - IMPORTANT : Ne cochez AUCUNE case (ni
README, ni.gitignore). Laissez-le vide. - Cliquez sur
Create repository.
4. Configurer les Secrets AWS dans GitHub
Le pipeline doit pouvoir se connecter à AWS. Pour cela, nous utilisons des secrets.
- Sur la page de votre nouveau dépôt GitHub, allez dans l'onglet
Settings(Paramètres). - Dans le menu de gauche, naviguez vers
Secrets and variables>Actions. - Cliquez sur
New repository secret. - Créez le premier secret (le nom doit être exact) :
- Nom :
AWS_ACCESS_KEY_ID - Valeur : (Insérez la valeur fournie dans le canal TEAMS de ce cours)
- Créez le second secret :
- Nom :
AWS_SECRET_ACCESS_KEY - Valeur : (Insérez la valeur fournie dans le canal TEAMS de ce cours)
5. Lier PyCharm et GitHub
Votre code est en local, le dépôt est sur GitHub. Il faut maintenant les lier.
- Dans PyCharm, allez dans
Git>Manage Remotes.... - Cliquez sur le
+. - Pour l'URL, collez l'URL fournie par GitHub (celle en
https. ex:https://github.com/votre-nom/hello-world-angular.git). - Laissez le nom
origin. Cliquez surOK.
6. Le premier commit & push (Déclenchement)
Tout est prêt. Envoyons le code !
- Ouvrez la fenêtre
Commit(souvent à gauche ou viaCtrl+K/Cmd+K). - Cochez tous vos fichiers pour les "Stager" (les inclure dans le commit).
- Écrivez un message de commit (ex:
Initial commit). - Cliquez sur la flèche à côté de
Commitet choisissezCommit and Push.... - Confirmez le
pushvers la brancheorigin/master.
7. Observer le Pipeline
- Retournez sur votre dépôt GitHub.
- Cliquez sur l'onglet
Actions. - Vous devriez voir votre pipeline en cours d'exécution (une icône jaune).
- Cliquez dessus pour voir les étapes en direct. Attendez que le job
testfinisse, puis que le jobdeploy-aws-cloudfrontse lance et se termine. - Une fois terminé, votre site est en ligne !
8. Provoquer un nouveau déclenchement
Faisons un changement pour prouver que l'automatisation fonctionne.
- Retournez dans PyCharm.
- Ouvrez le fichier
src/app/app.component.html. - Ajouter un espace en fin de fichier (juste pour modifier quelque chose).
- Ouvrez la fenêtre
Commit. - Écrivez un message (ex:
Mise à jour du titre). - Faites
Commit and Push.... - Retournez sur l'onglet
Actionsde GitHub : un nouveau pipeline s'est automatiquement lancé pour déployer votre modification.
Note importante : comment cela se passe en entreprise ?
Ce que nous avons fait est une simplification pour l'exercice.
Trunk Based Development
Avec la stratégie Trunk Based Development, on s'autorise à travailler directement sur la branche master (ou main), mais on s'autorise tout de même à créer des branches de fonctionnalité avec une durée de vie très courte (quelques heures). Une telle stratégie est recommandée pour exécuter la CI/CD plus souvent.
graph TD
M1["master (c1)"] --> M2["master (c2)"]
M2 --> F1["feature/A (fA1)"]
F1 --> M3["master (m1 - merge)"]
M3 --> F2["feature/B (fB1)"]
F2 --> M4["master (m2 - merge)"]
M4 --> M5["master (c3)"]
Git Flow
En entreprise, vous verrez également la stratégie Git Flow, qui est un peu plus formelle :
- Branche
master(oumain) : contient le code en production. Personne n'y touche directement. - Branche
develop: contient la version en cours de développement. - Branches de fonctionnalité (ou bug) : pour chaque nouvelle tâche ou bug (ex:
feature/add-login), vous créez une branche à partir dedevelop, avec une durée de vie plus longue (quelques jours).
Le pipeline de CI (Tests) :
Le pipeline de test (comme celui de notre job test) se déclencherait automatiquement lorsque vous essayez de "merger" (fusionner) votre branche de fonctionnalité dans develop (via une Pull Request).
Le pipeline de CD (Déploiement) :
Le déploiement en production (notre job deploy-...) ne se déclencherait PAS sur un simple commit, mais seulement lorsque le chef de projet décide de créer une nouvelle "version" (un tag Git, ex: v1.0.1).
graph TD
%% Définir les lignes principales
subgraph Ligne master
M0("init") --> M1("v1.0.0") --> M2("v1.0.1")
end
subgraph Ligne develop
D1("d1") --> D2("d2 (merge login)") --> D3("d3") --> D4("d4 (merge release)") --> D5("d5 (merge hotfix)")
end
%% Créer les liens entre les lignes
M0 --> D1;
%% Branche de fonctionnalité
D1 --> F1("feature/login")
F1 --> D2
%% Branche de release
D3 --> R1("release/v1.0")
R1 --> M1
R1 --> D4
%% Branche de hotfix
M1 --> H1("hotfix/auth-bug")
H1 --> M2
H1 --> D5