12. Devops ‐ CI CD ‐ Outils - Karitchi/infolab GitHub Wiki

Nous avons mis en place un système simple et efficace pour l’automatisation du déploiement et des tests. Voici les étapes principales :

1. Automatisation du déploiement

  • GitHub Actions : À chaque commit sur la branche main, des workflows construisent automatiquement les images Docker pour le backend et la base de données, puis les publient sur GitHub Container Registry. Voici le workflow :
name: Build and Push Docker Images to GitHub Container Registry

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      - name: Check out the code
        uses: actions/checkout@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GHCR_TOKEN }}

      - name: Build and push Node image
        uses: docker/build-push-action@v4
        with:
          context: .
          file: Dockerfile.node
          push: true
          tags: ghcr.io/karitchi/infolab/node:latest

      - name: Build and push Postgres image
        uses: docker/build-push-action@v4
        with:
          context: .
          file: Dockerfile.postgres
          push: true
          tags: ghcr.io/karitchi/infolab/postgres:latest

      - name: Verify the images were pushed
        run: |
          echo "Node image has been pushed to GitHub Container Registry: ghcr.io/${{ github.repository }}/node:latest"
          echo "Postgres image has been pushed to GitHub Container Registry: ghcr.io/${{ github.repository }}/postgres:latest"
  • Watchtower : Un conteneur sur notre serveur AWS EC2 surveille ces images. Dès qu’une nouvelle version est disponible, elle est automatiquement déployée, remplaçant l’ancienne. La configuration de notre serveur est illustrée par ce fichier docker-compose :
name: infolab
services:
  watchtower:
    restart: unless-stopped
    environment:
      TZ: Europe/Brussels
      WATCHTOWER_CLEANUP: true
      WATCHTOWER_NO_STARTUP_MESSAGE: true
      WATCHTOWER_POLL_INTERVAL: 5
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - watchtower

  nodejs:
    image: ghcr.io/karitchi/infolab/node:latest
    ports:
      - "3000:3000"
    restart: unless-stopped
    depends_on:
      - postgres
    networks:
      - infolab

  postgres:
    image: ghcr.io/karitchi/infolab/postgres:latest
    ports:
      - "5432:5432"
    volumes:
      - /docker/container/postgres/data:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - infolab

networks:
  infolab:
  watchtower:

2. Outils utilisés

  • Docker : Assure la conteneurisation des services pour un déploiement rapide et fiable.
  • GitHub Actions : Automatise les étapes de construction et de publication des images Docker.
  • Watchtower : Détecte et déploie automatiquement les nouvelles versions des conteneurs.

3. Avantages du setup

  • Simplicité : Réduit les risques d’erreurs et nécessite peu de maintenance.
  • Flexibilité : Convient parfaitement à un projet tolérant de légères interruptions de service.

Alternative et raison de son non-choix

Nous avons envisagé l’utilisation de Kubernetes, qui offre une gestion avancée des conteneurs et une haute disponibilité. Cependant, cette solution est complexe et surdimensionnée pour ce projet, qui n’exige ni échelle massive ni disponibilité continue.