Utiliser les actions GitHub pour décompresser automatiquement une archive zip

illustrations illustrations illustrations illustrations illustrations illustrations illustrations
post-thumb

Publié le 3 novembre 2022 par Andrew Owen (3 minutes)

J’ai récemment travaillé avec un logiciel qui pouvait pousser une archive zip de contenu vers un dépôt Git. Cependant, ce que je voulais vraiment, c’était que le contenu de l’archive soit poussé vers le dépôt. J’ai donc créé une action GitHub pour le faire. J’ai déjà abordé le format des actions GitHub. Mais pour récapituler:

  • name est ce qui est affiché dans la liste des actions.
  • on définit les triggers:
    • push et pull déclenchent le script sur les requêtes push et pull. Si vous ne spécifiez pas de branches, elles prennent par défaut la valeur main.
    • worklflow_dispatch vous permet de déclencher manuellement le script à partir de la liste d’actions.
  • jobs définit une ou plusieurs tâches nommées, par exemple build.
  • runs-on spécifie l’environnement VM. Si vous pouvez utiliser Ubuntu, c’est l’option la moins chère avec les runners hébergés.
  • steps peut être utilisé pour invoquer des actions telles que checkout (qui récupère une copie du dépôt sur la VM) et pour exécuter des commandes shell avec name: run.
  • run avec un caractère pipe ( | ) exécute un script multi-lignes. Sans ce caractère, une seule ligne est exécutée.

Et voici l’action que j’ai créée:

name: extract a zip file
on:
  push:
    paths:
    - 'uploads/**.zip'
  workflow_dispatch:
    jobs:
      unzip:
        runs-on: ubuntu-latest
        permissions:
          contents: write
        steps:
          - uses: actions/checkout@v4
          - name:
            run: |
              rm -r uploads/extracted
              filename=$(basename -s .zip *.zip)
              unzip *.zip
              rm *.zip
              mv $filename temp
              mv temp/out/* .
              rm -r temp
              git config --local user.email "github-actions@users.noreply.github.com"
              git config --local user.name "github-actions"
              git add .
              git commit -m "unzip"
              git push origin main              

Le script est écrit pour la ligne de commande Linux. Décomposons-le.

rm -r css

L’idée ici est que le contenu du fichier zip doit remplacer ce qui se trouve déjà dans ce dossier particulier du référentiel. Vous pourriez appeler ce dossier uploads. L’action checkout a déjà été exécutée, mais c’est une bonne idée d’effacer tous les dossiers connus. La balise -r rend l’action récursive.

filename=$(basename -s .zip *.zip)

    unzip *.zip
    rm .zip
    mv $filename temp

Ce script suppose que nous ne connaissons pas le nom du fichier zip, mais qu’il n’y a qu’un seul fichier. Il déterminera le nom, décompressera le fichier à la racine, supprimera le fichier zip et renommera le dossier contenant le zip en temp.

mv temp/out/ .

    rm -r temp

Dans cet exemple, le contenu du fichier zip se trouve dans deux dossiers (dans le dossier out). Cette opération déplace le contenu du dossier imbriqué vers la racine, puis supprime le dossier temporaire et son contenu (le dossier out vide). Le point (.) représente le répertoire de travail actuel (où le repo a été extrait sur la VM).

git config user.name "github-actions@users.noreply.github.com"

    git config --local user.name "github-actions"
    git add .
    git commit -m "unzip"
    git push origin main

Cette partie du script repousse les modifications vers le référentiel.

Image: Détail de l’icône du fichier zip de The Unarchiver. J’ai cherché une image de décompression appropriée avec une licence Creative Commons, mais les résultats n’étaient pas sûrs pour le travail.