#!/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" >&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 exit 1 } set -e SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../scripts && pwd )" PROJECT_ROOT="$( cd "${SCRIPTS_DIR}/.." && pwd )" if [[ $# -ne 1 ]]; then assert_usage "$@" fi PACKAGE_IMAGE=$1 # TODO: accept ARTIFACTS_DIR as a command-line argument : "${ARTIFACTS_DIR="${PROJECT_ROOT}/artifacts"}" # For release-candidates we skip certain packages. # This function returns 0 if a package should be skipped and 1 otherwise. function skip-for-release-candidate() { # We always skip nvidia-container-toolkit-operator-extensions packages if [[ "${package_name/"nvidia-container-toolkit-operator-extensions"/}" != "${package_name}" ]]; then return 0 fi local is_non_patch_full_release=1 # We allow all other packages for non-rc and non-patch release versions. if [[ "${VERSION/rc./}" != "${VERSION}" ]]; then is_non_patch_full_release=0 fi if [[ "${VERSION%.0}" == "${VERSION}" ]]; then is_non_patch_full_release=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 distribution 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 echo "Extracting packages for ${dist} from ${PACKAGE_IMAGE}" # Extract every file for the specified dist-arch combiniation in MANIFEST.txt grep "/${dist}/" "${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}/${f##/artifacts/}" mkdir -p "$(dirname "$target")" copy-file "${PACKAGE_IMAGE}" "${f}" "${target}" done } mkdir -p "${ARTIFACTS_DIR}" copy-file "${PACKAGE_IMAGE}" "/artifacts/manifest.txt" "${ARTIFACTS_DIR}/manifest.txt" extract-all ubuntu18.04 extract-all centos8 extract-all centos7