You have a whole mess of gitlab repo. You want to make them ready to use (protect master so only accepts merge, protect v* tags to prevent overwrite version, add a deploy key). And you are lazy. Have I the tool for you.
First, make sure you have python-gitlab installed:
pip3 install --upgrade python-gitlab
Now, go get a token from the web UI. For simplicity put it in this file in your home dir.
$ cat .python-gitlab.cfg [global] default = git ssl_verify = true timeout = 5 [git] url = https://git.MYDOMAIN.com private_token = __MY_TOKEN__
Now run this magic script, takes arguments of the form group/project. It will:
- Create an SSH ED25519 pub/priv key
- Create a deploy key called ‘RELEASE KEY’ with the pubkey
- Create a variable called SSH_DEPLOY_KEY (protected) with the privkey
- protect master to only allow merge from maintainer, no push
- protect the tags ‘v*’ to not allow overwrite
You’re welcome. If you don’t know what this means, you probably stopped reading earlier.
$ cat prep-repo.py #!/usr/bin/env python3 """ Run a set of 'prep' steps against a repo: - Create a deploy key `DEPLOY KEY` with public - Create environment variable `SSH_DEPLOY_KEY` with private - set master to `protected` (merge maintainers, no push) - set v* tags (version tag) to protected """ import gitlab import argparse import configparser import os import sys import tempfile config = configparser.ConfigParser() config.read(os.path.expanduser('~/.python-gitlab.cfg')) globals = dict(config['global']) defaults = dict(config[globals['default']]) url = defaults['url'] private_token = defaults['private_token'] 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('args', nargs=argparse.REMAINDER) args = parser.parse_args() gl = gitlab.Gitlab(args.url, args.token) gl.auth() def find_group(gl, group): """ Given a group, find in the API """ groups = gl.groups.list() for g in groups: if g.name == group: return g return None def find_subgroup(gl, group, subgroup): """ Given a group and subgroup, return the subgroup """ subgroups = group.subgroups.list() for sg in subgroups: if sg.name == subgroup: return sg return None def find_project(gl, group, project_with_subgroup): """ if project is of form x/y, then assume x is a 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 for group_project in args.args: group = group_project.split('/')[0] project = group_project.split('/', 1)[1] group = find_group(gl, group) if not group: print("Error: group <%s> does not exist" % group) project = find_project(gl, group, project) if not project: print("Error: %s does not exist" % project) sys.exit(1) project = gl.projects.get(project.get_id()) with tempfile.TemporaryDirectory() as key_dir: key_file = os.path.join(key_dir, 'myrepo-key') os.system("/usr/bin/ssh-keygen -q -f %s -P '' -t ed25519" % key_file) keys = project.keys.list() for key in keys: if key.title == 'RELEASE KEY': print("Deploy keys already exists, overwrite") key.delete() key = project.keys.create({ 'title': 'RELEASE KEY', 'key': open("%s.pub" % key_file).read() }) variable = project.variables.get('SSH_DEPLOY_KEY') if variable: print("Deploy key variable already exists, overwrite") variable.delete() project.variables.create({ 'key': 'SSH_DEPLOY_KEY', 'value': open(key_file).read() }) # import pdb;pdb.set_trace() try: branch = project.protectedbranches.get('master') if branch: print("Protected branch 'master' exists, overwrite") branch.delete() except gitlab.exceptions.GitlabGetError: pass project.protectedbranches.create({ 'name': 'master', 'merge_access_level': gitlab.MAINTAINER_ACCESS, 'push_access_level': 0 }) tag = project.protectedtags.get('v*') if tag: print("Protected tag 'v*' already exists, overwrite") tag.delete() project.protectedtags.create({ 'name': 'v*', 'create_access_level': gitlab.MAINTAINER_ACCESS })
Leave a Reply