in aws/lambda/github-status-webhook-handler/lambda_function.py [0:0]
def lambda_handler(event, context):
body = json.loads(event["body"])
# push
if 'commits' in body:
handle_commits(body['commits'], body['ref'])
return
# check_run
if "check_run" in body:
commitId = body["check_run"]["head_sha"]
# html_url should link to the overall workflow page
build_url = body["check_run"]["html_url"]
workflow_name = get_workflow_name(body["check_run"]["id"])
if workflow_name:
job_name = f'{workflow_name} / {body["check_run"]["name"]}'
else:
return
status = body["check_run"]["conclusion"]
committer = body["sender"]["login"]
# For some reason actions aren't facebook-github-bot..
is_master = body["check_run"]["check_suite"]["head_branch"] == "master"
# status
else:
commitId = body["sha"]
build_url = body["target_url"]
job_name = body["context"]
status = body["state"]
# Detect CircleCI cancelled jobs
description = body.get("description")
if status == 'error' and description == "Your CircleCI tests were canceled":
status = 'cancelled'
try:
committer = body["commit"]["committer"]["login"]
except TypeError:
print(json.dumps(body))
committer = "(unknown)"
# master commits are always made by facebook-github-bot
is_master = committer == "facebook-github-bot"
commit_source = ''
if is_master:
commit_source = 'master'
else:
commit_source = 'pr'
print(json.dumps({
"commitId": commitId,
"build_url": build_url,
"job_name": job_name,
"status": status,
"committer": committer,
"commit_source": commit_source,
"bucket": "ossci-job-status",
}))
status_file_name = commitId+'.json'
timeout_in_seconds = 60
r = redis.Redis(host=os.environ.get('redis_host'))
with r.lock(commitId, timeout_in_seconds):
job_statuses = s3_get_json(
bucket_name, f'{commit_source}/{status_file_name}', {})
combined_job_statuses = s3_get_json(
bucket_name, f'combined/{status_file_name}', {})
job_statuses[job_name] = {'status': status, 'build_url': build_url}
combined_job_statuses[job_name] = {
'status': status, 'build_url': build_url}
s3.Object(
bucket_name, f'{commit_source}/{status_file_name}').put(Body=json_dumps(job_statuses))
s3.Object(bucket_name, f'combined/{status_file_name}').put(
Body=json_dumps(combined_job_statuses))
return {"statusCode": 200, "body": "update processed"}