# Déploiement Continu avec GitHub Actions

Le déploiement continu (CD) consiste à automatiser le déploiement des nouvelles versions d'une application directement dans des environnements de production après avoir passé les étapes de tests et de validation. GitHub Actions permet de configurer des pipelines de déploiement continu (CD) pour des plateformes de cloud telles qu'AWS, Azure, ou Google Cloud Platform (GCP).


---

## 1. Déployer une Application sur des Plateformes de Cloud (AWS, Azure, GCP)

GitHub Actions peut être utilisé pour automatiser le déploiement d'une application sur des services cloud populaires tels que **AWS**, **Microsoft Azure**, ou **Google Cloud Platform (GCP)**. Chaque fournisseur cloud a ses propres outils et services pour gérer le déploiement des applications.

### 1.1 Déploiement sur AWS

AWS propose plusieurs services pour héberger des applications, notamment **Elastic Beanstalk**, **ECS (Elastic Container Service)**, et **S3**. Avec GitHub Actions, vous pouvez configurer des workflows pour déployer automatiquement vos applications sur ces services.

#### Exemple de Workflow pour Déployer sur AWS Elastic Beanstalk

Elastic Beanstalk simplifie le déploiement et la gestion des applications sur AWS. Voici un exemple de workflow pour déployer une application Node.js sur Elastic Beanstalk.

`name: Deploy to AWS Elastic Beanstalk  on:   push:     branches:       - main  jobs:   deploy:     runs-on: ubuntu-latest      steps:       # Étape 1 : Checkout repository       - name: Checkout repository         uses: actions/checkout@v2        # Étape 2 : Configure AWS credentials       - name: Configure AWS Credentials         uses: aws-actions/configure-aws-credentials@v1         with:           aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}           aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}           aws-region: us-east-1        # Étape 3 : Déployer sur Elastic Beanstalk       - name: Deploy to Elastic Beanstalk         run: |           zip -r app.zip .  # Zipper l'application           aws elasticbeanstalk create-application-version --application-name MyApp --version-label latest --source-bundle S3Bucket=my-app-bucket,S3Key=app.zip           aws elasticbeanstalk update-environment --environment-name MyApp-env --version-label latest `

### 1.2 Déploiement sur Microsoft Azure

Azure propose plusieurs services pour héberger des applications, comme **Azure App Service** et **Azure Kubernetes Service (AKS)**. Avec GitHub Actions, vous pouvez automatiser le déploiement sur ces services en utilisant des actions spécifiques à Azure.

#### Exemple de Workflow pour Déployer sur Azure App Service

Azure App Service est une plateforme qui permet de déployer des applications web sur un environnement managé. Voici un exemple de workflow pour déployer une application web sur Azure App Service.

`name: Deploy to Azure App Service  on:   push:     branches:       - main  jobs:   deploy:     runs-on: ubuntu-latest      steps:       # Étape 1 : Checkout repository       - name: Checkout repository         uses: actions/checkout@v2        # Étape 2 : Configurer les identifiants Azure       - name: Log in to Azure         uses: azure/login@v1         with:           creds: ${{ secrets.AZURE_CREDENTIALS }}        # Étape 3 : Déployer sur Azure App Service       - name: Deploy to Azure App Service         uses: azure/webapps-deploy@v2         with:           app-name: 'my-app-service'           package: . `

### 1.3 Déploiement sur Google Cloud Platform (GCP)

Google Cloud Platform propose des services comme **Google App Engine**, **Google Cloud Run**, et **Google Kubernetes Engine (GKE)**. GitHub Actions peut être utilisé pour automatiser les déploiements sur GCP.

#### Exemple de Workflow pour Déployer sur Google Cloud Run

Google Cloud Run permet de déployer des applications conteneurisées directement depuis un dépôt GitHub. Voici un exemple de workflow pour déployer une application sur Google Cloud Run.

