jenkins-pipelines/scripts/build-docker-images.sh

161 lines
4.9 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
source $(dirname "$0")/lib/retries.sh
require_job_env BUILD_HOME
require_job_env DRY_RUN
require_job_env USE_DOCKER_CACHE
require_job_env BUILD_DOCKER_BASE_IMAGE
require_job_env BUILD_STREAM stable
require_job_env PUSH_DOCKER_IMAGES
declare_job_env DOCKER_IMAGE_LIST
declare_job_env DOCKER_IMAGE_BASE
load_build_env
require_job_env DOCKER_BASE_OS
require_job_env DOCKER_OS_LIST
# Backward compatibility for folks with old configs.
# Remove, or convert to bail/die after sufficient time has passed.
if [[ -z "$BUILD_BRANCH_FOR_IMAGE_TAG" ]] ; then
BUILD_BRANCH_FOR_IMAGE_TAG="${BUILD_BRANCH/#r\//rc-}"
fi
HOST_WORKSPACE="$BUILD_HOME/workspace"
wheels_file="std/build-wheels-$DOCKER_BASE_OS-$BUILD_STREAM/stx-$DOCKER_BASE_OS-$BUILD_STREAM-wheels.tar"
#require_file "$HOST_WORKSPACE/$wheels_file"
declare -a cmd=(
"./build-stx-images.sh"
"--os-label=$DOCKER_BASE_OS"
"--attempts=$DOCKER_BUILD_RETRY_COUNT"
"--retry-delay=$DOCKER_BUILD_RETRY_DELAY"
"--stream=$BUILD_STREAM"
"--version=$TIMESTAMP"
"--prefix=${BUILD_BRANCH_FOR_IMAGE_TAG}"
"--user=$DOCKER_REGISTRY_ORG"
"--latest"
)
# Base image provided by build parameter
if [[ -n "$DOCKER_IMAGE_BASE" ]] ; then
cmd+=("--base=$DOCKER_IMAGE_BASE")
elif $BUILD_DOCKER_BASE_IMAGE ; then
base_image_tag="${BUILD_BRANCH_FOR_IMAGE_TAG}-${BUILD_STREAM}-$TIMESTAMP"
docker_base_image="$DOCKER_REGISTRY_ORG/stx-$DOCKER_BASE_OS:$base_image_tag"
if [[ -n "$DOCKER_REGISTRY" ]] ; then
docker_base_image="$DOCKER_REGISTRY/$docker_base_image"
fi
cmd+=("--base=$docker_base_image")
cmd+=("--no-pull-base")
fi
if [[ -n "$DOCKER_REGISTRY" ]] ; then
cmd+=("--registry=$DOCKER_REGISTRY")
fi
if [[ -f "$WORKSPACE_ROOT/$wheels_file" ]] ; then
cmd+=("--wheels=\$MY_WORKSPACE/$wheels_file")
fi
if [[ "$USE_DOCKER_CACHE" == true ]] ; then
cmd+=("--cache")
fi
# add --only if $DOCKER_IMAGE_LIST contains anything
if [[ -n "$DOCKER_IMAGE_LIST" ]] ; then
comma=
only=
for img in $(echo "$DOCKER_IMAGE_LIST" | sed 's/[,;]+/ /g') ; do
[[ -n "$img" ]] || continue
only+="${only}${comma}${img}"
comma=","
done
if [[ -n "$only" ]] ; then
cmd+=("--only=$only")
fi
fi
# build-stx-base.sh can only push to one repo. We will push to any
# additional repos manually.
if $PUSH_DOCKER_IMAGES ; then
cmd+=("--push")
fi
# Usage: retag_and_push $IMAGE_LIST_FILE
retag_and_push() {
if [[ -n "$EXTRA_REGISTRY_PREFIX_LIST" ]] ; then
local list_file="$1"
local src_img
for src_img in $(grep -E -v '^\s*(#.*)?$' $list_file) ; do
local reg_prefix base_img
base_img="${src_img#$DOCKER_REGISTRY/$DOCKER_REGISTRY_ORG}"
if [[ "$base_img" == "$src_img" ]] ; then
die "$list_file: unexpected image \"$src_img\""
fi
for reg_prefix in $EXTRA_REGISTRY_PREFIX_LIST ; do
local dst_img="$(echo "${reg_prefix}/$base_img" | sed 's!//*!/!g')"
stx_docker_cmd $DRY_RUN_ARG "docker tag $src_img $dst_img"
with_retries -d "$DOCKER_BUILD_RETRY_DELAY" "$DOCKER_BUILD_RETRY_COUNT" stx_docker_cmd $DRY_RUN_ARG "docker push $dst_img"
done
done
fi
}
# build them
lists_dir="$HOST_WORKSPACE/std/build-images"
versioned_list_file="$lists_dir/images-$DOCKER_BASE_OS-$BUILD_STREAM-versioned.lst"
latest_list_file="$lists_dir/images-$DOCKER_BASE_OS-$BUILD_STREAM-latest.lst"
rm -rf --one-file-system "$lists_dir"
mkdir -p "$lists_dir"
failed=0
touch "$versioned_list_file" "$latest_list_file"
for os in $(echo $DOCKER_OS_LIST | sed 's/,/ /g') ; do
# save list files because build script truncates them under some circumstances
for list_file in "${versioned_list_file}" "${latest_list_file}" ; do
mv "${list_file}" "${list_file}.save"
done
notice "building $BUILD_STREAM $os images"
$DRY_RUN || rm -f "$versioned_list_file" "$latest_list_file"
if ! stx_docker_cmd $DRY_RUN_ARG "cd \$MY_REPO/build-tools/build-docker-images && ${cmd[*]} --os=$os" ; then
failed=1
fi
if $PUSH_DOCKER_IMAGES && [[ -f "$versioned_list_file" ]] ; then
retag_and_push "$versioned_list_file"
fi
if $PUSH_DOCKER_IMAGES && [[ -f "$latest_list_file" ]] ; then
retag_and_push "$latest_list_file"
fi
# append + restore list files
for list_file in "${versioned_list_file}" "${latest_list_file}" ; do
if [[ -f "$list_file" ]] ; then
cat "$list_file" >>"${list_file}.save"
fi
mv "${list_file}.save" "${list_file}"
done
done
if [[ $failed -eq 1 ]] ; then
error "one or more images failed to build, see output above"
exit 1
fi
notice "all images built successfully"
find "$lists_dir" -mindepth 1 -maxdepth 1 -name "images-*.lst" -type f -not -empty