Retry failed docker login

Sometimes docker login fails, retry the operation to compensate. In
particular, this seems to happen when a previous Jenkins build was not
stopped properly.

TESTS
=========================
Run docker-login & host-docker-login Jenkins jobs with valid and invalid
passwords.

Story: 2010055
Task: 51129

Change-Id: Id1998da7ba1de7539349b0a8b3937524e614aa4d
Signed-off-by: Davlet Panech <davlet.panech@windriver.com>
This commit is contained in:
Davlet Panech 2024-10-04 12:20:18 -04:00
parent bd803643a1
commit cd5c757d23
3 changed files with 65 additions and 7 deletions

@ -87,5 +87,5 @@ rm -f $old_docker_config_file $new_docker_config_file
notice "logging in to remote repos"
for reg in "${login_repos[@]}" ; do
docker_login "$reg"
QUIET=true docker_login "$reg"
done

@ -11,11 +11,33 @@ SCRIPTS_DIR="$(dirname "$0")"
source "$SCRIPTS_DIR/lib/job_utils.sh"
load_build_config
declare_job_env DOCKER_REGISTRY_LOGIN_LIST
declare_job_env DOCKER_LOGIN_ATTEMPTS 3
for spec in $DOCKER_REGISTRY_LOGIN_LIST ; do
if [[ "$(parse_docker_registry "$spec" | awk '{print $1}')" == "docker.io" ]] ; then
info "logging in to Docker Hub DOCKER_CONFIG=$DOCKER_CONFIG"
docker login </dev/null
if ! docker login </dev/null ; then
docker logout || true
login_ok=0
attempt=2
while true ; do
info "logging in to Docker Hub DOCKER_CONFIG=$DOCKER_CONFIG [attempt $attempt]"
if docker login </dev/null ; then
login_ok=1
break
fi
docker logout || true
let attempt++
if [[ $attempt -gt $DOCKER_LOGIN_ATTEMPTS ]] ; then
break
fi
sleep 10
done
if [[ $login_ok -ne 1 ]] ; then
die "failed to login to Docker Hub"
exit 1
fi
fi # if ! docker login
break
fi
done

@ -311,12 +311,48 @@ stx_docker_cmd() {
# Usage: docker_login REGISTRY
# Login to docker in builder pod
docker_login() {
local reg="$1"
local login_arg
if [[ "$reg" != "docker.io" ]] ; then
login_arg="$reg"
local docker_reg_label="$1"
local docker_reg
local docker_login_attempts="${DOCKER_LOGIN_ATTEMPTS:-3}"
if [[ "$docker_reg_label" != "docker.io" ]] ; then
docker_reg="$docker_reg_label"
fi
stx_docker_cmd "docker login $login_arg </dev/null"
local script
{
read -r -d '' script <<'_END'
DOCKER_REG_LABEL='@@DOCKER_REG_LABEL@@'
DOCKER_REG='@@DOCKER_REG@@'
DOCKER_LOGIN_ATTEMPTS='@@DOCKER_LOGIN_ATTEMPTS@@'
echo "logging in to docker registry $DOCKER_REG_LABEL" >&2
if ! docker login $DOCKER_REG </dev/null ; then
docker logout || true
login_ok=0
attempt=2
while true ; do
echo "logging in to docker registry $DOCKER_REG_LABEL [attempt $attempt]" >&2
if docker login $DOCKER_REG </dev/null ; then
login_ok=1
break
fi
docker logout $DOCKER_REG || true
let attempt++
if [[ $attempt -gt $DOCKER_LOGIN_ATTEMPTS ]] ; then
break
fi
sleep 10
done
if [[ $login_ok -ne 1 ]] ; then
echo "ERROR: failed to login to docker registry $DOCKER_REG_LABEL" >&2
exit 1
fi
fi
_END
} || true # read -d '' always returns non-zero (bash bug?)
script="$(echo "$script" | sed \
-e "s/@@DOCKER_REG_LABEL@@/$docker_reg_label/g" \
-e "s/@@DOCKER_REG@@/$docker_reg/g" \
-e "s/@@DOCKER_LOGIN_ATTEMPTS@@/$docker_login_attempts/g")"
stx_docker_cmd "$script"
}
#