`name: Deploy to Google Cloud Run  on:   push:     branches:       - main  jobs:   deploy:     runs-on: ubuntu-latest      steps:       # Étape 1 : Checkout repository       - name: Checkout repository         uses: actions/checkout@v2        # Étape 2 : Configurer les identifiants Google Cloud       - name: Authenticate to Google Cloud         uses: google-github-actions/auth@v0         with:           credentials_json: ${{ secrets.GCP_SA_KEY }}        # Étape 3 : Configurer Google Cloud SDK       - name: Set up Cloud SDK         uses: google-github-actions/setup-gcloud@v1         with:           project_id: ${{ secrets.GCP_PROJECT_ID }}           service_account_key: ${{ secrets.GCP_SA_KEY }}        # Étape 4 : Construire et déployer l'image Docker sur Cloud Run       - name: Build and Deploy to Cloud Run         run: |           gcloud builds submit --tag gcr.io/${{ secrets.GCP_PROJECT_ID }}/my-app           gcloud run deploy my-app --image gcr.io/${{ secrets.GCP_PROJECT_ID }}/my-app --region us-central1 `


---

## 2. Exemples Pratiques de Pipelines de Déploiement Continu

Les pipelines CI/CD consistent en des étapes automatisées qui prennent en charge le build, les tests, et le déploiement d'une application. Voici quelques exemples pratiques de pipelines de déploiement continu avec GitHub Actions.

### Pipeline de Base pour une Application Node.js Déployée sur AWS S3

`name: CI/CD Pipeline for Node.js  on:   push:     branches:       - main  jobs:   build-and-deploy:     runs-on: ubuntu-latest      steps:       # Étape 1 : Checkout repository       - name: Checkout repository         uses: actions/checkout@v2        # Étape 2 : Installer Node.js et les dépendances       - name: Set up Node.js         uses: actions/setup-node@v2         with:           node-version: '14'        - name: Install dependencies         run: npm install        # Étape 3 : Exécuter les tests       - name: Run tests         run: npm test        # Étape 4 : Construire l'application       - name: Build application         run: npm run build        # Étape 5 : Se connecter à AWS       - name: Configure AWS Credentials         uses: aws-actions/configure-aws-credentials@v1         with:           aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}           aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}           aws-region: us-west-1        # Étape 6 : Déployer l'application sur un bucket S3       - name: Deploy to S3         run: aws s3 sync ./build s3://my-app-bucket --delete `


---

## 3. Stratégies de Déploiement : Blue/Green, Canary

GitHub Actions peut être utilisé pour implémenter différentes **stratégies de déploiement**, telles que le déploiement **Blue/Green** et le déploiement **Canary**, pour minimiser les risques lors des déploiements en production.

### 3.1 Déploiement Blue/Green

Le déploiement **Blue/Green** consiste à exécuter deux environnements distincts : l'environnement **Blue** (ancien) et l'environnement **Green** (nouveau). Une fois que le déploiement est prêt sur l'environnement Green, le trafic est basculé vers cet environnement.

#### Exemple de Workflow pour un Déploiement Blue/Green

`name: Blue/Green Deployment  on:   push:     branches:       - main  jobs:   deploy:     runs-on: ubuntu-latest      steps:       - name: Checkout repository         uses: actions/checkout@v2        # Étape 1 : Déployer sur l'environnement Green       - name: Deploy to Green environment         run: |           aws deploy create-deployment \             --application-name my-app \             --deployment-group-name GreenEnvironment \             --s3-location bucket=my-app-bucket,bundleType=zip,key=my-app.zip        # Étape 2 : Basculer le trafic vers l'environnement Green       - name: Switch traffic to Green         run: |           aws deploy update-deployment-group \             --application-name my-app \             --current-deployment-group-name BlueEnvironment \             --new-deployment-group-name GreenEnvironment `

### 3.2 Déploiement Canary

