55 Commits
v1.4 ... v1.12

Author SHA1 Message Date
494a402cdf create release first 2021-01-13 18:15:06 +01:00
2e4ae7c984 debug ci script 2021-01-13 17:41:11 +01:00
80a17bd258 debug ci script 2021-01-13 17:39:09 +01:00
6978c11d02 debug ci script 2021-01-13 17:38:03 +01:00
678a81a116 debug ci script 2021-01-13 17:36:40 +01:00
5c0254c036 info.json updated 2021-01-13 17:32:51 +01:00
695450cfb9 fix style 2021-01-13 17:31:30 +01:00
59f2add5c7 add option to add files to existing release and to extend description of existing release 2021-01-13 17:30:11 +01:00
9ba66614ec add option not to create a release, fix 4 2021-01-08 15:33:42 +01:00
e9f61e6b52 add option not to create a release, fix 3 2021-01-08 15:11:39 +01:00
d65ec75d94 add option not to create a release, fix 2 2021-01-08 15:00:58 +01:00
7a591afe21 add option not to create a release, fix 1 2021-01-08 14:58:16 +01:00
fee7aaaedb add option not to create a release 2021-01-08 13:22:15 +01:00
41ba33d5a7 license updated 2021-01-08 10:34:09 +01:00
f82156d2f1 fix idnent 2020-08-26 18:52:47 +02:00
7f7c75e983 fix indent 2020-08-26 18:51:21 +02:00
ce41933381 ignore long lines 2020-08-26 18:49:04 +02:00
6f105a6a12 fix 2020-08-26 18:48:00 +02:00
7abbecd28c fix 2020-08-26 18:41:49 +02:00
0331672f92 fix 2020-08-26 18:40:08 +02:00
051cbfecfb fix 2020-08-26 18:33:57 +02:00
495ff5c51e now really with semver checker 2020-08-26 18:31:21 +02:00
0df2400892 version 2020-08-26 18:27:30 +02:00
47621f90c0 add semver validator 2020-08-26 18:26:05 +02:00
0897d76fdc fix info file 2020-06-08 15:54:27 +00:00
34a7ad2f10 adjust ci script 2020-06-08 15:51:53 +00:00
b564ad15aa second fix 2020-03-17 15:17:34 +00:00
7969a8259e edit release info 2020-03-17 15:06:42 +00:00
8acddeb2cf fix forgotten variable 2020-03-17 15:06:10 +00:00
adae5638d3 edit release info 2020-03-17 14:49:38 +00:00
b66ca744ae Merge branch 'master' into release 2020-03-17 14:48:00 +00:00
f72c8b115f re-add insecure option 2020-03-17 14:47:07 +00:00
1b05213466 late fix 2020-02-29 23:40:07 +01:00
f3f62d5cf5 debug upload 2020-02-29 23:37:00 +01:00
e5967bb726 adjust version file 2020-02-29 23:33:15 +01:00
d194562474 file upload using with statement 2020-02-29 23:29:48 +01:00
e87741bedb fix code style warnings 2020-02-29 23:22:30 +01:00
c64effea3b multi file upload 2020-02-28 23:19:00 +01:00
cb94e9e017 fix code style 2020-02-28 19:36:55 +01:00
0e8823bba1 fix code style 2020-02-28 19:35:58 +01:00
5fd785a826 ca bundle added 2020-02-28 19:34:31 +01:00
3ea721a4e7 deleterelease added 2019-07-16 15:32:20 +02:00
fdc5e97fc2 Update readme.md, fix typo 2019-07-10 12:39:02 +00:00
79dba02090 readme change 2019-05-30 16:07:35 +02:00
b9663f82d3 Add LICENSE 2019-05-30 14:04:15 +00:00
bde034ba7a prepare new release 2019-05-30 15:56:42 +02:00
3e09e510da more readme work 2019-05-30 15:55:06 +02:00
131ab9e789 readme work 2019-05-30 15:52:10 +02:00
255ff55cee another fix in readme 2019-05-30 15:45:48 +02:00
bb0c14b39f fix in readme 2019-05-30 15:45:01 +02:00
1ffba72b6b release only for release branch, edit readme.md 2019-05-30 15:44:01 +02:00
af6b41a0ae fix ci script 2019-05-30 14:59:02 +02:00
26a8759919 some fixes 2019-05-30 14:43:07 +02:00
62c3f0e00f adjust info file 2019-05-30 14:36:50 +02:00
dff4090678 add ci script 2019-05-30 14:35:35 +02:00
7 changed files with 467 additions and 68 deletions

