a328a64a80
Let's send both to to the bpo server with each request. This is needed to handle failing jobs (we need to know which job exactly is failing). Note that this is not directly using a sourcehut specific environment variable, because with bpo it is also possible to choose a "local" job service for testing (manual and testsuite). The local job service will just generate a random number as job id and place that in this variable.
84 lines
2.6 KiB
Python
Executable file
84 lines
2.6 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
# Copyright 2019 Martijn Braam
|
|
# Copyright 2019 Oliver Smith
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
import json
|
|
import os
|
|
import requests
|
|
|
|
# Require environment vars
|
|
for key in ["BPO_API_ENDPOINT",
|
|
"BPO_API_HOST",
|
|
"BPO_ARCH",
|
|
"BPO_BRANCH",
|
|
"BPO_JOB_ID",
|
|
"BPO_JOB_NAME",
|
|
"BPO_TOKEN_FILE",
|
|
"BPO_PAYLOAD_FILES", # one file per line
|
|
"BPO_PAYLOAD_IS_JSON", # set to "1" to enable
|
|
"BPO_PKGNAME",
|
|
"BPO_VERSION", # $pkgver-r$pkgrel
|
|
]:
|
|
if key not in os.environ:
|
|
print("ERROR: missing environment variable: " + key)
|
|
exit(1)
|
|
|
|
# Parse and check files
|
|
files = os.environ["BPO_PAYLOAD_FILES"].split("\n")
|
|
for path in files:
|
|
if not os.path.exists(path):
|
|
print("ERROR: file not found: " + path)
|
|
exit(1)
|
|
|
|
# Load token
|
|
with open(os.path.expanduser(os.environ["BPO_TOKEN_FILE"]),
|
|
encoding="utf-8") as handle:
|
|
token = handle.read().strip()
|
|
|
|
# Load other env vars
|
|
url = (os.environ["BPO_API_HOST"] + "/api/job-callback/" +
|
|
os.environ["BPO_API_ENDPOINT"])
|
|
is_json = (os.environ["BPO_PAYLOAD_IS_JSON"] == "1")
|
|
|
|
# Prepare HTTP headers
|
|
headers = {"X-BPO-Arch": os.environ["BPO_ARCH"],
|
|
"X-BPO-Branch": os.environ["BPO_BRANCH"],
|
|
"X-BPO-Job-Id": os.environ["BPO_JOB_ID"],
|
|
"X-BPO-Job-Name": os.environ["BPO_JOB_NAME"],
|
|
"X-BPO-Token": token,
|
|
"X-BPO-Pkgname": os.environ["BPO_PKGNAME"],
|
|
"X-BPO-Version": os.environ["BPO_VERSION"]}
|
|
|
|
# Submit JSON
|
|
if is_json:
|
|
if len(files) > 1:
|
|
print("ERROR: json mode doesn't support multiple input files")
|
|
exit(1)
|
|
|
|
# Send contents of file as HTTP POST with json payload
|
|
with open(files[0], encoding="utf-8") as handle:
|
|
data = handle.read()
|
|
data = json.loads(data)
|
|
|
|
print("Sending JSON to: " + url)
|
|
response = requests.post(url, json=data, headers=headers)
|
|
else: # Submit blobs
|
|
blobs = []
|
|
for path in files:
|
|
print("Appending: " + path)
|
|
filename = os.path.basename(path)
|
|
# Send contents of file as HTTP POST with multipart/formdata payload
|
|
blobs.append(("file[]", (filename,
|
|
open(path, "rb"),
|
|
"application/octet-stream")))
|
|
|
|
print("Uploading to: " + url)
|
|
response = requests.post(url, files=blobs, headers=headers)
|
|
|
|
if response.status_code > 399:
|
|
print("Error occurred:")
|
|
print(response.content.decode())
|
|
exit(1)
|
|
else:
|
|
print(response.content.decode())
|