Created
May 31, 2017 03:02
-
-
Save tossmilestone/2d1a8e4dff9fb910b1b5ff5b761f5aa9 to your computer and use it in GitHub Desktop.
A gitlab helper to simplify the batch operations on gitlab.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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