2. Dans notepad, copier le script, replacer le token, enregistrer
$token = "github_pat_xxxxxxxxxxxxxxxxxxxxxxxxxx"
$owner = "USER_NAME"
$repo = "REPO_NAME"
$keep = 100
$headers = @{
Authorization = "Bearer $token"
Accept = "application/vnd.github+json"
"X-GitHub-Api-Version" = "2026-03-10"
}
$page = 1
$runs = @()
do {
$response = Invoke-RestMethod `
-Uri "https://api.github.com/repos/$owner/$repo/actions/runs?per_page=100&page=$page" `
-Headers $headers
$runs += $response.workflow_runs
$page++
}
while ($response.workflow_runs.Count -gt 0)
Write-Host "Total runs found: $($runs.Count)"
$toDelete = $runs | Sort-Object created_at -Descending | Select-Object -Skip $keep
Write-Host "Deleting $($toDelete.Count) old runs..."
foreach ($run in $toDelete) {
Write-Host "Deleting run $($run.id) - $($run.name)"
Invoke-RestMethod `
-Method Delete `
-Uri "https://api.github.com/repos/$owner/$repo/actions/runs/$($run.id)" `
-Headers $headers
}
Write-Host "Done!"
Résumé des étapes
Définition des variables d'accès:
- La clé de sécurité ($token)
- Le nom du compte ($owner) et du projet ($repo)
- Le nombre de workflow runs à conserver ($keep = 100)
Pour que GitHub accepte la requête, on envoie ces autorisations via le
$headers
La collecte de l'historique
Le script interroge l'API REST GitHub afin de récupérer les workflow runs du dépôt.
L'API renvoie les résultats par pages, avec jusqu'à 100 éléments par requête. Le script parcourt donc les différentes pages jusqu'à avoir récupéré l'ensemble des résultats disponibles.
Le tri et le ciblage
On affiche ensuite le nombre total de runs trouvés.
Le script trie ensuite les workflow runs par date de création, du plus récent au plus ancien :
$runs | Sort-Object created_at -Descending
Puis
Select-Object -Skip $keep ignore les premiers éléments et place tous les suivants dans
$toDelete
La suppression
Avec la -Method Delete, le script parcourt la liste des anciens éléments et, pour chacun il envoie un ordre d'effacement définitif à GitHub
Avant de lancer le nettoyage complet, il est préférable d'effectuer un petit test afin de vérifier le comportement du script. Ainsi, en cas de problème, le nombre d'exécutions supprimées reste limité.