def lambda_handler()

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"}