jenkins-pipelines/scripts/docker-login.sh

92 lines
2.7 KiB
Bash
Executable File

#!/bin/bash
#
# Copyright (c) 2022 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
set -e
source $(dirname "$0")/lib/job_utils.sh
require_job_env BUILD_HOME
require_job_env PUSH_DOCKER_IMAGES
declare_job_env DOCKER_CONFIG_FILE
load_build_env
HOST_WORKSPACE="$BUILD_HOME/workspace"
# find registries that require a login
declare dummy
declare login_spec login_reg
declare -a login_repos
declare -A login_repos_hash
# Login to registries that require authentication
for login_spec in $DOCKER_REGISTRY_LOGIN_LIST ; do
read reg dummy <<<$(parse_docker_registry "$login_spec")
if [[ -z "${login_repos_hash[$reg]}" ]] ; then
login_repos_hash["$reg"]=1
login_repos+=("$reg")
fi
done
unset dummy login_spec login_reg spec reg
unset login_repos_hash
[[ "${#login_repos[@]}" -gt 0 ]] || bail "no push registries requiring authentication defined, docker login not required"
#
# Merge usernames & passwords from $DOCKER_CONFIG_FILE into
# $HOME/.docker/config.json inside the builder pod
#
# {
# "auths": {
# "repo.org:port": {
# "auth": "..." # base64-encoded USERNAME:PASSWORD
# },
# ...
# }
# }
#
if [[ -z "$DOCKER_CONFIG_FILE" ]] ; then
DOCKER_CONFIG_FILE="$DOCKER_CONFIG/config.json"
elif [[ ! $DOCKER_CONFIG_FILE =~ ^/ ]] ; then
DOCKER_CONFIG_FILE="$BUILD_HOME/$DOCKER_CONFIG_FILE"
fi
require_file "$DOCKER_CONFIG_FILE"
notice "updating \$HOME/.docker/config.json in builder pod"
mkdir -p "$HOST_WORKSPACE/tmp"
old_docker_config_file="$HOST_WORKSPACE/tmp/docker.config.json.old"
new_docker_config_file="$HOST_WORKSPACE/tmp/docker.config.json.new"
rm -f "$old_docker_config_file"
# download the existing config file from the pod
QUIET=true stx_docker_cmd "[[ -f \$HOME/.docker/config.json ]] && 'cp' \$HOME/.docker/config.json \$MY_WORKSPACE/tmp/docker.config.json.old || true"
# merge the "auths" from DOCKER_CONFIG_FILE into it
$PYTHON3 -c '
import sys, json
ref_auths = json.load (open (sys.argv[1])).get ("auths", {})
try:
config = json.load (open (sys.argv[2]))
config.setdefault ("auths", {}).update (ref_auths)
except FileNotFoundError:
config = {
"auths": ref_auths
}
json.dump (config, open (sys.argv[3], "w"), indent = "\t")
' "$DOCKER_CONFIG_FILE" "$old_docker_config_file" "$new_docker_config_file"
# upload it back to the pod
if [[ ! -f "$old_docker_config_file" ]] || ! diff -q -u "$old_docker_config_file" "$new_docker_config_file" ; then
QUIET=true stx_docker_cmd "mkdir -p \$HOME/.docker && 'cp' \$MY_WORKSPACE/tmp/docker.config.json.new \$HOME/.docker/config.json"
fi
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"
done