diff --git a/src/github_sdk.py b/src/github_sdk.py index cf28d01..6744e70 100644 --- a/src/github_sdk.py +++ b/src/github_sdk.py @@ -53,7 +53,7 @@ def _get_extra_metadata(self, job): repo = runs["repository"]["full_name"] meta = { # "workflow_name": workflow["name"], - "author": runs["head_commit"]["author"], + "author": _get_author(runs), # https://getsentry.atlassian.net/browse/TET-22 # Tags are not linkified externally, plain text data can be selected in browsers and opened "data": { @@ -148,6 +148,20 @@ def send_trace(self, job): return self._send_envelope(trace) +def _get_author(runs): + head_commit = runs.get("head_commit") or {} + author = head_commit.get("author") + if author: + return author + + actor = runs.get("triggering_actor") or runs.get("actor") or {} + login = actor.get("login") + if login: + return {"username": login} + + return {} + + def _base_transaction(job): return { "event_id": get_uuid(), diff --git a/tests/test_github_sdk.py b/tests/test_github_sdk.py index 7f7e401..b64bb94 100644 --- a/tests/test_github_sdk.py +++ b/tests/test_github_sdk.py @@ -12,6 +12,7 @@ from sentry_sdk.utils import format_timestamp from src.github_sdk import GithubClient +from src.github_sdk import _get_author DSN = "https://foo@random.ingest.sentry.io/bar" TOKEN = "irrelevant" @@ -110,6 +111,42 @@ def test_trace_generation_with_failing_steps( assert trace["tags"]["event"] == "push" +def test_get_author_prefers_head_commit_author(jobA_runs): + assert _get_author(jobA_runs) == { + "name": "Ahmed Etefy", + "email": "ahmed.etefy12@gmail.com", + } + + +def test_get_author_falls_back_to_triggering_actor_for_null_head_commit(jobA_runs): + jobA_runs["event"] = "merge_group" + jobA_runs["head_commit"] = None + jobA_runs["triggering_actor"]["login"] = "merge-queue-user" + + assert _get_author(jobA_runs) == {"username": "merge-queue-user"} + + +@responses.activate +def test_trace_generation_with_null_head_commit(jobA_job, jobA_runs, jobA_workflow): + jobA_runs["event"] = "merge_group" + jobA_runs["head_commit"] = None + + responses.get( + jobA_job["run_url"], + json=jobA_runs, + ) + responses.get( + jobA_runs["workflow_url"], + json=jobA_workflow, + ) + + client = GithubClient(dsn=DSN, token=TOKEN) + trace = client._generate_trace(jobA_job) + + assert trace["tags"]["event"] == "merge_group" + assert trace["user"] == {"username": "ahmedetefy"} + + @freeze_time() @responses.activate @patch("src.github_sdk.get_uuid")