IntroductionL’organisation Github d’une entreprise peut être comparée à l’état de votre maison qui reflète votre état intérieur, plus c’est propre mieux c’est !
Le nettoyage régulier de votre GitHub n’est pas seulement une question d’hygiène numérique, primordiale dans votre optique Green IT. C’est également essentiel pour une gestion efficace du projet, une collaboration sans friction et le maintien d’une haute performance. Sachant l’importance croissante de ces environnements pour les développeurs, il devient impératif d’adopter et de normaliser de bons comportements de gestion de vos repositories
Dans cet article, nous allons explorer les raisons pour lesquelles il est essentiel de procéder à un nettoyage des repo GitHub régulier avec quelques éléments de configurations, des commandes pour le cleanup local ainsi que des Github Actions applicables dans vos projets d’entreprise.
Bonnes pratiques de cleanup Github
Nettoyage des remote branches
Les branches inutilisées contiennent des modifications et des commits, ce qui contribue à la taille totale de la base de données, facteur important de votre impact environnemental. Lorsqu’une branche est supprimée et qu’elle n’est référencée nulle part ailleurs dans le repo (par exemple, s’il n’y a pas de tag pointant vers elle), Git pourra libérer l’espace utilisé par les modifications stockées dans la branche.
Si vous n’avez pas besoin de conserver votre code inutilisé, il est préférable de supprimer les branches qui le contiennent, pour les raisons suivantes:
- Elles utilisent de l’espace.
- Elles ralentissent les opérations de maintenance (comme les sauvegardes de dépôt).
- Des branches sont créées/supprimées assez souvent et si elles ne sont pas supprimées, la liste de branches deviendra suffisamment grande pour être illisible en peu de temps.
- Elles aggravent l’impact environnemental de votre projet
Suppression des branches fusionnées après PR:
Github propose une option dans les paramètres du repo pour supprimer automatiquement les branches qui viennent d’être fusionnées à la suite d’une Pull Request:
Supprimer les branches qui ne sont pas fusionnées après PR:
Dans certains de nos repos, de nombreuses PR sont ouvertes, mais toutes ne sont pas fusionnées, ce qui entraîne l’accumulation de branches abandonnées. Avec une organisation en croissance et l’adoption de GitOps, ce problème s’accentue.
Bien que les branches soient peu coûteuses d’un point de vue technique, elles compliquent la gestion pour les utilisateurs, rendant plus compliqué la lisibilité du repo avec de nombreuses branches à l’abandon.
Voici un exemple de Github Action qui peut palier à ce problème:
name: Delete unmerged branch on: pull_request: types: [ closed ] jobs: worker: if: ${{ github.event.pull_request.merged_at == '' }} runs-on: ubuntu-latest steps: - name: delete-unmerged-branch uses: actions/github-script@v7 with: github-token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} script: | const { repo, owner } = context.repo; const ref = `heads/${context.payload.pull_request.head.ref}`; const deleteParams = { owner, repo, ref }; console.log(`Deleting branch: "${ref}"`); try { github.rest.git.deleteRef(deleteParams); } catch(e) { console.log("Cannot delete branch; error:", e); }
Tout ce que fait la Github Action, c’est de vérifier si la PR en question a été fusionnée, et si ce n’est pas le cas, on essaie de supprimer la branche associée.
Pour utiliser cette Github Action vous devez générer un Personal Access Token qui aura le droit d’agir sur les branches du repo.
Nettoyage des artéfacts
GitHub Actions fournit des artéfacts qui sont créés lorsque vous avez besoin de stocker temporairement des données à utiliser dans vos tâches. Les artefacts consomme le quota d’espace de votre configuration Git
GitHub a ajouté une option de configuration et a également ouvert l’API pour la suppression des artefacts. Cela vous permettra de maintenir votre stockage sous la limite sur vos repo GitHub, de sorte que vous n’ayez pas à payer pour le stockage supplémentaire.
Configuration du délai de rétention des artéfacts:
Github propose une option dans les paramètres d’actions du repo pour supprimer automatiquement les artéfacts et log en fonction de leur durée de rétention.
Cela peut être utile si votre workflow stocke temporairement des artefacts qui ne sont plus nécessaires à la fin de l’exécution. Par exemple, parce qu’ils ont été téléchargés ou publiés comme une version par l’une des étapes. Supprimer ces artéfacts redondants à la fin de l’exécution permet d’économiser de l’espace de stockage et d’améliorer l’aspect Green IT, qui est limité pour les dépôts privés.
name: 'Final step: Artifacts cleanup' on: workflow_run: branches: [main] workflows: [deployArtifacts] types: - completed jobs: on-success: runs-on: ubuntu-latest name: Delete artifact if: github.event.workflow_run.head_branch == 'main' # feel free to take this out if you don't need it steps: - id: get-id run: | # grab the id of the artifact we just created echo "ARTIFACT_ID=$(gh api -H 'Accept: application/vnd.github+json' ${{github.event.workflow_run.artifacts_url}} --jq .artifacts[].id)" >> $GITHUB_ENV env: GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN_DELETE_ARTIFACTS }} - run: | echo "artifact id is ${{ env.ARTIFACT_ID}}" echo "run url is ${{github.event.workflow_run.artifacts_url}}" - id: delete-artifact run: | # https://docs.github.com/en/rest/actions/artifacts?apiVersion=2022-11-28#delete-an-artifact gh api --method DELETE -H 'Accept: application/vnd.github+json' /repos/${{github.repository}}/actions/artifacts/${{env.ARTIFACT_ID}} env: GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN_DELETE_ARTIFACTS }} on-failure: runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion == 'failure' }} steps: - run: echo 'The triggering workflow failed'
Pour utiliser cette Github Action vous devez générer un Personal Access Token qui aura le droit de supprimer des artéfacts.
Nettoyage de votre repo local
Si vous travaillez sur un repo Github depuis un moment, vous pouvez songer à nettoyer le repo pour gagner de l’espace disque et diminuer votre impact environnemental. Voyons quelques commandes utiles à cet effet:
On peut commencer par vérifier la taille que prend le dossier .git du repo pour comparer le gain de disque que nous aurons fait à la fin.
du -sh .git
Suppression de la référence locale de la branche distante:
Il est toujours bon de supprimer une branche après qu’elle ait été fusionnée.
Comme vu précédemment GitHub offre une option pour supprimer la branche une fois que vous avez fusionné la PR, mais cela supprimera uniquement cette branche sur le repo distant.
Même après la suppression de la branche sur le dépôt distant, il restera une référence en local.
Pour supprimer toutes les références locales de la branche distante, utilisez la commande suivante :
git remote prune origin
Packager le repo local:
Les packs sont des représentations internes de Git utilisées pour combiner tous les objets individuels en packs. Sans entrer dans les détails techniques, les packs sont utilisés pour réduire la charge sur l’espace disque. Là aussi, on est sur le bon chemin pour votre stratégie Green IT !
La commande dans un repo Git local est la suivante:
git repack
Vous pouvez relancer la commande de vérification de l’espace disque par le dossier .git et voir vos gains d’espace:
du -sh .git
Ces actions sont à répéter autant de fois que votre nombre de repo.
Conclusion
Au terme de cet article, nous avons exploré l’importance et la nécessité de maintenir une hygiène numérique stricte au sein de vos repositories GitHub, soulignant ainsi les améliorations en termes de performance, de coûts, d’organisation et d’impact environnemental. Les stratégies et les outils présentés, allant de la simple configuration à l’automatisation avec GitHub Actions ainsi que quelques commandes Git, fournissent un cadre solide pour atteindre ces objectifs.
Ces techniques ont pour but de simplifier la gestion de vos repo, tout en assurant leur accessibilité et leur réutilisabilité à long terme. Le tout en accompagnant votre stratégie Green IT !
Sources:
https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-the-automatic-deletion-of-branches
https://markentier.tech/posts/2021/09/delete-unmerged-branches-github/
https://github.com/marketplace/actions/delete-run-artifacts