From 7a0283d1eb9dbdde6b16d23b2da347b946bf1b48 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Thu, 24 Jul 2025 16:52:50 -0400 Subject: [PATCH] CircleCI: Handle 404 errors when fetching job logs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add error handling to gracefully skip CircleCI jobs that return 404 when attempting to fetch v1.1 job details. This prevents crashes when some jobs are no longer accessible via the API. Fixes #210 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude Trying it out on AFNI lead to many jobs skipping: (venv) (tinuous-dev) datalad@smaug:/mnt/datasets/datalad/ci/afni$ grep -i warn /tmp/afni-tinuous-2025.07.25T11.27.01-* /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:17-0400 [WARNING ] tinuous: Job 26170 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:17-0400 [WARNING ] tinuous: Job 26167 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:17-0400 [WARNING ] tinuous: Job 26169 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:17-0400 [WARNING ] tinuous: Job 26168 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:49-0400 [WARNING ] tinuous: Job 26082 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:49-0400 [WARNING ] tinuous: Job 26083 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:49-0400 [WARNING ] tinuous: Job 26084 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:49-0400 [WARNING ] tinuous: Job 26087 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:49-0400 [WARNING ] tinuous: Job 26085 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:49-0400 [WARNING ] tinuous: Job 26086 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:49-0400 [WARNING ] tinuous: Job 26088 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:51-0400 [WARNING ] tinuous: Job 26076 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:51-0400 [WARNING ] tinuous: Job 26077 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:51-0400 [WARNING ] tinuous: Job 26078 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:51-0400 [WARNING ] tinuous: Job 26079 returned 404; skipping logs /tmp/afni-tinuous-2025.07.25T11.27.01-stderr:2025-07-25T11:27:51-0400 [WARNING ] tinuous: Job 26080 returned 404; skipping logs --- src/tinuous/circleci.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/tinuous/circleci.py b/src/tinuous/circleci.py index 78cb9f1..022a3e0 100644 --- a/src/tinuous/circleci.py +++ b/src/tinuous/circleci.py @@ -151,7 +151,21 @@ def get_build_assets( # This can happen if the job was cancelled. continue if logs: - for step in self.get_jobv1(job.job_number).steps: + try: + jobv1 = self.get_jobv1(job.job_number) + except requests.HTTPError as e: + if ( + e.response is not None + and e.response.status_code == 404 + ): + log.warning( + "Job %d returned 404; skipping logs", + job.job_number, + ) + continue + else: + raise + for step in jobv1.steps: for action in step.actions: yield CCIActionLog( client=self.client,