1
0
Fork 0
forked from s3lph/matemat

Updated release script to use job-id based urls, as tags do not work

This commit is contained in:
s3lph 2018-11-04 10:26:55 +01:00
parent a163bce781
commit 566d1efdd6
2 changed files with 49 additions and 163 deletions

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from typing import Any, Dict, Optional, Tuple from typing import Any, Dict, List, Optional, Tuple
import os import os
import sys import sys
@ -10,6 +10,10 @@ import http.client
from urllib.error import HTTPError from urllib.error import HTTPError
encoder = json.encoder.JSONEncoder()
decoder = json.decoder.JSONDecoder()
def parse_changelog(tag: str) -> Optional[str]: def parse_changelog(tag: str) -> Optional[str]:
release_changelog: str = '' release_changelog: str = ''
with open('CHANGELOG.md', 'r') as f: with open('CHANGELOG.md', 'r') as f:
@ -29,6 +33,28 @@ def parse_changelog(tag: str) -> Optional[str]:
return release_changelog return release_changelog
def fetch_job_ids(project_id: int, pipeline_id: int, api_token: str) -> Dict[str, str]:
url: str = f'https://gitlab.com/api/v4/projects/{project_id}/pipelines/{pipeline_id}/jobs'
headers: Dict[str, str] = {
'Private-Token': api_token
}
req = urllib.request.Request(url, headers=headers)
try:
resp: http.client.HTTPResponse = urllib.request.urlopen(req)
except HTTPError as e:
print(e.read().decode())
sys.exit(1)
resp_data: bytes = resp.read()
joblist: List[Dict[str, Any]] = decoder.decode(resp_data.decode())
jobidmap: Dict[str, str] = {}
for job in joblist:
name: str = job['name']
id: str = job['id']
jobidmap[name] = id
return jobidmap
def fetch_single_shafile(url: str) -> str: def fetch_single_shafile(url: str) -> str:
req = urllib.request.Request(url) req = urllib.request.Request(url)
try: try:
@ -42,24 +68,27 @@ def fetch_single_shafile(url: str) -> str:
return filename return filename
def fetch_wheel_url(base_url: str) -> Optional[Tuple[str, str]]: def fetch_wheel_url(base_url: str, job_ids: Dict[str, str]) -> Optional[Tuple[str, str]]:
wheel_sha_url: str = f'{base_url}/dist/SHA256SUMS?job=build_wheel' mybase: str = f'{base_url}/jobs/{job_ids["build_wheel"]}/artifacts/raw'
wheel_sha_url: str = f'{mybase}/dist/SHA256SUMS'
wheel_filename: str = fetch_single_shafile(wheel_sha_url) wheel_filename: str = fetch_single_shafile(wheel_sha_url)
wheel_url: str = f'{base_url}/dist/{wheel_filename}?job=build_wheel' wheel_url: str = f'{mybase}/dist/{wheel_filename}'
return wheel_url, wheel_sha_url return wheel_url, wheel_sha_url
def fetch_debian_url(base_url: str) -> Optional[Tuple[str, str]]: def fetch_debian_url(base_url: str, job_ids: Dict[str, str]) -> Optional[Tuple[str, str]]:
debian_sha_url: str = f'{base_url}/package/debian/SHA256SUMS?job=build_debian' mybase: str = f'{base_url}/jobs/{job_ids["build_debian"]}/artifacts/raw'
debian_sha_url: str = f'{mybase}/package/debian/SHA256SUMS'
debian_filename: str = fetch_single_shafile(debian_sha_url) debian_filename: str = fetch_single_shafile(debian_sha_url)
debian_url: str = f'{base_url}/package/debian/{debian_filename}?job=build_debian' debian_url: str = f'{mybase}/package/debian/{debian_filename}'
return debian_url, debian_sha_url return debian_url, debian_sha_url
def fetch_arch_url(base_url: str) -> Optional[Tuple[str, str]]: def fetch_arch_url(base_url: str, job_ids: Dict[str, str]) -> Optional[Tuple[str, str]]:
arch_sha_url: str = f'{base_url}/package/archlinux/SHA256SUMS?job=build_archlinux' mybase: str = f'{base_url}/jobs/{job_ids["build_archlinux"]}/artifacts/raw'
arch_sha_url: str = f'{mybase}/package/archlinux/SHA256SUMS'
arch_filename: str = fetch_single_shafile(arch_sha_url) arch_filename: str = fetch_single_shafile(arch_sha_url)
arch_url: str = f'{base_url}/package/archlinux/{arch_filename}?job=build_archlinux' arch_url: str = f'{mybase}/package/archlinux/{arch_filename}'
return arch_url, arch_sha_url return arch_url, arch_sha_url
@ -68,6 +97,7 @@ def main():
release_tag: Optional[str] = os.getenv('CI_COMMIT_TAG') release_tag: Optional[str] = os.getenv('CI_COMMIT_TAG')
project_name: Optional[str] = os.getenv('CI_PROJECT_PATH') project_name: Optional[str] = os.getenv('CI_PROJECT_PATH')
project_id: Optional[str] = os.getenv('CI_PROJECT_ID') project_id: Optional[str] = os.getenv('CI_PROJECT_ID')
pipeline_id: Optional[str] = os.getenv('CI_PIPELINE_ID')
if api_token is None: if api_token is None:
print('GITLAB_API_TOKEN is not set.', file=sys.stderr) print('GITLAB_API_TOKEN is not set.', file=sys.stderr)
sys.exit(1) sys.exit(1)
@ -80,17 +110,22 @@ def main():
if project_id is None: if project_id is None:
print('CI_PROJECT_ID is not set.', file=sys.stderr) print('CI_PROJECT_ID is not set.', file=sys.stderr)
sys.exit(1) sys.exit(1)
if pipeline_id is None:
print('CI_PIPELINE_ID is not set.', file=sys.stderr)
sys.exit(1)
changelog: Optional[str] = parse_changelog(release_tag) changelog: Optional[str] = parse_changelog(release_tag)
if changelog is None: if changelog is None:
print('Changelog could not be parsed.', file=sys.stderr) print('Changelog could not be parsed.', file=sys.stderr)
sys.exit(1) sys.exit(1)
base_url: str = f'https://gitlab.com/{project_name}/-/jobs/artifacts/{release_tag}/raw' job_ids: Dict[str, str] = fetch_job_ids(project_id, pipeline_id, api_token)
wheel_url, wheel_sha_url = fetch_wheel_url(base_url) base_url: str = f'https://gitlab.com/{project_name}/-'
debian_url, debian_sha_url = fetch_wheel_url(base_url)
arch_url, arch_sha_url = fetch_wheel_url(base_url) wheel_url, wheel_sha_url = fetch_wheel_url(base_url, job_ids)
debian_url, debian_sha_url = fetch_wheel_url(base_url, job_ids)
arch_url, arch_sha_url = fetch_wheel_url(base_url, job_ids)
augmented_changelog = f'''{changelog.strip()} augmented_changelog = f'''{changelog.strip()}
@ -101,8 +136,6 @@ def main():
- [Arch Linux Package]({arch_url}) ([sha256]({arch_sha_url})) - [Arch Linux Package]({arch_url}) ([sha256]({arch_sha_url}))
- Docker image: registry.gitlab.com/{project_name}:{release_tag}''' - Docker image: registry.gitlab.com/{project_name}:{release_tag}'''
encoder = json.encoder.JSONEncoder()
decoder = json.decoder.JSONDecoder()
post_body: str = encoder.encode({'description': augmented_changelog}) post_body: str = encoder.encode({'description': augmented_changelog})
gitlab_release_api_url: str = \ gitlab_release_api_url: str = \

