in aws_codeseeder/services/codebuild.py [0:0]
def fetch_build_info(build_id: str) -> BuildInfo:
"""Fetch info on a CodeBuild execution
Parameters
----------
build_id : str
CodeBuild Execution/Build Id
Returns
-------
BuildInfo
Info on the CodeBuild execution
Raises
------
RuntimeError
If the Build Id is not found
"""
client = boto3_client("codebuild")
response: Dict[str, List[Dict[str, Any]]] = try_it(
f=client.batch_get_builds, ex=botocore.exceptions.ClientError, ids=[build_id], max_num_tries=5
)
if not response["builds"]:
raise RuntimeError(f"CodeBuild build {build_id} not found.")
build = response["builds"][0]
now = datetime.now(timezone.utc)
log_enabled = True if build.get("logs", {}).get("cloudWatchLogs", {}).get("status") == "ENABLED" else False
return BuildInfo(
build_id=build_id,
status=BuildStatus(value=build["buildStatus"]),
current_phase=BuildPhaseType(value=build["currentPhase"]),
start_time=build["startTime"],
end_time=build.get("endTime", now),
duration_in_seconds=(build.get("endTime", now) - build["startTime"]).total_seconds(),
phases=[
BuildPhase(
phase_type=BuildPhaseType(value=p["phaseType"]),
status=None if "phaseStatus" not in p else BuildPhaseStatus(value=p["phaseStatus"]),
start_time=p["startTime"],
end_time=p.get("endTime", now),
duration_in_seconds=p.get("durationInSeconds"),
contexts=[
BuildPhaseContext(status_code=p.get("statusCode"), message=p.get("message"))
for c in p.get("contexts", [])
],
)
for p in build["phases"]
],
logs=BuildCloudWatchLogs(
enabled=log_enabled,
group_name=build["logs"]["cloudWatchLogs"].get("groupName") if log_enabled else None,
stream_name=build["logs"]["cloudWatchLogs"].get("streamName") if log_enabled else None,
),
)