Le déploiement **Canary** consiste à déployer une nouvelle version à un petit pourcentage des utilisateurs pour tester son impact. Si la version Canary est stable, le déploiement est progressivement étendu à tous les utilisateurs.

#### Exemple de Workflow pour un Déploiement Canary

`name: Canary Deployment  on:   push:     branches:       - main  jobs:   deploy:     runs-on  : ubuntu-latest      steps:       - name: Checkout repository         uses: actions/checkout@v2        # Étape 1 : Déployer en Canary (petit pourcentage d'utilisateurs)       - name: Deploy Canary release         run: |           aws deploy create-deployment \             --application-name my-app \             --deployment-group-name CanaryEnvironment \             --s3-location bucket=my-app-bucket,bundleType=zip,key=my-app.zip \             --deployment-config-name CodeDeployDefault.OneAtATime        # Étape 2 : Augmenter progressivement le déploiement       - name: Gradually increase deployment         run: |           aws deploy create-deployment \             --application-name my-app \             --deployment-group-name ProductionEnvironment \             --s3-location bucket=my-app-bucket,bundleType=zip,key=my-app.zip `


---

## 4. Notifications sur le Statut du Déploiement (Slack, Email)

GitHub Actions permet d'envoyer des notifications sur le statut d'un déploiement réussi ou échoué via **Slack**, **Email**, ou d'autres outils de collaboration.

### 4.1 Notifications Slack

Vous pouvez configurer GitHub Actions pour envoyer des notifications via Slack lorsque des événements spécifiques se produisent, comme l'achèvement d'un déploiement.

#### Exemple de Workflow avec Notification Slack

`name: CI/CD Pipeline with Slack Notifications  on:   push:     branches:       - main  jobs:   build-and-deploy:     runs-on: ubuntu-latest      steps:       - name: Checkout repository         uses: actions/checkout@v2        - name: Build application         run: npm run build        - name: Deploy to production         run: ./deploy.sh    notify:     runs-on: ubuntu-latest     needs: build-and-deploy     steps:       - name: Send Slack Notification         uses: rtCamp/action-slack-notify@v2         env:           SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}           SLACK_MESSAGE: 'The deployment to production was successful!' `

### 4.2 Notifications par Email

Vous pouvez également configurer des notifications par email en utilisant des actions GitHub ou des services tiers pour envoyer des emails après le déploiement.

#### Exemple de Workflow avec Notification par Email

`name: CI/CD Pipeline with Email Notifications  on:   push:     branches:       - main  jobs:   build-and-deploy:     runs-on: ubuntu-latest      steps:       - name: Checkout repository         uses: actions/checkout@v2        - name: Build application         run: npm run build        - name: Deploy to production         run: ./deploy.sh    notify:     runs-on: ubuntu-latest     needs: build-and-deploy     steps:       - name: Send Email Notification         uses: dawidd6/action-send-mail@v2         with:           server_address: smtp.gmail.com           server_port: 465           username: ${{ secrets.EMAIL_USERNAME }}           password: ${{ secrets.EMAIL_PASSWORD }}           subject: 'Deployment Status'           body: 'The deployment was successful.'           to: 'recipient@example.com' `


---

## Conclusion

Le déploiement continu avec GitHub Actions permet de simplifier et d'automatiser le processus de mise en production de vos applications. Grâce à l'intégration avec des plateformes cloud comme AWS, Azure, et GCP, ainsi qu'à l'utilisation de stratégies de déploiement telles que Blue/Green ou Canary, vous pouvez réduire les risques de déploiement et assurer une livraison continue. De plus, la possibilité d'envoyer des notifications via Slack ou Email améliore la visibilité sur l'état des déploiements et permet aux équipes de réagir rapidement en cas de problèmes.

GitHub Actions offre une grande flexibilité pour automatiser l'ensemble de votre pipeline de déploiement, et vous permet d'optimiser la manière dont vous gérez la livraison de vos applications.