blob: 4d12771affd103e82c7520e413476fa26af4f6b4 [file] [log] [blame]
Harrison Mutai0e9964e2024-06-14 09:51:42 +01001#!/usr/bin/env python3
2
3import re
4from dataclasses import dataclass
5
6import requests
7
8openci_url = "http://ci.trustedfirmware.org/"
9
10
11class Job:
12
13 def __init__(self, name: str, response: dict, get_sub_jobs=False) -> None:
14 self.name = name
15 self.url = (
16 response["url"]
17 if openci_url in response["url"]
18 else openci_url + response["url"]
19 )
20 self.number = (
21 response["buildNumber"] if "buildNumber" in response else response["number"]
22 )
23
24 if "result" in response:
25 self.passed = response["result"].lower() == "success"
26
27 if get_sub_jobs and not "subBuilds" in response:
28 console = requests.get(self.url + "consoleText").text
29 self.set_sub_jobs(SubJob.get_jobs_from_console_log(console))
30 elif "subBuilds" in response:
31 self.set_sub_jobs(
32 list(map(lambda j: SubJob(j["jobAlias"], j), response["subBuilds"]))
33 )
34 else:
35 self.jobs = []
36
37 def __str__(self) -> str:
38 return f"{'✅' if self.passed else '❌'} *{self.name}*"
39
40 def __iter__(self):
41 yield from self.jobs
42
43 def failed_sub_jobs(self):
44 return list(filter(lambda j: not j.passed, self.jobs))
45
46 def print_failed_subjobs(self):
47 for j in self.failed_sub_jobs():
48 print(" " * 2, j)
49
50 def set_sub_jobs(self, jobs):
51 self.jobs = jobs
52 self.passed = not self.failed_sub_jobs()
53
54
55class SubJob(Job):
56
57 def __str__(self) -> str:
58 return f"• *{self.name}* [#{self.number}]({self.url}) {'✅' if self.passed else '❌'}"
59
60 @classmethod
61 def get_jobs_from_console_log(cls, log):
62 sub_jobs = []
63
64 for name, num in re.findall(r"(tf-a[-\w+]+) #(\d+) started", log):
65 response = requests.get(openci_url + f"job/{name}/{num}/api/json").json()
66 sub_jobs.append(cls(name, response, get_sub_jobs=False))
67 return sub_jobs
68
69
70def main():
71 job_urls = map(
72 lambda j: openci_url + f"job/{j}/api/json", ["tf-a-daily", "tf-a-tftf-main"]
73 )
74
75 jobs = list(
76 map(
77 lambda r: Job(r["displayName"], r["lastCompletedBuild"], get_sub_jobs=True),
78 map(lambda j: requests.get(j).json(), job_urls),
79 )
80 )
81
82 print("🟢" if all(j.passed for j in jobs) else "🔴", "Daily Status")
83
84 for j in jobs:
85 print("\n", j, f"[#{j.number}]({j.url})", "\n")
86 if j.name == "tf-a-daily" or not j.passed:
87 for subjob in j:
88 print(subjob)
89 subjob.print_failed_subjobs()
90
91
92if __name__ == "__main__":
93 main()