AccueilClientsExpertisesBlogOpen SourceContact

25 octobre 2024

Créer une GitHub Action pour surveiller les suppressions de colonnes / tables dans Prisma

4 minutes de lecture

Créer une GitHub Action pour surveiller les suppressions de colonnes / tables dans Prisma
🇺🇸 This post is also available in english

Origine du projet

Chez Premier Octet, nous avons une affection particulière pour certaines stacks technologiques auxquels nous faisons confiance, Prisma en fait partie. Cet ORM nous permet de gérer efficacement notre base de données, mais lors d'une récente code review, un détail important nous a échappé.

Une migration générée par Prisma avait provoqué la suppression d'une colonne dans une de nos tables, sans que cela soit immédiatement visible.

Pourtant, Prisma génère toujours un petit commentaire comme celui-ci :

You are about to drop the column ... on the ... table. All the data in the column will be lost.

Malheureusement, dans une pull request (PR) volumineuse, ce genre de modification peut passer sous le radar. Une erreur de notre part nous a poussé à chercher une solution automatisée pour nous remonter ces suppressions parfois critiques dans nos migrations Prisma et garantir la stabilité de nos projets.

Objectif

N'ayant jamais créé de GitHub Action auparavant, je me suis inspiré d'un projet similaire appelé prisma-migration-warning-action par IanMitchell. Avec un peu de recherche, des essais, et l'aide d'un collègue que nous nommerons Claude, j'ai commencé à travailler sur une GitHub Action simple. Elle doit vérifier automatiquement dans les modifications d'une PR s'il y a des migrations Prisma qui suppriment des tables ou des colonnes, si c'est le cas, elle doit alors avertir les développeurs.

Développement

Le processus pour créer cette action est assez simple :

  1. Récupération des fichiers modifiés : La première étape consiste à vérifier les fichiers modifiés dans une pull request. Cela se fait via un diff entre la branche de base (ex : main) et la branche de la pull request.
  2. Filtrer les fichiers de migration Prisma : Parmi tous les fichiers modifiés, nous nous concentrons uniquement sur ceux qui sont situés dans le dossier de Prisma et qui se terminent par .sql.
  3. Détection de suppression de table/colonne : Ensuite, nous analysons le contenu des fichiers de migration pour détecter une suite de chaînes de caractères précise. Ici, "drop" + ("column" ou "table") + "All the data in the column will be lost".
  4. Avertissement et notifications : Si une suppression est détectée, l'action publie un commentaire d'avertissement sur la PR.

Voici un extrait du code principal pour illustrer cette logique :

index.ts
async function run(): Promise<void> {
    const octokit = getOctokitClient();

    const path = core.getInput('path');
    const message = core.getInput('message');
    const warning = core.getBooleanInput('warning');

    const modifiedFiles = getModifiedFiles();

    const migrationFiles = modifiedFiles.filter(
      (file) => file.startsWith(path) && file.endsWith('.sql')
    );

    const hasTableOrColumnDrop = checkForDropsInMigrationsFiles(
      migrationFiles,
      detectTableOrColumnDrop
    );

    if (hasTableOrColumnDrop) {
      core.warning('A table or column drop has been detected.');
      if (warning) {
        await warnWithCommentOnPR(octokit, message);
      }
    } else {
      core.info('No drop detected.');
    }
}

await run().catch(() => {
  console.error('Error executing the action');
  process.exit(1);
});

Détail des fonctions

Le code est divisé en plusieurs fonctions utilitaires qui facilitent le processus de vérification. Voici un résumé des principales :

  • getModifiedFiles() : Récupère la liste des fichiers modifiés dans la PR en utilisant git diff.
  • detectTableOrColumnDrop() : Vérifie si un fichier contient une suppression de colonne ou table.
  • checkForDropsInMigrationsFiles() : Analyse tous les fichiers de migration pour détecter des suppressions de colonnes ou de tables et lance une fonction callback sur chaque contenu de fichier (ici detectTableOrColumnDrop).
  • warnWithCommentOnPR() : Si une suppression est détectée, cette fonction envoie un commentaire d'avertissement dans la PR via l'API GitHub.
Exemple de warning sur une pull request
Exemple de warning sur une pull request

Conclusion

Ce projet de GitHub Action a été un excellent moyen de renforcer notre code review en automatisant la détection des suppressions critiques dans nos migrations Prisma. C'est un bon exemple de comment avec un peu de code et les outils que nous offre GitHub, nous pouvons améliorer notre workflow de développement.

L'action est maintenant disponible sur le GitHub Actions Marketplace ! Si vous utilisez Prisma et que vous souhaitez sécuriser vos migrations, vous pouvez l'intégrer facilement dans votre workflow. Voici un exemple de configuration :

name: Check Prisma migrations
on:
  pull_request:
    branches:
      - main
jobs:
  check-migrations:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.sha }}
      - name: Check Prisma migrations
        uses: premieroctet/prisma-drop-migration-warning@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Set the GitHub token to access API
        with:
          main-branch: 'main' # Main branch of the repository
          path: 'prisma' # Path to Prisma migration files
          message: 'Potential drop detected in Prisma migration files.' # Comment message
          warning: true # Set to false to disable warning

Le code source de l'action est disponible sur notre dépôt GitHub, n'hésitez pas à l'essayer et à nous faire vos retours !

Premier Octet vous accompagne dans le développement de vos projets avec prisma

En savoir plusNous contacter
18 avenue Parmentier
75011 Paris
+33 1 43 57 39 11
hello@premieroctet.com

Suivez nos aventures

GitHub
X (Twitter)
Flux RSS

Naviguez à vue