mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2024-11-24 21:14:00 +00:00
113 lines
4.0 KiB
Bash
113 lines
4.0 KiB
Bash
|
#!/usr/bin/env bash
|
||
|
|
||
|
# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
function assert_usage() {
|
||
|
echo "Incorrect arguments: $*" >&2
|
||
|
echo "$(basename "${BASH_SOURCE[0]}") PACKAGE_IMAGE_NAME:PACKAGE_IMAGE_TAG DIST-ARCH" >&2
|
||
|
echo -e "\\tPACKAGE_IMAGE: container image holding packages [e.g. registry.gitlab.com/nvidia/container-toolkit/container-toolkit/staging/container-toolkit]" >&2
|
||
|
echo -e "\\tPACKAGE_TAG: tag for container image holding packages. [e.g. 1a2b3c4-packaging]" >&2
|
||
|
echo -e "\\tDIST: The distribution." >&2
|
||
|
echo -e "\\tARCH: The architecture." >&2
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../scripts && pwd )"
|
||
|
PROJECT_ROOT="$( cd "${SCRIPTS_DIR}/.." && pwd )"
|
||
|
|
||
|
if [[ $# -ne 2 ]]; then
|
||
|
assert_usage "$@"
|
||
|
fi
|
||
|
|
||
|
PACKAGE_IMAGE=$1
|
||
|
DISTARCH=$2
|
||
|
DIST=${DISTARCH%-*}
|
||
|
ARCH=${DISTARCH#*-}
|
||
|
|
||
|
if [[ -z "${DIST}" || -z "${ARCH}" ]]; then
|
||
|
echo "ERROR: Distro and Architecture must be specified." >&2
|
||
|
assert_usage "$@"
|
||
|
fi
|
||
|
|
||
|
# TODO: accept ARTIFACTS_DIR as a command-line argument
|
||
|
: "${ARTIFACTS_DIR="${PROJECT_ROOT}/artifacts"}"
|
||
|
|
||
|
# For release-candidates we skip certain packages.
|
||
|
# For example, we don't release release candidates of nvidia-container-runtime and nvidia-docker2
|
||
|
# since these only bump the nvidia-container-toolkit dependency.
|
||
|
function skip-for-release-candidate() {
|
||
|
if [[ "${VERSION/rc./}" == "${VERSION}" ]]; then
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
local package_name=$1
|
||
|
if [[ "${package_name/"nvidia-docker2"/}" != "${package_name}" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
if [[ "${package_name/"nvidia-container-runtime"/}" != "${package_name}" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
# extract-file copies a file from a specified image.
|
||
|
# If regctl is available this is used, otherwise a docker container is run and the file is copied from
|
||
|
# there.
|
||
|
function copy-file() {
|
||
|
local image=$1
|
||
|
local path_in_image=$2
|
||
|
local path_on_host=$3
|
||
|
if command -v regctl; then
|
||
|
regctl image get-file "${image}" "${path_in_image}" "${path_on_host}"
|
||
|
else
|
||
|
# Note this will only work for destinations where the `path_on_host` is in `pwd`
|
||
|
docker run --rm \
|
||
|
-v "$(pwd):$(pwd)" \
|
||
|
-w "$(pwd)" \
|
||
|
-u "$(id -u):$(id -g)" \
|
||
|
--entrypoint="bash" \
|
||
|
"${image}" \
|
||
|
-c "cp ${path_in_image} ${path_on_host}"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
eval $(${SCRIPTS_DIR}/get-component-versions.sh)
|
||
|
|
||
|
# extract-all extracts all package for the specified dist-arch combination from the package image.
|
||
|
# The manifest.txt file in the image is used to detemine the applicable files for the combination.
|
||
|
# Files are extracted to ${ARTIFACTS_DIR}/artifacts/packages/${dist}/${arch}
|
||
|
function extract-all() {
|
||
|
local dist=$1
|
||
|
local arch=$2
|
||
|
|
||
|
mkdir -p "${ARTIFACTS_DIR}"
|
||
|
copy-file "${PACKAGE_IMAGE}" "/artifacts/manifest.txt" "${ARTIFACTS_DIR}/manifest.txt"
|
||
|
|
||
|
# Extract every file for the specified dist-arch combiniation in MANIFEST.txt
|
||
|
grep "/${dist}/${arch}/" "${ARTIFACTS_DIR}/manifest.txt" | while read -r f ; do
|
||
|
package_name="$(basename "$f")"
|
||
|
# For release-candidates, we skip certain packages
|
||
|
if skip-for-release-candidate "${package_name}"; then
|
||
|
echo "Skipping $f for release-candidate ${VERSION}"
|
||
|
continue
|
||
|
fi
|
||
|
target="${ARTIFACTS_DIR}/packages/${dist}/${arch}/${package_name}"
|
||
|
mkdir -p "$(dirname "$target")"
|
||
|
copy-file "${PACKAGE_IMAGE}" "${f}" "${target}"
|
||
|
done
|
||
|
}
|
||
|
|
||
|
extract-all "${DIST}" "${ARCH}"
|