feat(ci): retry dep-PR container verification until publish lands
CI / validate (pull_request) Successful in 1m4s
CI / auto-merge (pull_request) Successful in 24s

The post-merge dep-PR step races the producer's image-build workflow
and fails 404 before the tag is pushed. resolve_container_digest gains
a timeout_s retry (15s interval); --verify-timeout exposes it
(default 600s).

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Emil Simeonov
2026-09-19 21:47:03 +02:00
co-authored by Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
parent 457f52cba7
commit 62ef5a8d52
4 changed files with 125 additions and 27 deletions
+21
View File
@@ -621,3 +621,24 @@ class TestBranchCreation:
# PR title carries the task ID
assert client.create_pr.call_args.kwargs["title"] == "OBL-INFRA-581: Bump sso_bridge to 0.9.1"
mock_task.assert_called_once()
def test_retries_404_until_published(self) -> None:
import requests
from devx.ci.create_dependency_pr import resolve_container_digest
err = requests.HTTPError("404")
err.response = MagicMock(status_code=404)
fail = MagicMock()
fail.raise_for_status.side_effect = err
ok = MagicMock()
ok.raise_for_status = MagicMock()
ok.json.return_value = [{"name": "manifest.json", "sha256": "cafe"}]
with (
patch("devx.ci.create_dependency_pr.requests.get", side_effect=[fail, ok]),
patch("devx.ci.create_dependency_pr.time.sleep"),
):
digest = resolve_container_digest(
"https://git.example.com/api/v1", "oblachno", "sso-bridge", "0.9.1", "tok", timeout_s=60
)
assert digest == "sha256:cafe"