Skip to content

Instantly share code, notes, and snippets.

@tossmilestone
Created May 31, 2017 03:02
Show Gist options
  • Save tossmilestone/2d1a8e4dff9fb910b1b5ff5b761f5aa9 to your computer and use it in GitHub Desktop.
Save tossmilestone/2d1a8e4dff9fb910b1b5ff5b761f5aa9 to your computer and use it in GitHub Desktop.
A gitlab helper to simplify the batch operations on gitlab.
import argparse
import eventlet
import gitlab
import constants
eventlet.monkey_patch()
class GitlabHelper(object):
"""A gitlab helper to run commands on group"""
def __init__(self):
self.gl = gitlab.Gitlab(url=constants.GITLAB_URL, private_token=constants.GITLAB_PRIVATE_TOKEN)
parser = argparse.ArgumentParser(description='Run gitlab commands on a group.')
parser.add_argument('-g', '--group', type=str, help='Group of project')
subparsers = parser.add_subparsers(dest='subcommand')
tag_parser = subparsers.add_parser('tag')
tag_parser.add_argument('action', type=str, help='Action to do with tag')
tag_parser.add_argument('tag', type=str, help='Tag to create')
tag_parser.add_argument('branch', type=str, help='Branch to create tag')
tag_parser.add_argument('-p', '--project', metavar='PROJECT', type=str, help='Project')
merge_parser = subparsers.add_parser('merge')
merge_parser.add_argument('action', type=str, help='Action to do with merge request')
merge_parser.add_argument('-s', '--source', type=str, help='Source branch to merge')
merge_parser.add_argument('-t', '--target', type=str, help='Target branch to merge')
merge_parser.add_argument('--title', type=str, help='Title of merge request')
merge_parser.add_argument('-p', '--project', metavar='PROJECT', type=str, help='Project')
args = parser.parse_args()
if args.subcommand == 'tag':
self.handle_tag(args.action, args.group, args.tag, args.branch, project=args.project)
if args.subcommand == 'merge':
self.handle_merge(args.action, args.group, args.source, args.target, args.title, project=args.project)
### tag ####
def handle_tag(self, action, namespace, tag, ref, project=None):
groups = self.gl.groups.list()
action_map = {
'add': self._create_tag,
'delete': self._delete_tag
}
if action not in action_map:
raise Exception('Invalid action')
func = action_map[action]
for grp in groups:
if grp.name == namespace:
group = self.gl.groups.get(id=grp.id)
for p in group.projects:
if project and p.name != project:
continue
func(p, tag, ref)
break
def _create_tag(self, p, tag, ref):
try:
self.gl.project_tags.create({
'tag_name': tag,
'ref': ref
}, project_id=p.id)
print 'Tag %s is created from %s in %s.' % (tag, ref, p.name)
except gitlab.exceptions.GitlabCreateError as ex:
print 'Tag %s created failed from %s in %s, error: %s' % (tag, ref, p.name, ex)
def _delete_tag(self, p, tag, ref):
try:
self.gl.project_tags.delete(tag, project_id=p.id)
print 'Tag %s is deleted from %s in %s.' % (tag, ref, p.name)
except gitlab.exceptions.GitlabDeleteError as ex:
print 'Tag %s deleted failed from %s in %s, error: %s' % (tag, ref, p.name, ex)
### tag ####
### merge ####
def handle_merge(self, action, namespace, source, target, title, project=None):
groups = self.gl.groups.list()
action_map = {
'add': self._add_merge,
}
if action not in action_map:
raise Exception('Invalid action')
func = action_map[action]
for grp in groups:
if grp.name == namespace:
group = self.gl.groups.get(id=grp.id)
for p in group.projects:
if project and p.name != project:
continue
func(p, source, target, title)
break
def _add_merge(self, p, source, target, title):
try:
self.gl.project_mergerequests.create({
'source_branch': source,
'target_branch': target,
'title': title
}, project_id=p.id)
print 'Merge request %s is created from %s to %s in %s.' % (title, source, target, p.name)
except gitlab.exceptions.GitlabCreateError:
print 'Merge request %s create failed from %s to %s in %s.' % (title, source, target, p.name)
### merge ####
if __name__ == '__main__':
GitlabHelper()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment