#!/usr/bin/env bash # Copyright (c) 2021, 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: $*" echo "$(basename ${BASH_SOURCE[0]}) PACKAGE_REPO_ROOT [SHA]" echo "\tPACKAGE_REPO_ROOT: The path to the libnvidia-container repository" echo "\tSHA: The SHA / reference to release. [Default: HEAD]" exit 1 } set -e SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../scripts && pwd )" PROJECT_ROOT="$( cd ${SCRIPTS_DIR}/.. && pwd )" if [[ $# -lt 1 || $# -gt 2 ]]; then assert_usage $* fi source "${SCRIPTS_DIR}"/utils.sh PACKAGE_REPO_ROOT=$1 if [[ ! -d ${PACKAGE_REPO_ROOT} ]]; then echo "The specified PACKAGE_REPO_ROOT '${PACKAGE_REPO_ROOT}' must exist" exit 1 fi : ${REFERENCE:="HEAD"} if [[ $# -ge 2 ]]; then REFERENCE=$2 fi SHA=$(git rev-parse --short=8 ${REFERENCE}) IMAGE_NAME="ghcr.io/nvidia/container-toolkit" IMAGE_TAG=${SHA}-packaging : ${VERSION:="$(get_version_from_image ${IMAGE_NAME}:${IMAGE_TAG} ${SHA})"} REPO="experimental" if [[ ${VERSION/rc./} == ${VERSION} ]]; then REPO="stable" fi PACKAGE_CACHE=release-${VERSION}-${REPO} echo "Fetching packages with SHA '${SHA}' as tag '${VERSION}' to ${PACKAGE_CACHE}" ${SCRIPTS_DIR}/../hack/pull-packages.sh \ ${IMAGE_NAME}:${IMAGE_TAG} \ ${PACKAGE_CACHE} : ${ALL_RPMS:="$(find ${PACKAGE_CACHE} -name "*.rpm" -exec basename {} \; | sort | uniq)"} : ${ALL_DEBS:="$(find ${PACKAGE_CACHE} -name "*.deb" -exec basename {} \; | sort | uniq)"} PACKAGE_REPO_ROOT=$(cd "${PACKAGE_REPO_ROOT}" && pwd) echo "Updating ${REPO} repo at ${PACKAGE_REPO_ROOT}" docker build \ -t nvidia/toolkit-deb-pkg-signer \ -f ${SCRIPTS_DIR}/Dockerfile.sign.deb \ ${SCRIPTS_DIR} docker build \ -t nvidia/toolkit-rpm-pkg-signer \ -f ${SCRIPTS_DIR}/Dockerfile.sign.rpm \ ${SCRIPTS_DIR} function sync() { local target=$1 local src_root=$2 local dst_root=$3 local by_package_type=$4 local src_dist=${target%-*} local dst_dist=${src_dist/amazonlinux/amzn} local pkg_type=unknown local arch=${target##*-} local dst_arch=${arch} case ${src_dist} in amazonlinux*) pkg_type=rpm ;; centos*) pkg_type=rpm ;; debian*) pkg_type=deb ;; fedora*) pkg_type=rpm ;; opensuse-leap*) pkg_type=rpm ;; ubuntu*) pkg_type=deb dst_arch=${arch//ppc64le/ppc64el} ;; *) echo "ERROR: unexpected distribution ${src_dist}" exit 1 ;; esac if [[ x"${by_package_type}" == x"true" ]]; then dst_dist=${pkg_type} fi local src=${src_root}/${src_dist}/${arch} local dst=${dst_root}/${dst_dist}/${dst_arch} if [[ ! -d ${src} || -z $(ls ${src}/*.${pkg_type}) ]]; then echo "Skipping ${src}" return fi mkdir -p ${dst} for f in $(ls ${src}/libnvidia-container*.${pkg_type} ${src}/nvidia-container-toolkit*.${pkg_type}); do # We never release nvidia-container-toolkit-operator-extensions packages if [[ "${f/"nvidia-container-toolkit-operator-extensions"/}" != "${f}" ]]; then echo "Skipping ${f}" continue fi df=${dst}/$(basename ${f}) df_stable=${df//"/experimental/"/"/stable/"} if [[ -f "${df}" ]]; then echo "${df} already exists; skipping" elif [[ ${REPO} == "experimental" && -f ${df_stable} ]]; then echo "${df_stable} already exists; skipping" else cp ${f} ${df} fi done } targets=${all[@]} _current_branch=$(git -C ${PACKAGE_REPO_ROOT} rev-parse --abbrev-ref HEAD) if [[ x"${_current_branch}" != x"gh-pages" ]]; then echo "It is expected that the gh-pages branch be checked out" exit 1 fi : ${UPSTREAM_REMOTE:="origin"} : ${UPSTREAM_REFERENCE:="${UPSTREAM_REMOTE}/gh-pages"} git -C ${PACKAGE_REPO_ROOT} reset --hard ${UPSTREAM_REFERENCE} git -C ${PACKAGE_REPO_ROOT} clean -fdx ${REPO} for target in ${targets[@]}; do echo "checking target=${target}" by_package_type= case ${target} in ubuntu18.04-* | centos7-*) by_package_type="true" ;; centos8-ppc64le) by_package_type="false" ;; *) echo "Skipping target ${target}" continue ;; esac sync ${target} ${PACKAGE_CACHE}/packages ${PACKAGE_REPO_ROOT}/${REPO} ${by_package_type} done git -C ${PACKAGE_REPO_ROOT} add ${REPO} # Experimental / release candidate release git -C ${PACKAGE_REPO_ROOT} commit -s -F- <