Updated release script to use job-id based urls, as tags do not work
This commit is contained in:
parent
a163bce781
commit
566d1efdd6
2 changed files with 49 additions and 163 deletions
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from typing import Any, Dict, Optional, Tuple
|
||||
from typing import Any, Dict, List, Optional, Tuple
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
@ -10,6 +10,10 @@ import http.client
|
|||
from urllib.error import HTTPError
|
||||
|
||||
|
||||
encoder = json.encoder.JSONEncoder()
|
||||
decoder = json.decoder.JSONDecoder()
|
||||
|
||||
|
||||
def parse_changelog(tag: str) -> Optional[str]:
|
||||
release_changelog: str = ''
|
||||
with open('CHANGELOG.md', 'r') as f:
|
||||
|
@ -29,6 +33,28 @@ def parse_changelog(tag: str) -> Optional[str]:
|
|||
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:
|
||||
req = urllib.request.Request(url)
|
||||
try:
|
||||
|
@ -42,24 +68,27 @@ def fetch_single_shafile(url: str) -> str:
|
|||
return filename
|
||||
|
||||
|
||||
def fetch_wheel_url(base_url: str) -> Optional[Tuple[str, str]]:
|
||||
wheel_sha_url: str = f'{base_url}/dist/SHA256SUMS?job=build_wheel'
|
||||
def fetch_wheel_url(base_url: str, job_ids: Dict[str, str]) -> Optional[Tuple[str, str]]:
|
||||
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_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
|
||||
|
||||
|
||||
def fetch_debian_url(base_url: str) -> Optional[Tuple[str, str]]:
|
||||
debian_sha_url: str = f'{base_url}/package/debian/SHA256SUMS?job=build_debian'
|
||||
def fetch_debian_url(base_url: str, job_ids: Dict[str, str]) -> Optional[Tuple[str, str]]:
|
||||
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_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
|
||||
|
||||
|
||||
def fetch_arch_url(base_url: str) -> Optional[Tuple[str, str]]:
|
||||
arch_sha_url: str = f'{base_url}/package/archlinux/SHA256SUMS?job=build_archlinux'
|
||||
def fetch_arch_url(base_url: str, job_ids: Dict[str, str]) -> Optional[Tuple[str, str]]:
|
||||
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_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
|
||||
|
||||
|
||||
|
@ -68,6 +97,7 @@ def main():
|
|||
release_tag: Optional[str] = os.getenv('CI_COMMIT_TAG')
|
||||
project_name: Optional[str] = os.getenv('CI_PROJECT_PATH')
|
||||
project_id: Optional[str] = os.getenv('CI_PROJECT_ID')
|
||||
pipeline_id: Optional[str] = os.getenv('CI_PIPELINE_ID')
|
||||
if api_token is None:
|
||||
print('GITLAB_API_TOKEN is not set.', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
@ -80,17 +110,22 @@ def main():
|
|||
if project_id is None:
|
||||
print('CI_PROJECT_ID is not set.', file=sys.stderr)
|
||||
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)
|
||||
if changelog is None:
|
||||
print('Changelog could not be parsed.', file=sys.stderr)
|
||||
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)
|
||||
debian_url, debian_sha_url = fetch_wheel_url(base_url)
|
||||
arch_url, arch_sha_url = fetch_wheel_url(base_url)
|
||||
base_url: str = f'https://gitlab.com/{project_name}/-'
|
||||
|
||||
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()}
|
||||
|
||||
|
@ -101,8 +136,6 @@ def main():
|
|||
- [Arch Linux Package]({arch_url}) ([sha256]({arch_sha_url}))
|
||||
- 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})
|
||||
|
||||
gitlab_release_api_url: str = \
|
||||
|
|
147
touchkey.html
147
touchkey.html
|
@ -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>
|
Loading…
Reference in a new issue