From 8dbee1cf5249aa725727b858d21fb7e1c6d6fcdc Mon Sep 17 00:00:00 2001 From: Ivan Fernandez Calvo Date: Thu, 4 Jul 2019 11:00:04 +0200 Subject: [PATCH 1/2] feat: retry Docker login on failure 3 times --- vars/dockerLogin.groovy | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/vars/dockerLogin.groovy b/vars/dockerLogin.groovy index 51e6c0c4c..80c141e57 100644 --- a/vars/dockerLogin.groovy +++ b/vars/dockerLogin.groovy @@ -31,18 +31,23 @@ def call(Map params = [:]){ def dockerUser = data.containsKey('user') ? data.user : error("dockerLogin: No valid user in secret.") def dockerPassword = data.containsKey('password') ? data.password : error("dockerLogin: No valid password in secret.") - wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [ - [var: 'DOCKER_USER', password: dockerUser], - [var: 'DOCKER_PASSWORD', password: dockerPassword], - ]]) { + wrap([$class: 'MaskPasswordsBuildWrapper', + varPasswordPairs: [ + [var: 'DOCKER_USER', password: dockerUser], + [var: 'DOCKER_PASSWORD', password: dockerPassword], + ]]) { withEnv([ "DOCKER_USER=${dockerUser}", - "DOCKER_PASSWORD=${dockerPassword}"]) { + "DOCKER_PASSWORD=${dockerPassword}" + ]) { + retry(3) { + sleep randomNumber(min: 5, max: 10) sh(label: "Docker login", script: """ set +x host ${registry} 2>&1 > /dev/null docker login -u "\${DOCKER_USER}" -p "\${DOCKER_PASSWORD}" "${registry}" 2>/dev/null """) + } } } } From 214e9d908224d1461753b17465a2bcd4827c4ea2 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 4 Jul 2019 10:34:41 +0100 Subject: [PATCH 2/2] add required mocks for the UTs --- src/test/groovy/DockerLoginStepTests.groovy | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/groovy/DockerLoginStepTests.groovy b/src/test/groovy/DockerLoginStepTests.groovy index 7087efd67..3d131ca57 100644 --- a/src/test/groovy/DockerLoginStepTests.groovy +++ b/src/test/groovy/DockerLoginStepTests.groovy @@ -71,6 +71,11 @@ class DockerLoginStepTests extends BasePipelineTest { helper.registerAllowedMethod("getVaultSecret", [Map.class], { return [data: [user: "my-user", password: "my-password"]] }) + helper.registerAllowedMethod("retry", [Integer.class, Closure.class], { i, c -> + c.call() + }) + helper.registerAllowedMethod("randomNumber", [Map.class], { m -> return m.min }) + helper.registerAllowedMethod("sleep", [Integer.class], { 'OK' }) } @Test