29
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,29 @@
stages:
- check
- release
build:
stage: check
image: registry.hottis.de/dockerized/base-build-env:latest
tags:
- hottis
- linux
- docker
script:
- for I in *.py; do python -m py_compile $I; done
- for I in *.py; do python -m pycodestyle --ignore=E501 $I; done
release:
stage: release
image: registry.hottis.de/dockerized/base-build-env:latest
tags:
- hottis
- linux
- docker
only:
- release
script:
- zip GitlabReleaseTool.zip gitlabreleaseuploader.py deleterelease.py checksemver.py
- python gitlabreleaseuploader.py -p $PRIVATE_TOKEN -i $CI_PROJECT_ID -u $CI_PROJECT_URL -I $CI_SERVER_URL
-f GitlabReleaseTool.zip -F info.json -T $CI_COMMIT_SHA

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019-2020 Wolfgang Hottgenroth
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

80
checksemver.py Normal file
View File

@ -0,0 +1,80 @@
#!/usr/bin/python
import re
import argparse
import sys
parser = argparse.ArgumentParser(description='Semantic Version Validator')
parser.add_argument('--versionToValidate', '-V',
help='The version to validate against the semantic versioning rules',
required=True)
parser.add_argument('--messageToValidate', '-M',
help='A message to validate, means: it must not be empty',
default='',
required=False)
parser.add_argument('--validateMessage', '-m',
help='Consider -M',
required=False,
action='store_true',
default=False)
parser.add_argument('--printExports', '-e',
help='Print exports',
action='store_true',
default=False,
required=False)
parser.add_argument('--exportFormat', '-f',
help='Print exports in >bash< or >powershell< format, to be used in '
'backticks or with Invoke-Expression',
default='bash',
required=False)
parser.add_argument('--verbose', '-v',
help='Verbose output, overrides -q',
required=False,
action='store_true',
default=False)
args = parser.parse_args()
verbose = args.verbose
versionToValidate = args.versionToValidate
messageToValidate = args.messageToValidate
validateMessage = args.validateMessage
printExports = args.printExports
exportFormat = args.exportFormat
r = re.compile(r'^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$')
if verbose:
print("Version to validate: {}".format(versionToValidate))
m = r.match(versionToValidate)
if m:
if verbose:
for i in r.groupindex:
print("Found: {}: {}".format(i, m.group(i)))
if validateMessage:
if verbose:
print("Checking message {}".format(messageToValidate))
if messageToValidate == '':
if verbose:
print("Message shall be validate and is invalid")
sys.exit(1)
else:
if printExports:
if exportFormat == "bash":
print("export MESSAGE={}".format(messageToValidate))
elif exportFormat == "powershell":
print("set MESSAGE {}".format(messageToValidate))
if printExports:
for i in r.groupindex:
if exportFormat == "bash":
print("export {}={}".format(i.upper(), '' if m.group(i) is None else m.group(i)))
elif exportFormat == "powershell":
print("set {} {}".format(i.upper(), '""' if m.group(i) is None else m.group(i)))
sys.exit(0)
else:
if verbose:
print("Version is invalid")
sys.exit(1)

66
deleterelease.py Normal file
View File

@ -0,0 +1,66 @@
#!/usr/bin/python
import requests
import json
import argparse
import sys
parser = argparse.ArgumentParser(description='Gitlab Release Deleter')
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('--releaseTag', '-t',
help='Tag of the release in the repo',
required=True,
default='')
parser.add_argument('--instanceUrl', '-I',
help='URL of your gitlab instance', required=False,
default='https://gitlab.com')
parser.add_argument('--verbose', '-v',
help='verbose output',
required=False,
action='store_true',
default=False)
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('--insecure',
help='insecure ssl connect',
required=False,
action='store_true',
default=False)
args = parser.parse_args()
privateToken = args.privateToken
projectId = args.projectId
releaseTag = args.releaseTag
instanceUrl = args.instanceUrl
verbose = args.verbose
caBundle = args.caBundle
insecure = args.insecure
# --- delete release
deleteReleaseUrl = "%s/api/v4/projects/%s/releases/%s" % (instanceUrl, projectId, releaseTag)
headers = {"PRIVATE-TOKEN": privateToken, "Content-Type": "application/json"}
if verbose:
print("URL: %s" % deleteReleaseUrl)
if insecure:
caBundle = (False)
deleteReleaseResult = requests.delete(deleteReleaseUrl, headers=headers, verify=caBundle)
if deleteReleaseResult.status_code != 200:
print(deleteReleaseResult)
print(deleteReleaseResult.text)
raise Exception('Unable to delete release')
if verbose:
print(deleteReleaseResult)
print(deleteReleaseResult.text)
print('Release successfully delete')

