#!/usr/bin/python import requests import json import argparse import sys parser = argparse.ArgumentParser(description='Gitlab Release Uploader') parser.add_argument('--privateToken', '-p', help='Private token to access Gitlab', required=True) parser.add_argument('--projectId', '-i', help='ProjectID of the related project', required=True) parser.add_argument('--projectUrl', '-u', help='URL of the related project at Gitlab', required=True) parser.add_argument('--file', '-f', help='File to be released, can appear multiple times', action='append', required=True) parser.add_argument('--releaseName', '-n', help='Name of the release', required=False, default='') parser.add_argument('--releaseTag', '-t', help='Tag of the release in the repo', required=False, default='') parser.add_argument('--releaseTagTarget', '-T', help='Commit or branch the tag should point to', required=False, default='') parser.add_argument('--createReleaseTag', '-c', help='Shall the release be created here', required=False, action='store_true', default=False) parser.add_argument('--description', '-d', help='Description of the release', required=False, default='') parser.add_argument('--releaseInfoFile', '-F', help='File containing JSON object with release info ' '(release tag, create release tag, description', required=False, default='') parser.add_argument('--instanceUrl', '-I', help='URL of your gitlab instance', required=False, default='https://gitlab.com') parser.add_argument('--caBundle', '-B', help='File with the CA certificates to trust', required=False, default='/etc/ssl/certs/ca-certificates.crt') parser.add_argument('--verbose', '-v', help='verbose output', required=False, action='store_true', default=False) args = parser.parse_args() privateToken = args.privateToken projectId = args.projectId projectUrl = args.projectUrl filesToUpload = args.file releaseName = args.releaseName releaseTag = args.releaseTag releaseTagTarget = args.releaseTagTarget releaseDescription = args.description instanceUrl = args.instanceUrl createReleaseTag = args.createReleaseTag releaseInfoFilename = args.releaseInfoFile caBundle = args.caBundle verbose = args.verbose releaseInfo = {} if (releaseInfoFilename): with open(releaseInfoFilename, 'r') as releaseInfoFile: releaseInfo = releaseInfoFile.read() releaseInfo = json.loads(releaseInfo) if 'releaseName' in releaseInfo: releaseName = releaseInfo['releaseName'] if 'releaseTag' in releaseInfo: releaseTag = releaseInfo['releaseTag'] if 'releaseTagTarget' in releaseInfo: releaseTagTarget = releaseInfo['releaseTagTarget'] if 'createReleaseTag' in releaseInfo: createReleaseTag = (releaseInfo['createReleaseTag'] in ('true', 'True')) if 'description' in releaseInfo: releaseDescription = releaseInfo['description'] if releaseName == '': raise Exception('No release name given') if releaseTag == '': raise Exception('No release tag given') if releaseTagTarget == '': raise Exception('No release tag target given') if releaseDescription == '': raise Exception('No release description given') # --- upload the file uploadUrl = "%s/api/v4/projects/%s/uploads" % (instanceUrl, projectId) headers = {"PRIVATE-TOKEN": privateToken} assets = [] for filename in filesToUpload: with open(filename, 'rb') as filehandle: files = {"file": filehandle} uploadResult = requests.post(uploadUrl, files=files, headers=headers, verify=caBundle) if uploadResult.status_code != 201: print(uploadResult) print(uploadResult.text) raise Exception('Unable to upload file to Gitlab') if verbose: print(uploadResult) print(uploadResult.text) print('File {} successfully uploaded'.format(filename)) url = projectUrl + json.loads(uploadResult.text)['url'] assets.append({'name': filename, 'url': url}) # --- create release tag if createReleaseTag: createReleaseTagUrl = ("%s/api/v4//projects/%s/repository/tags" % (instanceUrl, projectId)) headers = {"PRIVATE-TOKEN": privateToken, "Content-Type": "application/json"} payloadCreateReleaseTag = { "tag_name": releaseTag, "id": projectId, "ref": releaseTagTarget, "message": "Tag for release %s" % releaseName } createReleaseTagResult = requests.post(createReleaseTagUrl, headers=headers, data=json.dumps(payloadCreateReleaseTag), verify=caBundle) if createReleaseTagResult.status_code != 201: print(createReleaseTagResult) print(createReleaseTagResult.text) raise Exception('Unable to create release tag') if verbose: print(createReleaseTagResult) print(createReleaseTagResult.text) print('Tag successfully created') # --- create release createReleaseUrl = "%s/api/v4/projects/%s/releases" % (instanceUrl, projectId) headers = {"PRIVATE-TOKEN": privateToken, "Content-Type": "application/json"} payloadCreateRelease = { "name": releaseName, "tag_name": releaseTag, "description": releaseDescription, "assets": { "links": assets } } createReleaseResult = requests.post(createReleaseUrl, headers=headers, data=json.dumps(payloadCreateRelease), verify=caBundle) if createReleaseResult.status_code != 201: print(createReleaseResult) print(createReleaseResult.text) raise Exception('Unable to create release') if verbose: print(createReleaseResult) print(createReleaseResult.text) print('Release successfully created')