testing/flakybot-function/main.py (64 lines of code) (raw):

# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import base64 import json import os import subprocess from datetime import datetime, timedelta def write_xml_file(build_event): from junit_xml import TestSuite, TestCase build_id = build_event["id"] steps = build_event["steps"] outputs = build_event["results"]["buildStepOutputs"] test_cases = [] for x in range(len(steps)): step = steps[x] output = outputs[x] status = step["status"] start_time, elapsed = get_elapsed_time(step) if status in ("FAILURE", "INTERNAL_ERROR", "TIMEOUT", "EXPIRED"): failure = outputs[x] or status test = TestCase( name=step.get("id") or step.get("name"), stderr=failure, timestamp=start_time, elapsed_sec=elapsed ) test.add_failure_info(build_event.get("logUrl")) else: test = TestCase( name=step.get("id") or step.get("name"), stdout=outputs[x] or status, timestamp=start_time, elapsed_sec=elapsed, ) test_cases.append(test) ts = TestSuite("Cloud Build Suite", test_cases) # create a new XML file with the results sponge_log = open("/tmp/sponge_log.xml", "w") sponge_log.write(TestSuite.to_xml_string([ts])) def get_elapsed_time(step): timing = step.get("timing") if not timing: return None, None start_time = timing["startTime"].split(".")[0] end_time = timing["endTime"].split(".")[0] dt_start_time = datetime.fromisoformat(start_time) dt_end_time = datetime.fromisoformat(end_time) elapsed = (dt_end_time - dt_start_time).total_seconds() return start_time, elapsed def send_to_flakybot(event, context): try: data = base64.b64decode(event['data']) build_event = json.loads(data.decode("utf-8").strip()) status = build_event.get("status") # flakybot should only run on complete builds if (status in("SUCCESS", "FAILURE", "INTERNAL_ERROR", "TIMEOUT", "EXPIRED") # flakybot should not run on Pull Requests and "_PR_NUMBER" not in build_event["substitutions"]): write_xml_file(build_event) commit_sha = build_event["substitutions"]["COMMIT_SHA"] build_url = build_event.get("logUrl") out = subprocess.run( ["./flakybot", "-repo=GoogleCloudPlatform/cloud-run-samples", f"-commit_hash={commit_sha}", "-logs_dir=/tmp", f"-build_url={build_url}"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout print(out) except Exception as e: print(e)