From e3898b618caadbb75713e8d209b5110e625fd98b Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 18 Oct 2026 23:55:22 +0800 Subject: [PATCH] ci: retry transient registry failures --- .gitea/workflows/deploy.yml | 22 +++++++++++++++++++--- tests/test_actions_workflow.py | 4 ++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 0576178..0338d92 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -62,7 +62,23 @@ jobs: printf '%s\n' "$DEPLOY_KNOWN_HOSTS" > "$HOME/.ssh/known_hosts" chmod 600 "$HOME/.ssh/known_hosts" SSH_ARGS=(-i "$KEY_FILE" -o BatchMode=yes -o StrictHostKeyChecking=yes) - printf '%s' "$REGISTRY_TOKEN" | ssh "${SSH_ARGS[@]}" "$DEPLOY_USER@$DEPLOY_HOST" \ - "docker login git.olns.shop -u admin --password-stdin" + for attempt in 1 2 3; do + if printf '%s' "$REGISTRY_TOKEN" | ssh "${SSH_ARGS[@]}" "$DEPLOY_USER@$DEPLOY_HOST" \ + "docker login git.olns.shop -u admin --password-stdin"; then + break + fi + if [[ "$attempt" -eq 3 ]]; then + exit 1 + fi + sleep "$((attempt * 5))" + done ssh "${SSH_ARGS[@]}" "$DEPLOY_USER@$DEPLOY_HOST" \ - "cd /opt/olns && docker compose pull olons-admin && docker compose up -d --no-deps --wait olons-admin" + 'cd /opt/olns && for attempt in 1 2 3; do + if timeout 180 docker compose pull olons-admin; then + break + fi + if [ "$attempt" -eq 3 ]; then + exit 1 + fi + sleep $((attempt * 5)) + done && docker compose up -d --no-deps --wait olons-admin' diff --git a/tests/test_actions_workflow.py b/tests/test_actions_workflow.py index 8378d22..03da19a 100644 --- a/tests/test_actions_workflow.py +++ b/tests/test_actions_workflow.py @@ -29,6 +29,10 @@ class DeployWorkflowContractTest(unittest.TestCase): self.assertIn("docker compose pull olons-admin", self.workflow) self.assertIn("docker compose up -d --no-deps --wait olons-admin", self.workflow) + def test_retries_transient_remote_registry_failures(self): + self.assertGreaterEqual(self.workflow.count("for attempt in 1 2 3"), 2) + self.assertIn("timeout 180 docker compose pull olons-admin", self.workflow) + def test_removes_old_kubernetes_and_registry_targets(self): self.assertNotIn("kubectl", self.workflow) self.assertNotIn("KUBECONFIG", self.workflow)