#!/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