Bonnes Pratiques et Patterns DevOps avec GitHub

L'adoption des bonnes pratiques et des patterns DevOps est essentielle pour garantir des pipelines CI/CD robustes, évolutifs et efficaces dans les projets complexes. GitHub Actions, avec ses fonctionnalités d’automatisation, permet de structurer les workflows, de gérer plusieurs environnements, et de faciliter la collaboration d’équipe. Ce guide propose des stratégies et des pratiques exemplaires pour structurer les workflows, centraliser les configurations, gérer les environnements de développement, et collaborer efficacement via GitHub Actions.


1. Structurer les Workflows pour des Projets Complexes

Dans les projets complexes, il est essentiel de structurer vos workflows pour garantir un cycle de vie CI/CD fluide et facile à maintenir. Cela inclut la division des workflows en étapes spécifiques, la réutilisation des workflows et la gestion des dépendances entre les jobs.

1.1. Diviser les Workflows en Étapes Claires

Il est recommandé de diviser un workflow en plusieurs jobs et steps, en attribuant des responsabilités spécifiques à chaque job, telles que les tests, le build, ou le déploiement. Chaque job peut être exécuté de manière parallèle ou dépendante, ce qui permet de gagner en flexibilité.

Exemple de Workflow Structuré

name: Complex Workflow on: push: branches: - main jobs: lint: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Run linter run: npm run lint test: runs-on: ubuntu-latest needs: lint # Le job 'test' dépend de 'lint' steps: - name: Checkout code uses: actions/checkout@v2 - name: Run unit tests run: npm test build: runs-on: ubuntu-latest needs: test # Le job 'build' dépend de 'test' steps: - name: Build application run: npm run build deploy: runs-on: ubuntu-latest needs: build # Le job 'deploy' dépend de 'build' steps: - name: Deploy to production run: ./deploy.sh

Explication

  • Jobs dépendants : Les jobs test, build, et deploy sont dépendants des jobs précédents. Cela assure qu’aucune étape de déploiement ne se fait avant la validation des tests ou du build.

  • Modularité : Chaque job a un rôle précis, ce qui rend le workflow plus lisible et plus facile à maintenir.

1.2. Modularisation des Workflows

GitHub Actions permet d’appeler un workflow depuis un autre via workflow_call. Modulariser les workflows permet de réutiliser certaines parties du pipeline (tests, builds, etc.) dans différents projets, assurant ainsi une consistance dans la gestion des pipelines CI/CD à l'échelle de l'organisation.

Exemple de Workflow Réutilisable

# .github/workflows/tests.yml name: Reusable Tests Workflow on: workflow_call jobs: run-tests: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Install dependencies run: npm install - name: Run tests run: npm test

# .github/workflows/main.yml name: Main Workflow on: push: branches: - main jobs: tests: uses: ./.github/workflows/tests.yml # Réutiliser le workflow de tests

1.3. Utiliser les Matrices pour Optimiser les Exécutions

L'utilisation de matrices permet de tester différentes combinaisons d'environnements (OS, versions de langage, etc.) en parallèle, réduisant ainsi le temps total d'exécution du pipeline.

Exemple d’Utilisation de Matrice

name: Matrix Build on: push: branches: - main jobs: build: runs-on: ubuntu-latest strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] node-version: [12, 14, 16] steps: - name: Checkout repository uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - name: Install dependencies run: npm install - name: Run tests run: npm test


2. Utiliser des Fichiers de Configuration Centralisés

Pour les projets complexes, il est souvent utile de centraliser la configuration des workflows afin d’assurer la cohérence entre différents pipelines et éviter la duplication.

2.1. Centraliser les Secrets et Variables

GitHub offre la possibilité de gérer les secrets et les variables d’environnement au niveau de l’organisation ou du dépôt. Cela permet de stocker des informations sensibles comme des clés API ou des identifiants dans un emplacement centralisé et sécurisé.

Exemple : Utilisation de Secrets dans un Workflow

jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Deploy to AWS env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} run: ./deploy.sh

2.2. Fichiers de Configuration Partagés

GitHub Actions permet de créer des fichiers YAML de configuration partagée, ce qui permet de standardiser les processus CI/CD dans plusieurs projets. Ces fichiers peuvent inclure des scripts communs ou des workflows réutilisables pour différentes équipes ou dépôts.

Exemple : Utilisation d'un Fichier Central de Configuration

# .github/workflows/shared-config.yml name: Shared Config on: workflow_call jobs: build: runs-on: ubuntu-latest steps: - name: Install dependencies run: npm install


3. Développement de Logiciels en Équipe avec GitHub Actions (PR Gating, Checks)

GitHub Actions facilite la collaboration au sein des équipes de développement en automatisant les vérifications et en intégrant des contrôles sur les pull requests.

3.1. Mise en Place de PR Gating

Le PR gating consiste à empêcher la fusion de code dans une branche sans que certains tests ou checks aient été exécutés avec succès. Vous pouvez configurer des checks obligatoires qui doivent être validés avant de fusionner une pull request.

Exemple : Workflow pour Valider une PR

name: PR Validation on: pull_request: branches: - main jobs: test: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Install dependencies run: npm install - name: Run tests run: npm test

3.2. Checks Automatiques sur les Pull Requests

GitHub permet de configurer des checks automatiques sur les pull requests, comme l'exécution de tests ou des vérifications de style de code.

3.3. Politique de Branches Protégées

Il est recommandé de protéger les branches critiques (comme main ou production) en configurant des branches protégées, qui empêchent les commits directs ou exigent l'exécution de workflows spécifiques avant la fusion.

Exemple : Protéger la Branche main

  1. Accédez aux Settings du dépôt.

  2. Allez dans Branches.

  3. Ajoutez une règle de branche pour main.

  4. Cochez l’option Require status checks to pass before merging.


Conclusion

L'application de bonnes pratiques et de patterns DevOps avec GitHub Actions permet de structurer efficacement vos workflows CI/CD, centraliser les configurations et secrets, gérer plusieurs environnements, et collaborer de manière fluide au sein d'une équipe. L'utilisation d'outils comme les environnements, les workflows réutilisables, les branches protégées, et les checks de pull requests permet de construire des pipelines robustes et évolutifs pour des projets complexes tout en assurant la qualité et la sécurité du code.