From a122ee46b5befe8ac4b68b0f6d1cc68cf4087862 Mon Sep 17 00:00:00 2001 From: Xi Xu Date: Wed, 2 Apr 2025 12:59:02 +0800 Subject: [PATCH] Create delete_a_workflow.py --- uses/delete_a_workflow.py | 86 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 uses/delete_a_workflow.py diff --git a/uses/delete_a_workflow.py b/uses/delete_a_workflow.py new file mode 100644 index 0000000..7b40ae3 --- /dev/null +++ b/uses/delete_a_workflow.py @@ -0,0 +1,86 @@ +""" +Delete All Runs for a Specific Workflow + +This script deletes all runs for a specific GitHub Actions workflow. +Useful when you need to clean up a workflow's history completely. + +Usage: +1. Set your Personal Access Token (PAT) with 'repo' and 'workflow' scope permissions +2. Configure the repository owner, repository name, and workflow ID +3. Run the script: python delete-workflow.py + +To find your workflow ID: +curl -H "Authorization: Bearer YOUR_PAT" -H "Accept: application/vnd.github+json" \ + https://api.github.com/repos/OWNER/REPO/actions/workflows + +Requirements: +- requests library: pip install requests +""" + +import requests + +# Configuration - Replace these values with your own +TOKEN = "YOUR_PAT" # Personal Access Token with 'repo' and 'workflow' scopes +OWNER = "your-username" # GitHub username or organization name +REPO = "your-repo" # Repository name +WORKFLOW_ID = "your-workflow-id" # ID of the workflow to delete runs for + +# Set up request headers with authentication +headers = {"Authorization": f"Bearer {TOKEN}", "Accept": "application/vnd.github+json"} + +# Get all runs for the specified workflow +url = ( + f"https://api.github.com/repos/{OWNER}/{REPO}/actions/workflows/{WORKFLOW_ID}/runs" +) +response = requests.get(url, headers=headers) + +# Check for successful API response +if response.status_code != 200: + print(f"Error fetching workflow runs: {response.status_code}") + print(response.json().get("message", "No error message provided")) + exit(1) + +runs = response.json()["workflow_runs"] +total_deleted = 0 + +# Delete each run in the current page +for run in runs: + run_id = run["id"] + delete_url = f"https://api.github.com/repos/{OWNER}/{REPO}/actions/runs/{run_id}" + + # Send the request to delete the run + delete_response = requests.delete(delete_url, headers=headers) + + if delete_response.status_code == 204: + print(f"Deleted run {run_id}") + total_deleted += 1 + else: + print(f"Failed to delete run {run_id}: {delete_response.status_code}") + +# Handle pagination if there are more runs +# GitHub API returns pagination links in the response headers +while "next" in response.links: + response = requests.get(response.links["next"]["url"], headers=headers) + + if response.status_code != 200: + print(f"Error fetching next page: {response.status_code}") + break + + runs = response.json()["workflow_runs"] + + for run in runs: + run_id = run["id"] + delete_url = ( + f"https://api.github.com/repos/{OWNER}/{REPO}/actions/runs/{run_id}" + ) + + # Send the request to delete the run + delete_response = requests.delete(delete_url, headers=headers) + + if delete_response.status_code == 204: + print(f"Deleted run {run_id}") + total_deleted += 1 + else: + print(f"Failed to delete run {run_id}: {delete_response.status_code}") + +print(f"Total runs deleted: {total_deleted}")