diff options
-rwxr-xr-x | appveyor-clear.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/appveyor-clear.py b/appveyor-clear.py new file mode 100755 index 0000000..a247eac --- /dev/null +++ b/appveyor-clear.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +""" +Clears the build history, removing all but the last 100 builds. Usage: + +Go to https://ci.appveyor.com/api-keys for an account-specific (v1) token. Then: + + export APPVEYOR_TOKEN=... + ./appveyor-clear.py Lekensteyn/wireshark + +Other options exist, use ./appveyor-clear.py --help to see them all. +""" + +import argparse +import os +import sys +import requests + +parser = argparse.ArgumentParser() +parser.add_argument("--token", default=os.environ.get("APPVEYOR_TOKEN"), + help="v1 API token (defaults to APPVEYOR_TOKEN environment variable). See " + "https://ci.appveyor.com/api-keys") +parser.add_argument("--max-builds", type=int, default=100, + help="Maximum number of recent builds to keep") +parser.add_argument("--dry-run", action="store_true", + help="Do not actually delete builds") +parser.add_argument("project", + help="Account name plus project slug (e.g. Lekensteyn/wireshark)") + +base = "https://ci.appveyor.com/api" +history_url = "%s/projects/{project}/history?recordsNumber=1000" % base +build_url = "%s/builds/{buildId}" % base + +args = parser.parse_args() +if not args.token: + parser.error("Missing APPVEYOR_TOKEN environment variable") +if args.token.startswith("v2."): + parser.error("Only a v1 token is supported") + +headers = { + "Authorization": "Bearer %s" % args.token, +} +# Retrieve builds for the project +r = requests.get(history_url.format(project=args.project), headers=headers) +r.raise_for_status() # Does the project exist? +builds = r.json()["builds"] +count = len(builds) +builds = builds[args.max_builds:] +if not builds: + print("Found %d builds, nothing to remove" % count) +else: + print("About to remove %d builds" % len(builds)) + for build in builds: + print("Removing %d %s" % (build["buildId"], build["message"])) + if not args.dry_run: + r = requests.delete(build_url.format(buildId=build["buildId"]), + headers=headers) + r.raise_for_status() # If this fails, perhaps token is invalid. |