View file

@ -1,147 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<style>
svg {
width: 600px;
height: auto;
}
</style>
</head>
<body>
<h1>Welcome, {{username}}</h1>
<svg id="svg" width="400" height="400">
<circle class="c" id="0" cx="12.5%" cy="12.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="1" cx="37.5%" cy="12.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="2" cx="62.5%" cy="12.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="3" cx="87.5%" cy="12.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="4" cx="12.5%" cy="37.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="5" cx="37.5%" cy="37.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="6" cx="62.5%" cy="37.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="7" cx="87.5%" cy="37.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="8" cx="12.5%" cy="62.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="9" cx="37.5%" cy="62.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="a" cx="62.5%" cy="62.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="b" cx="87.5%" cy="62.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="c" cx="12.5%" cy="87.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="d" cx="37.5%" cy="87.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="e" cx="62.5%" cy="87.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
<circle class="c" id="f" cx="87.5%" cy="87.5%" r="10%" stroke="grey" stroke-width="2%" fill="white" />
</svg>
<script>
HTMLCollection.prototype.forEach = Array.prototype.forEach;
HTMLCollection.prototype.slice = Array.prototype.slice;
mouseDown = false;
currentStroke = null;
strokeId = 0;
doneMap = {};
enteredKey = '';
svg = document.getElementById('svg');
drawLine = (fromX, fromY, toX, toY) => {
var line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
var id = 'l-' + (strokeId++);
var idAttr = document.createAttribute('id');
var classAttr = document.createAttribute('class');
var x1attr = document.createAttribute('x1');
var y1attr = document.createAttribute('y1');
var x2attr = document.createAttribute('x2');
var y2attr = document.createAttribute('y2');
var styleAttr = document.createAttribute('style');
idAttr.value = id;
classAttr.value = 'l';
x1attr.value = fromX;
y1attr.value = fromY;
x2attr.value = toX;
y2attr.value = toY;
styleAttr.value = 'stroke: grey; stroke-width: 5%; stroke-linecap: round';
line.setAttributeNode(idAttr);
line.setAttributeNode(classAttr);
line.setAttributeNode(x1attr);
line.setAttributeNode(y1attr);
line.setAttributeNode(x2attr);
line.setAttributeNode(y2attr);
line.setAttributeNode(styleAttr);
svg.appendChild(line);
return id;
};
svg.onmousedown = (ev) => {
var svgrect = svg.getBoundingClientRect();
var minId = '';
var minDist = Infinity;
var minx = 0;
var miny = 0;
doneMap = {};
document.getElementsByClassName('c').forEach((circle) => {
var x = parseFloat(circle.getAttribute('cx'))/100.0 * svgrect.width;
var y = parseFloat(circle.getAttribute('cy'))/100.0 * svgrect.height;
var dist = Math.pow(ev.offsetX - x, 2) + Math.pow(ev.offsetY - y, 2);
if (dist < minDist) {
minDist = dist;
minId = circle.id;
minx = x;
miny = y;
}
});
var minNode = svg.getElementById(minId);
currentStroke = drawLine(minx, miny, ev.offsetX, ev.offsetY);
doneMap[minId] = 1;
enteredKey += minId;
};
svg.onmouseup = (ev) => {
currentStroke = null;
doneMap = {};
console.log(enteredKey);
enteredKey = '';
svg.getElementsByClassName('l').slice().reverse().forEach((line) => {
svg.removeChild(line);
});
};
svg.onmousemove = (ev) => {
if (currentStroke != null) {
var svgrect = svg.getBoundingClientRect();
var minId = '';
var minDist = Infinity;
var minx = 0;
var miny = 0;
document.getElementsByClassName('c').forEach((circle) => {
var x = parseFloat(circle.getAttribute('cx'))/100.0 * svgrect.width;
var y = parseFloat(circle.getAttribute('cy'))/100.0 * svgrect.height;
var dist = Math.pow(ev.offsetX - x, 2) + Math.pow(ev.offsetY - y, 2);
if (dist < minDist) {
minDist = dist;
minId = circle.id;
minx = x;
miny = y;
}
});
if (minDist < 2000 && !(minId in doneMap)) {
var line = svg.getElementById(currentStroke);
line.setAttribute('x2', minx);
line.setAttribute('y2', miny);
currentStroke = drawLine(minx, miny, ev.offsetX, ev.offsetY);
doneMap[minId] = 1;
enteredKey += minId;
}
var line = svg.getElementById(currentStroke);
line.setAttribute('x2', ev.offsetX);
line.setAttribute('y2', ev.offsetY);
}
};
</script>
</body>
</html>