
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@v2
- 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.