mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-07 04:56:58 +02:00
The container image was only created if it didn't exist locally. This would result in fixes not being in a downstream job that is scheduled to a different worker node on Jenkins that has a stale copy. For the build automation we will now always download the latest container tar ball based on comparing the image ID from a new artifact, and for registry images we pull the container image to make sure that we don't use a stale copy when we rebuild.
157 lines
5.8 KiB
Bash
Executable File
157 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright (c) 2021 The Flatcar Maintainers.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
set -euo pipefail
|
|
|
|
cd $(dirname "$0")
|
|
source sdk_lib/sdk_container_common.sh
|
|
|
|
arch="all"
|
|
name=""
|
|
|
|
os_version="$(get_git_version)"
|
|
sdk_version="$(get_sdk_version_from_versionfile)"
|
|
custom_image=""
|
|
tty=""
|
|
remove=""
|
|
cleanup=""
|
|
|
|
usage() {
|
|
echo " Usage:"
|
|
echo " $0 [-t] [-v <version>] [-V sdk version] [-a arch] [-n <name> ] [-x <script>] [-C custom-container] [--rm] [container-command]"
|
|
echo " Start an SDK container of a given SDK release version."
|
|
echo " This will create the container if it does not exist, otherwise start the existing container."
|
|
echo " If the container is already running then it will exec into the container."
|
|
echo
|
|
echo " container-command - command to be run in the container instead of"
|
|
echo " an interactive shell."
|
|
echo " -t Attach docker to a TTY (docker -t)"
|
|
echo " -v <version> - Sourcetree (OS image) version to use."
|
|
echo " Defaults to '$os_version' (current git commit)."
|
|
echo " FLATCAR_VERSION[_ID] in '$sdk_container_common_versionfile'"
|
|
echo " will be updated accordingly."
|
|
echo " -V <SDK ver> - SDK version to use. Defaults to '${sdk_version}'"
|
|
echo " (FLATCAR_SDK_VERSION from '$sdk_container_common_versionfile')."
|
|
echo " -a <amd64|arm64|all> - Target architecture (board support) of the SDK."
|
|
echo " 'all' (the default) contains support for both amd64 and arm64."
|
|
echo " -n <name> - Custom name to use for the container."
|
|
echo " --rm Remove container afterwards"
|
|
echo " -x <script> - For each resource generated during build (container etc.)"
|
|
echo " add a cleanup line to <script> which, when run, will free"
|
|
echo " the resource. Useful for CI."
|
|
echo " -C - Use an entirely custom container image instead of the SDK's"
|
|
echo " $sdk_container_common_registry/flatcar-sdk-[ARCH]:[SDK VERSION]"
|
|
echo " Useful for CI."
|
|
echo " -h Print this help."
|
|
echo
|
|
}
|
|
# --
|
|
|
|
while [ 0 -lt $# ] ; do
|
|
case "$1" in
|
|
-h) usage; exit 0;;
|
|
--help) usage; exit 0;;
|
|
-t) tty="-t"; shift;;
|
|
-v) os_version="$2"; shift; shift;;
|
|
-V) sdk_version="$2"; shift; shift;;
|
|
-a) arch="$2"; shift; shift;;
|
|
-n) name="$2"; shift; shift;;
|
|
--rm) remove=true; shift;;
|
|
-x) cleanup="$2"; shift; shift;;
|
|
-C) custom_image="$2"; shift; shift;;
|
|
*) break;;
|
|
esac
|
|
done
|
|
|
|
if [ -n "$custom_image" ] ; then
|
|
container_image_name="${custom_image}"
|
|
else
|
|
docker_sdk_vernum="$(vernum_to_docker_image_version "${sdk_version}")"
|
|
container_image_name="$sdk_container_common_registry/flatcar-sdk-${arch}:${docker_sdk_vernum}"
|
|
fi
|
|
|
|
create_versionfile "$sdk_version" "$os_version"
|
|
|
|
if [ -z "$name" ] ; then
|
|
docker_sdk_vernum="$(vernum_to_docker_image_version "${sdk_version}")"
|
|
docker_os_vernum="$(vernum_to_docker_image_version "${os_version}")"
|
|
name="flatcar-sdk-${arch}-${docker_sdk_vernum}_os-${docker_os_vernum}"
|
|
fi
|
|
|
|
filter="^/"
|
|
if "${is_podman}"; then
|
|
filter=""
|
|
fi
|
|
stat="$($docker ps --all --no-trunc --filter name="${filter}$name\$" --format '{{.Status}}'\
|
|
| cut -f1 -d' ')"
|
|
|
|
# pass SDK related environment variables and gcloud auth
|
|
# into container
|
|
setup_sdk_env
|
|
setup_gsutil
|
|
|
|
mkdir -p "__build__/images"
|
|
mkdir -p "sdk_container/.cache/sdks"
|
|
|
|
hostname="${name:0:63}"
|
|
hostname="${hostname//./_}"
|
|
|
|
if [ -n "$cleanup" ] ; then
|
|
echo "$docker container rm -f '${name}'" >> "$cleanup"
|
|
fi
|
|
|
|
if [ -z "$stat" ] ; then
|
|
yell "Creating a new container '$name'"
|
|
|
|
gpg_volumes=$(gnupg_ssh_gcloud_mount_opts)
|
|
|
|
if [ -z "$custom_image" ]; then
|
|
(
|
|
source ci-automation/ci_automation_common.sh
|
|
docker_image_from_registry_or_buildcache "flatcar-sdk-${arch}" "${docker_sdk_vernum}"
|
|
)
|
|
else
|
|
# We could split the container_image_name in parts to call docker_image_from_registry_or_buildcache
|
|
# bur for now just try to ensure that we use the latest image if using a container registry,
|
|
# for the tar-ball-imported images we rely on the ci-automation scripts to call
|
|
# docker_image_from_registry_or_buildcache explicitly.
|
|
$docker pull "${container_image_name}" || true
|
|
fi
|
|
|
|
$docker create $tty -i \
|
|
-v /dev:/dev \
|
|
-v "$(pwd)/sdk_container:/mnt/host/source/" \
|
|
-v "$(pwd)/sdk_container/git-override/.git-coreos-overlay:/mnt/host/source/src/third_party/coreos-overlay/.git" \
|
|
-v "$(pwd)/sdk_container/git-override/.git-portage-stable:/mnt/host/source/src/third_party/portage-stable/.git" \
|
|
-v "$(pwd)/__build__/images:/mnt/host/source/src/build" \
|
|
-v "$(pwd):/mnt/host/source/src/scripts" \
|
|
$gpg_volumes \
|
|
--privileged \
|
|
--network host \
|
|
-e SDK_USER_ID="$(id -u)" \
|
|
-e SDK_GROUP_ID="$(id -g)" \
|
|
--name="$name" \
|
|
--hostname="$hostname" \
|
|
--entrypoint /bin/bash \
|
|
"${container_image_name}" -l
|
|
fi
|
|
|
|
if [ "$stat" != "Up" ] ; then
|
|
yell "Starting stopped container '$name'"
|
|
if [ "${remove}" = "true" ]; then
|
|
remove_command="$docker rm -f $name"
|
|
else
|
|
remove_command=":"
|
|
fi
|
|
trap "$docker stop -t 0 $name ; ${remove_command}" EXIT
|
|
$docker start "$name"
|
|
fi
|
|
|
|
# Workaround: The SDK expects to be able to write to /etc/hosts
|
|
$docker exec "$name" sh -c 'cp /etc/hosts /etc/hosts2; umount /etc/hosts ; mv /etc/hosts2 /etc/hosts'
|
|
|
|
$docker exec $tty -i "$name" /mnt/host/source/src/scripts/sdk_lib/sdk_entry.sh "$@"
|