Skip to content

Instantly share code, notes, and snippets.

@gregbuehler
Last active November 23, 2016 20:38
Show Gist options
  • Save gregbuehler/126cd548d1a9e20f5d91a5c171ddc547 to your computer and use it in GitHub Desktop.
Save gregbuehler/126cd548d1a9e20f5d91a5c171ddc547 to your computer and use it in GitHub Desktop.
prunes malformed artifactory hierarchy to maximum revisions
print("Loading Script")
import os
import re
import json
import requests
# config
host = os.environ['ARTIFACTORY_URL']
username = os.environ['ARTIFACTORY_USER']
password = os.environ['ARTIFACTORY_APIKEY']
maximum_revisions = int(os.environ['ARTIFACTORY_MAXREV'])
target_repository = os.environ['ARTIFACTORY_TARGETREPO']
package_expression = r"^([a-zA-Z\.]{2,}[a-zA-Z])"
version_expression = r"([0-9]{4}.[0-9]{1,2}.[0-9]*-git[a-zA-Z0-9]+)"
def get_index():
print("Retreiving available packages at", host)
# make an authenticated reqeuest to get information about a repository
auth = ( username, password )
url = "https://%s/api/storage/%s" % (host, target_repository)
r = requests.get(url, auth=auth)
# collect items from request
i = []
for node in r.json()['children']:
i.append(node['uri'][1:])
return i
def delete_item(item):
auth = ( username, password )
url = "https://%s/%s/%s.nupkg" % (host, target_repository, item)
r = requests.delete(url, auth=auth)
print(r.status_code, url)
# get index of packages
index = get_index()
# populate directory
directory = {}
for i in index:
#print("checking",i, re.search(version_expression, i))
if re.search(version_expression, i):
version = re.search(version_expression, i).group(0)
package = re.search(package_expression, i).group(0)
# initialize if "new" package
if package in directory:
directory[package].append(version)
else:
directory[package] = [ version ]
for package in directory.keys():
versions = sorted(directory[package])
print "Managing %d versions for %s" % (len(versions), package)
if len(versions) > maximum_revisions:
print "Pruning %d versions from %s" % (len(versions) - maximum_revisions, package)
for version in versions:
print "Analyzing %s @ %s" % (package, version)
if version in versions[:-maximum_revisions]:
print("delete",package,version)
delete_item("{0}.{1}".format(package,version))
else:
print("keep",package,version)
print("Script complete!")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment