178 lines
5.4 KiB
Python
178 lines
5.4 KiB
Python
# %%
|
|
import io
|
|
import os
|
|
import json
|
|
import sys
|
|
import zipfile
|
|
import requests
|
|
from datetime import date, datetime, timedelta
|
|
|
|
authtoken = sys.argv[1]
|
|
print("Using authtoken with prefix: " + authtoken[:4])
|
|
|
|
|
|
# %%
|
|
def getRuns(createdDate):
|
|
runsResponse = requests.get(
|
|
"https://api.github.com/repos/microsoft/vscode-jupyter/actions/workflows/build-test.yml/runs",
|
|
params={"created": createdDate, "branch": "main"},
|
|
headers={
|
|
"Accept": "application/vnd.github+json",
|
|
"Authorization": f"Bearer {authtoken}",
|
|
},
|
|
)
|
|
|
|
if runsResponse.status_code != 200:
|
|
print(f"Error {runsResponse.status_code}")
|
|
raise Exception("Error getting runs")
|
|
|
|
runs = runsResponse.json()["workflow_runs"]
|
|
|
|
for run in runs:
|
|
print(f"Found run {run['id']} for event '{run['event']}'")
|
|
|
|
return runs
|
|
|
|
|
|
def getArtifactData(id):
|
|
testResultsResponse = requests.get(
|
|
f"https://api.github.com/repos/microsoft/vscode-jupyter/actions/artifacts/{id}/zip",
|
|
headers={
|
|
"Accept": "application/vnd.github+json",
|
|
"Authorization": f"Bearer {authtoken}",
|
|
},
|
|
)
|
|
|
|
if testResultsResponse.status_code != 200:
|
|
print(f"Error {testResultsResponse.status_code} getting artifact {id}")
|
|
|
|
return testResultsResponse.content
|
|
|
|
|
|
def getResultsJson(zipData):
|
|
artifact = zipfile.ZipFile(io.BytesIO(zipData))
|
|
for name in artifact.namelist():
|
|
if name.endswith("results.json"):
|
|
print(f" parsing {name} from artifact with {artifact.namelist()}")
|
|
return json.loads(artifact.read(name))
|
|
else:
|
|
print("No results.json found in artifact")
|
|
return []
|
|
|
|
|
|
def getResultsForRun(run):
|
|
url = run["artifacts_url"]
|
|
print(f"Getting artifacts from {url}")
|
|
artifactsResponse = requests.get(
|
|
url, headers={"Accept": "application/vnd.github+json"}
|
|
)
|
|
|
|
if artifactsResponse.status_code != 200:
|
|
print(f"Error {artifactsResponse.status_code} getting artifacts")
|
|
return []
|
|
|
|
artifacts = artifactsResponse.json()["artifacts"]
|
|
|
|
results = []
|
|
for artifact in artifacts:
|
|
if (
|
|
artifact["name"].startswith(
|
|
"TestResult-" # previous artifact name (pre ~2022-09-12)
|
|
)
|
|
or artifact["name"].startswith(
|
|
"TestResults-" # previous performance tests artifact name
|
|
)
|
|
or artifact["name"].startswith(
|
|
"TestLogs-" # consolidated artifact name, contains multiple files
|
|
)
|
|
):
|
|
print(f" retrieving {artifact['name']}")
|
|
rawData = getArtifactData(artifact["id"])
|
|
testRunResults = getResultsJson(rawData)
|
|
results.append(
|
|
{
|
|
"scenario": artifact["name"],
|
|
"date": run["created_at"],
|
|
"runUrl": run["html_url"],
|
|
"data": testRunResults,
|
|
}
|
|
)
|
|
print(f" {len(testRunResults)} results read")
|
|
|
|
return results
|
|
|
|
|
|
def flattenTestResultsToFile(runResults, filename):
|
|
resultCount = 1
|
|
delimiter = ""
|
|
with open(filename, "w") as outfile:
|
|
outfile.write("[\n")
|
|
for runResult in runResults:
|
|
print(f"writing results {resultCount} of {len(runResults)}")
|
|
resultCount += 1
|
|
for scenario in runResult:
|
|
suite = []
|
|
for testResult in scenario["data"]:
|
|
if (
|
|
testResult["event"] == "suite"
|
|
and len(str.strip(testResult["title"])) > 0
|
|
):
|
|
suite.append(testResult["title"])
|
|
elif (
|
|
testResult["event"] == "suite end"
|
|
and len(str.strip(testResult["title"]))
|
|
and len(suite) > 0
|
|
):
|
|
suite.pop()
|
|
elif "title" in testResult and "state" in testResult:
|
|
outfile.write(delimiter)
|
|
singleResult = {
|
|
"scenario": scenario["scenario"],
|
|
"suite": " - ".join(suite),
|
|
"testName": testResult["title"],
|
|
"date": scenario["date"],
|
|
"runUrl": scenario["runUrl"],
|
|
"status": testResult["state"],
|
|
}
|
|
if "duration" in testResult:
|
|
singleResult["duration"] = testResult["duration"]
|
|
outfile.write(json.dumps(singleResult))
|
|
delimiter = ",\n"
|
|
|
|
outfile.write("\n]\n")
|
|
|
|
|
|
# %%
|
|
|
|
|
|
inputDate = ""
|
|
if len(sys.argv) > 2:
|
|
inputDate = sys.argv[2]
|
|
|
|
try:
|
|
collectionDateTime = datetime.strptime(inputDate, "%Y-%m-%d")
|
|
collectionDate = date.fromtimestamp(collectionDateTime.timestamp())
|
|
except ValueError:
|
|
print(
|
|
f"The string {inputDate} is not a date with format yyyy-mm-dd, running for yesterday"
|
|
)
|
|
collectionDate = date.today() - timedelta(days=1)
|
|
|
|
# %%
|
|
runs = getRuns(collectionDate)
|
|
|
|
# %%
|
|
runResults = []
|
|
for run in runs:
|
|
runResults.append(getResultsForRun(run))
|
|
|
|
# %%
|
|
resultFile = f'AggTestResults-{collectionDate.strftime("%Y-%m-%d")}.json'
|
|
allTests = flattenTestResultsToFile(runResults, resultFile)
|
|
|
|
# %%
|
|
file_size = os.path.getsize(resultFile)
|
|
print(f"Wrote {file_size} bytes to {resultFile}")
|
|
|
|
# %%
|