From be4206bce8df00dc687ea529baf8b638d9e5d84c Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 15 Nov 2020 17:08:52 -0800 Subject: [PATCH] Skip expired workflow artifacts Workflow artifacts expire after a default of 90 days. For some inscrutable reason, the GitHub workflow artifacts API still lists these artifacts, even though they are no longer available. Previously, if the repository contained an open PR with an expired artifact, it caused the action to fail when it tried to download the non-existent artifact and got an HTTP 500 error. --- reportsizedeltas/reportsizedeltas.py | 2 +- .../tests/test_reportsizedeltas.py | 36 +++++++++++-------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/reportsizedeltas/reportsizedeltas.py b/reportsizedeltas/reportsizedeltas.py index fe7406f..dfe1913 100644 --- a/reportsizedeltas/reportsizedeltas.py +++ b/reportsizedeltas/reportsizedeltas.py @@ -239,7 +239,7 @@ def get_artifact_download_url_for_run(self, run_id): for artifact_data in artifacts_data["artifacts"]: # The artifact is identified by a specific name - if artifact_data["name"] == self.sketches_reports_source: + if not artifact_data["expired"] and artifact_data["name"] == self.sketches_reports_source: return artifact_data["archive_download_url"] page_number += 1 diff --git a/reportsizedeltas/tests/test_reportsizedeltas.py b/reportsizedeltas/tests/test_reportsizedeltas.py index 4378a61..5cf2eb6 100644 --- a/reportsizedeltas/tests/test_reportsizedeltas.py +++ b/reportsizedeltas/tests/test_reportsizedeltas.py @@ -411,7 +411,9 @@ def test_get_artifact_download_url_for_sha(): report_size_deltas.get_artifact_download_url_for_run.assert_called_once_with(run_id=run_id) -def test_get_artifact_download_url_for_run(): +@pytest.mark.parametrize("expired", [True, False]) +@pytest.mark.parametrize("artifact_name", ["test_sketches_reports_source", "incorrect-artifact-name"]) +def test_get_artifact_download_url_for_run(expired, artifact_name): repository_name = "test_name/test_repo" sketches_reports_source = "test_sketches_reports_source" archive_download_url = "archive_download_url" @@ -420,29 +422,35 @@ def test_get_artifact_download_url_for_run(): report_size_deltas = get_reportsizedeltas_object(repository_name=repository_name, sketches_reports_source=sketches_reports_source) - json_data = {"artifacts": [{"name": sketches_reports_source, "archive_download_url": archive_download_url}, - {"name": "bar123", "archive_download_url": "wrong_artifact_url"}]} + json_data = { + "artifacts": [ + { + "name": artifact_name, + "archive_download_url": archive_download_url, + "expired": expired + }, + { + "name": "bar123", + "archive_download_url": "wrong_artifact_url", + "expired": False + } + ] + } report_size_deltas.api_request = unittest.mock.MagicMock(return_value={"json_data": json_data, "additional_pages": False, "page_count": 1}) - # Artifact name match - assert archive_download_url == report_size_deltas.get_artifact_download_url_for_run(run_id=run_id) + download_url = report_size_deltas.get_artifact_download_url_for_run(run_id=run_id) + if not expired and artifact_name == sketches_reports_source: + assert download_url == archive_download_url + else: + assert download_url is None report_size_deltas.api_request.assert_called_once_with( request="repos/" + repository_name + "/actions/runs/" + str(run_id) + "/artifacts", page_number=1) - json_data = {"artifacts": [{"name": "foo123", "archive_download_url": "test_artifact_url"}, - {"name": "bar123", "archive_download_url": "wrong_artifact_url"}]} - report_size_deltas.api_request = unittest.mock.MagicMock(return_value={"json_data": json_data, - "additional_pages": False, - "page_count": 1}) - - # No artifact name match - assert report_size_deltas.get_artifact_download_url_for_run(run_id=run_id) is None - @pytest.mark.parametrize("test_artifact_name, expected_success", [("correct-artifact-name", True),