Gitlab 11.6.0 just released, and one of the new features is deleting a pipeline. Why might you want to delete a little bit of history? Well, perhaps you have inadvertently caused some private information to be printed (a password). Or perhaps you left Auto DevOps enabled and ended up with a whole slew of useless failures. Either way you want to go and delete the pipeline in question and all of its output, artifacts, etc. Well here’s a quick ‘hack’ to achieve the goal.
You run it as ‘python delete-pipeline.py -t token -u url -g group -p project’ and it will list all the pipeline id’s. You can then run it with “-d ‘*’” to delete all of them, or “-d #,#,#…” to delete specific ones. You’ll likely want ‘pip install python-gitlab’ first.
Its a quick and dirty hack, but it worked for me. YMMV.
#!/usr/bin/env python3
import gitlab
import argparse
import os
import requests
import sys
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--url', help='API url', default=url)
parser.add_argument('-t', '--token', help='personal token', default=private_token)
parser.add_argument('-g', '--group', help='group', default=None, required=True)
parser.add_argument('-p', '--project', help='project', default=None, required=True)
parser.add_argument('-d', '--delete', help='delete id(s)', default=None)
args = parser.parse_args()
if args.delete:
args.delete = args.delete.split(',')
gl = gitlab.Gitlab(args.url, args.token)
gl.auth()
def find_group(gl, group):
groups = gl.groups.list()
for g in groups:
if g.name == group:
return g
return None
def find_subgroup(gl, group, subgroup):
subgroups = group.subgroups.list()
for sg in subgroups:
if sg.name == subgroup:
return sg;
return None
# if project is of form x/y, then assume x is a subgroup
def find_project(gl, group, project_with_subgroup):
pws = project_with_subgroup.split('/')
if len(pws) == 2:
subgroup = find_subgroup(gl, group, pws[0])
project = pws[1]
group = gl.groups.get(subgroup.id, lazy=True)
else:
project = pws[0]
projects = group.projects.list()
for p in projects:
if p.name == project:
return p
return None
group = find_group(gl, args.group)
gproject = find_project(gl, group, args.project)
if not gproject:
print("Error: %s / %s does not exist" % (args.group, args.project))
sys.exit(1)
project = gl.projects.get(gproject.id)
pipelines = project.pipelines.list()
for pid in pipelines:
pl = project.pipelines.get(pid.id)
if args.delete and (str(pid.id) in args.delete or args.delete == ['*']):
path = "%s/api/v4/projects/%s/pipelines/%s" % (args.url, project.id, pid.id)
r = requests.delete(path, headers={'PRIVATE-TOKEN': args.token})
print("%s %s %s -- DELETE" % (pid.id, project.name, pl.status))
else:
print("%s %s %s" % (pid.id, project.name, pl.status))


Leave a Reply to db Cancel reply