View File

@ -14,10 +14,17 @@ parser.add_argument('--projectId', '-i',
parser.add_argument('--projectUrl', '-u', parser.add_argument('--projectUrl', '-u',
help='URL of the related project at Gitlab', required=True) help='URL of the related project at Gitlab', required=True)
parser.add_argument('--file', '-f', parser.add_argument('--file', '-f',
help='File to be released', required=True) help='File to be released, can appear multiple times',
action='append',
required=False)
parser.add_argument('--releaseName', '-n', parser.add_argument('--releaseName', '-n',
help='Name of the release', required=False, help='Name of the release', required=False,
default='') default='')
parser.add_argument('--createRelease', '-C',
help='Shall the release be created here',
required=False,
action='store_true',
default=False)
parser.add_argument('--releaseTag', '-t', parser.add_argument('--releaseTag', '-t',
help='Tag of the release in the repo', help='Tag of the release in the repo',
required=False, required=False,
@ -27,7 +34,7 @@ parser.add_argument('--releaseTagTarget', '-T',
required=False, required=False,
default='') default='')
parser.add_argument('--createReleaseTag', '-c', parser.add_argument('--createReleaseTag', '-c',
help='Shall the release be created here', help='Shall the release tag be created here',
required=False, required=False,
action='store_true', action='store_true',
default=False) default=False)
@ -42,6 +49,14 @@ parser.add_argument('--releaseInfoFile', '-F',
parser.add_argument('--instanceUrl', '-I', parser.add_argument('--instanceUrl', '-I',
help='URL of your gitlab instance', required=False, help='URL of your gitlab instance', required=False,
default='https://gitlab.com') 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('--insecure',
help='insecure ssl connect',
required=False,
action='store_true',
default=False)
parser.add_argument('--verbose', '-v', parser.add_argument('--verbose', '-v',
help='verbose output', help='verbose output',
required=False, required=False,
@ -52,29 +67,36 @@ args = parser.parse_args()
privateToken = args.privateToken privateToken = args.privateToken
projectId = args.projectId projectId = args.projectId
projectUrl = args.projectUrl projectUrl = args.projectUrl
fileToUpload = args.file filesToUpload = args.file
releaseName = args.releaseName releaseName = args.releaseName
createRelease = args.createRelease
releaseTag = args.releaseTag releaseTag = args.releaseTag
releaseTagTarget = args.releaseTagTarget releaseTagTarget = args.releaseTagTarget
releaseDescription = args.description releaseDescription = args.description
instanceUrl = args.instanceUrl instanceUrl = args.instanceUrl
createReleaseTag = args.createReleaseTag createReleaseTag = args.createReleaseTag
releaseInfoFilename = args.releaseInfoFile releaseInfoFilename = args.releaseInfoFile
caBundle = args.caBundle
verbose = args.verbose verbose = args.verbose
releaseInfo = {} insecure = args.insecure
releaseInfo = {}
if (releaseInfoFilename): if (releaseInfoFilename):
with open(releaseInfoFilename, 'r') as releaseInfoFile: with open(releaseInfoFilename, 'r') as releaseInfoFile:
releaseInfo = releaseInfoFile.read() releaseInfo = releaseInfoFile.read()
releaseInfo = json.loads(releaseInfo) releaseInfo = json.loads(releaseInfo)
if 'releaseName' in releaseInfo: if 'releaseName' in releaseInfo:
releaseName = releaseInfo['releaseName'] releaseName = releaseInfo['releaseName']
if 'createRelease' in releaseInfo:
createRelease = (releaseInfo['createRelease'] in
('true', 'True'))
if 'releaseTag' in releaseInfo: if 'releaseTag' in releaseInfo:
releaseTag = releaseInfo['releaseTag'] releaseTag = releaseInfo['releaseTag']
if 'releaseTagTarget' in releaseInfo: if 'releaseTagTarget' in releaseInfo:
releaseTagTarget = releaseInfo['releaseTagTarget'] releaseTagTarget = releaseInfo['releaseTagTarget']
if 'createReleaseTag' in releaseInfo: if 'createReleaseTag' in releaseInfo:
createReleaseTag = (releaseInfo['createReleaseTag'] in ('true', 'True')) createReleaseTag = (releaseInfo['createReleaseTag'] in
('true', 'True'))
if 'description' in releaseInfo: if 'description' in releaseInfo:
releaseDescription = releaseInfo['description'] releaseDescription = releaseInfo['description']
@ -82,91 +104,157 @@ if releaseName == '':
raise Exception('No release name given') raise Exception('No release name given')
if releaseTag == '': if releaseTag == '':
raise Exception('No release tag given') raise Exception('No release tag given')
if releaseTagTarget == '': if (releaseTagTarget == '') and createReleaseTag:
raise Exception('No release tag target given') raise Exception('No release tag target given but creation of tag requested')
if releaseDescription == '': if (releaseDescription == '') and createRelease:
raise Exception('No release description given') raise Exception('No release description given but creation of release requested')
if insecure:
caBundle = (False)
def checkAndShowResult(result, expectedCode, errorMessage):
global verbose
if result.status_code != expectedCode:
print(result)
print(result.text)
raise Exception(errorMessage)
if verbose:
print(result)
print(result.text)
# --- upload the file # --- upload the file
uploadUrl = "%s/api/v4/projects/%s/uploads" % (instanceUrl, projectId) assets = [] # is required later, must be defined
if filesToUpload:
url = "%s/api/v4/projects/%s/uploads" % (instanceUrl, projectId)
headers = {"PRIVATE-TOKEN": privateToken} headers = {"PRIVATE-TOKEN": privateToken}
files = {"file": open(fileToUpload, 'rb')}
uploadResult = requests.post(uploadUrl, files=files, headers=headers) for filename in filesToUpload:
with open(filename, 'rb') as filehandle:
if uploadResult.status_code != 201: files = {"file": filehandle}
print(uploadResult)
print(uploadResult.text)
raise Exception('Unable to upload file to Gitlab')
if verbose: if verbose:
print(uploadResult) print("POST to {}".format(url))
print(uploadResult.text) result = requests.post(url, files=files, headers=headers, verify=caBundle)
print('File successfully uploaded')
uploadResultJson = json.loads(uploadResult.text) checkAndShowResult(result, 201, 'Unable to upload file to Gitlab')
assetUrl = projectUrl + json.loads(result.text)['url']
assets.append({'name': filename, 'url': assetUrl, 'id': "new-link-{}".format(len(assets))})
print('File {} successfully uploaded, url is {}'.format(filename, assetUrl))
# --- create release tag # --- create release tag
if createReleaseTag: if createReleaseTag:
createReleaseTagUrl = "%s/api/v4//projects/%s/repository/tags" % (instanceUrl, projectId) url = "%s/api/v4//projects/%s/repository/tags" % (instanceUrl, projectId)
headers = {"PRIVATE-TOKEN": privateToken, "Content-Type": "application/json"} headers = {"PRIVATE-TOKEN": privateToken, "Content-Type": "application/json"}
# id (required) - The ID or URL-encoded path of the project owned by the authenticated user payload = {
# tag_name (required) - The name of a tag
# ref (required) - Create tag using commit SHA, another tag name, or branch name.
# message (optional) - Creates annotated tag.
# release_description (optional) - Add release notes to the git tag and store it in the GitLab database.
payloadCreateReleaseTag = {
"tag_name": releaseTag, "tag_name": releaseTag,
"id": projectId, "id": projectId,
"ref": releaseTagTarget, "ref": releaseTagTarget,
"message": "Tag for release %s" % releaseName "message": "Tag for release %s" % releaseName
} }
createReleaseTagResult = requests.post(createReleaseTagUrl, headers=headers,
data=json.dumps(payloadCreateReleaseTag))
if createReleaseTagResult.status_code != 201:
print(createReleaseTagResult)
print(createReleaseTagResult.text)
raise Exception('Unable to create release tag')
if verbose: if verbose:
print(createReleaseTagResult) print("POST to {}".format(url))
print(createReleaseTagResult.text) result = requests.post(url, headers=headers, data=json.dumps(payload), verify=caBundle)
checkAndShowResult(result, 201, 'Unable to create release tag')
print('Tag successfully created') print('Tag successfully created')
# --- create release # --- create release
createReleaseUrl = "%s/api/v4/projects/%s/releases" % (instanceUrl, projectId) if createRelease:
url = "%s/api/v4/projects/%s/releases" % (instanceUrl, projectId)
headers = {"PRIVATE-TOKEN": privateToken, "Content-Type": "application/json"} headers = {"PRIVATE-TOKEN": privateToken, "Content-Type": "application/json"}
fullUrl = projectUrl + uploadResultJson['url']
payloadCreateRelease = { payload = {
"name": releaseName, "name": releaseName,
"tag_name": releaseTag, "tag_name": releaseTag,
"description": releaseDescription, "description": releaseDescription
"assets": {
"links": [
{
"name": fileToUpload,
"url": fullUrl
} }
]
}
}
createReleaseResult = requests.post(createReleaseUrl, headers=headers,
data=json.dumps(payloadCreateRelease))
if createReleaseResult.status_code != 201:
print(createReleaseResult)
print(createReleaseResult.text)
raise Exception('Unable to create release')
if verbose: if verbose:
print(createReleaseResult) print("POST to {}".format(url))
print(createReleaseResult.text) result = requests.post(url, headers=headers, data=json.dumps(payload), verify=caBundle)
checkAndShowResult(result, 201, 'Unable to create release')
print('Release successfully created') print('Release successfully created')
# --- update release in case of additional description
if not createRelease and releaseDescription:
# --- get release to fetch existing description
url = "%s/api/v4/projects/%s/releases/%s" % (instanceUrl, projectId, releaseTag)
headers = {"PRIVATE-TOKEN": privateToken}
if verbose:
print("GET to {}".format(url))
result = requests.get(url, headers=headers, verify=caBundle)
checkAndShowResult(result, 200, 'Unable to get release')
existingDescription = json.loads(result.text)['description']
print("Existing description is {}".format(existingDescription))
releaseDescription += "\n\n---------------------------------------------\n\n"
releaseDescription += existingDescription
# --- update release
url = "%s/api/v4/projects/%s/releases/%s" % (instanceUrl, projectId, releaseTag)
headers = {"PRIVATE-TOKEN": privateToken, "Content-Type": "application/json"}
payload = {
"name": releaseName,
"tag_name": releaseTag,
"description": releaseDescription
}
if verbose:
print("PUT to {}".format(url))
result = requests.put(url, headers=headers, data=json.dumps(payload), verify=caBundle)
checkAndShowResult(result, 200, 'Unable to update release')
print('Release successfully update')
# --- add assets
# get existing assets
headers = {"PRIVATE-TOKEN": privateToken}
url = "%s/api/v4/projects/%s/releases/%s" % (instanceUrl, projectId, releaseTag)
if verbose:
print("GET to {}".format(url))
result = requests.get(url, headers=headers, verify=caBundle)
checkAndShowResult(result, 200, 'Unable to get release information')
# add existing assets to list of assets
links = json.loads(result.text)['assets']['links']
assets.extend(links)
# delete existing assets
headers = {"PRIVATE-TOKEN": privateToken}
for link in links:
assetId = link['id']
url = "%s/api/v4/projects/%s/releases/%s/assets/links/%s" % (instanceUrl, projectId, releaseTag, assetId)
if verbose:
print("DELETE to {}".format(url))
result = requests.delete(url, headers=headers, verify=caBundle)
checkAndShowResult(result, 200, 'Unable to delete asset')
print("Asset {} successfully deleted".format(assetId))
# create all assets ("existing" and new)
headers = {"PRIVATE-TOKEN": privateToken, "Content-Type": "application/json"}
url = "%s/api/v4/projects/%s/releases/%s/assets/links" % (instanceUrl, projectId, releaseTag)
for asset in assets:
if verbose:
print("POST to {}".format(url))
result = requests.post(url, headers=headers, data=json.dumps(asset), verify=caBundle)
checkAndShowResult(result, 201, "Unable to create asset")
print("Asset {} successfully created".format(asset))

View File

@ -1,7 +1,8 @@
{ {
"releaseTag": "v1.4", "createRelease": "true",
"releaseTag": "v1.12",
"createReleaseTag": "true", "createReleaseTag": "true",
"releaseName": "Fifth release of the uploader", "releaseName": "updater release",
"description": "Set interpreter in shebang line and set execute flag" "description": "add option to add files to existing release or extend description of existing release"
} }

114
readme.md Normal file
View File

@ -0,0 +1,114 @@
# Release Uploader for Gitlab
Creating releases on Gitlab seems to work only via the REST API.
This Python script handles the upload of a release file, the creation of
the required release tag in the repository and the creation of the actual
release referring to both the tag and the file.
It supports commandline options and an input file, adjusted to be used in
Gitlab CI scripts.
## Usage
wn@tron:~/workspace-python/gitlabreleaseuploader [master ≡]$ ./gitlabreleaseuploader.py -h
usage: gitlabreleaseuploader.py [-h] --privateToken PRIVATETOKEN --projectId
PROJECTID --projectUrl PROJECTURL --file FILE
[--releaseName RELEASENAME]
[--releaseTag RELEASETAG]
[--releaseTagTarget RELEASETAGTARGET]
[--createReleaseTag]
[--description DESCRIPTION]
[--releaseInfoFile RELEASEINFOFILE]
[--caBundle FILE_WITH_CA_CERTIFICATES_TO_TRUST]
[--instanceUrl INSTANCEURL] [--verbose]
Gitlab Release Uploader
optional arguments:
-h, --help show this help message and exit
--privateToken PRIVATETOKEN, -p PRIVATETOKEN
Private token to access Gitlab
--projectId PROJECTID, -i PROJECTID
ProjectID of the related project
--projectUrl PROJECTURL, -u PROJECTURL
URL of the related project at Gitlab
--file FILE, -f FILE File to be released
--releaseName RELEASENAME, -n RELEASENAME
Name of the release
--releaseTag RELEASETAG, -t RELEASETAG
Tag of the release in the repo
--releaseTagTarget RELEASETAGTARGET, -T RELEASETAGTARGET
Commit or branch the tag should point to
--createReleaseTag, -c
Shall the release be created here
--description DESCRIPTION, -d DESCRIPTION
Description of the release
--releaseInfoFile RELEASEINFOFILE, -F RELEASEINFOFILE
File containing JSON object with release info (release
tag, create release tag, description
--instanceUrl INSTANCEURL, -I INSTANCEURL
URL of your gitlab instance
--caBundle FILE_WITH_CA_CERTIFICATES_TO_TRUST, -B FILE_WITH_CA_CERTIFICATES_TO_TRUST
--verbose, -v verbose output
wn@tron:~/workspace-python/gitlabreleaseuploader [master ≡]$
### Without release info file:
gitlabreleaseuploader.py -p PRIVATE_TOKEN -i PROJECT_ID -u PROJECT_URL
-f FILE_TO_BE_RELEASED -n RELEASE_NAME
-t RELEASE_TAG -T RELEASE_TAG_TARGET -c
-d RELEASE_DESCRIPTION -I INSTANCE_URL
### With release info file:
Release Info File:
{
"releaseTag": "v1.5",
"createReleaseTag": "true",
"releaseName": "Sixth release of the uploader",
"description": "Now with CI script and automatic release upload (hey, eat your own dogfood)"
}
Command:
gitlabreleaseuploader.py -p PRIVATE_TOKEN -i PROJECT_ID -u PROJECT_URL
-f FILE_TO_BE_RELEASED -F RELEASE_INFO_FILE
### Use in CI script
The PRIVATE_TOKEN should not be entered directly into the CI script but added as protected a CI variable to you particular project.
Then add the following stage into your CI script:
release:
stage: release
image: registry.gitlab.com/wolutator/base-build-env
only:
- release
script:
- gitlabreleaseuploader.py -p $PRIVATE_TOKEN -i $CI_PROJECT_ID -u $CI_PROJECT_URL
-f gitlabreleaseuploader.py -F info.json -T $CI_COMMIT_REF_NAME
Note, please: this stage definition is for a docker worker. It uses my ``base-build-env`` image, which already contains the
uploader script. However, it is no problem to use the uploader script also in different environments. It just depends on the
``Requests`` package.
Note too, please: this job is releasing the ``gitlabreleaseuploader.py`` script itself, so you see the name of the script twice in the CI script. Don't be confused, the option ``-f`` gets the file to be released.
Most information are taken from CI builtin variables, the tag name, release name and release description should be stored in
the release info file (here: ``info.json``), which is under version control.
To avoid releasing a file with everything single push to an arbitrary branch, add the ``only`` block.