mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2024-11-23 20:53:30 +00:00
[no-relnote] Add basic release workflow
Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
parent
e4cdc48854
commit
6358c13dab
26
.github/workflows/release.yaml
vendored
26
.github/workflows/release.yaml
vendored
@ -26,27 +26,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
name: Check out code
|
name: Check out code
|
||||||
|
|
||||||
|
- name: Prepare Artifacts
|
||||||
|
run: |
|
||||||
|
./hack/prepare-artifacts.sh ${{ github.ref_name }}
|
||||||
|
|
||||||
- name: Create Draft Release
|
- name: Create Draft Release
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
OWNER: ${{ github.repository_owner }}
|
|
||||||
REPO: ${{ github.event.repository.name }}
|
|
||||||
run: |
|
run: |
|
||||||
GH_EXTRA_ARGS=""
|
./hack/create-release.sh ${{ github.ref_name }}
|
||||||
if [[ ${{ github.ref_name }} == *-rc.* ]]; then
|
|
||||||
GH_EXTRA_ARGS="--prerelease"
|
|
||||||
fi
|
|
||||||
gh release create ${{ github.ref_name }} \
|
|
||||||
--draft \
|
|
||||||
-t "${{ github.ref_name }}" \
|
|
||||||
-R $OWNER/$REPO \
|
|
||||||
--verify-tag \
|
|
||||||
$GH_EXTRA_ARGS
|
|
||||||
|
|
||||||
- name: Upload Release Artifacts
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
OWNER: ${{ github.repository_owner }}
|
|
||||||
REPO: ${{ github.event.repository.name }}
|
|
||||||
run: |
|
|
||||||
gh release upload ${{ github.ref_name }} CHANGELOG.md -R $OWNER/$REPO
|
|
||||||
|
47
hack/create-release.sh
Executable file
47
hack/create-release.sh
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
# Copyright 2024 NVIDIA CORPORATION
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
VERSION=$(awk -F= '/^VERSION/ { print $2 }' versions.mk | tr -d '[:space:]')
|
||||||
|
else
|
||||||
|
VERSION=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
PRERELEASE_FLAG=""
|
||||||
|
REPO="stable"
|
||||||
|
if [[ ${VERSION} == v*-rc.* ]]; then
|
||||||
|
PRERELEASE_FLAG="--prerelease"
|
||||||
|
REPO="experimental"
|
||||||
|
fi
|
||||||
|
|
||||||
|
REPOSITORY=NVIDIA/nvidia-container-toolkit
|
||||||
|
|
||||||
|
echo "Creating draft release"
|
||||||
|
./hack/generate-changelog.sh --version ${VERSION} | \
|
||||||
|
grep -v "### Version v" | \
|
||||||
|
echo gh release create ${VERSION} --notes-file "-" \
|
||||||
|
--draft \
|
||||||
|
--title "${VERSION}" \
|
||||||
|
-R "${REPOSITORY}" \
|
||||||
|
--verify-tag \
|
||||||
|
--prerelease
|
||||||
|
|
||||||
|
echo "Uploading release artifacts for ${VERSION}"
|
||||||
|
|
||||||
|
PACKAGE_ROOT=release-${VERSION}-${REPO}
|
||||||
|
|
||||||
|
gh release upload ${VERSION} \
|
||||||
|
${PACKAGE_ROOT}/nvidia-container-toolkit-${VERSION}.*.tar.gz \
|
||||||
|
-R ${REPOSITORY}
|
@ -24,14 +24,12 @@ Usage: $this --reference <tag> [--remote <remote_name>]
|
|||||||
|
|
||||||
Options:
|
Options:
|
||||||
--since specify the tag to start the changelog from (default: latest tag)
|
--since specify the tag to start the changelog from (default: latest tag)
|
||||||
--remote specify the remote to fetch tags from (default: upstream)
|
|
||||||
--version specify the version to be released
|
--version specify the version to be released
|
||||||
--help/-h show this help and exit
|
--help/-h show this help and exit
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
REMOTE="upstream"
|
|
||||||
VERSION=""
|
VERSION=""
|
||||||
REFERENCE=
|
REFERENCE=
|
||||||
|
|
||||||
@ -44,11 +42,6 @@ while [[ $# -gt 0 ]]; do
|
|||||||
shift # past argument
|
shift # past argument
|
||||||
shift # past value
|
shift # past value
|
||||||
;;
|
;;
|
||||||
--remote)
|
|
||||||
REMOTE="$2"
|
|
||||||
shift # past argument
|
|
||||||
shift # past value
|
|
||||||
;;
|
|
||||||
--version)
|
--version)
|
||||||
VERSION="$2"
|
VERSION="$2"
|
||||||
shift # past argument
|
shift # past argument
|
||||||
@ -64,13 +57,22 @@ while [[ $# -gt 0 ]]; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
# Fetch the latest tags from the remote
|
# Fetch the latest tags from the remote
|
||||||
git fetch $REMOTE --tags
|
remote=$( git remote -v | grep -E "NVIDIA/nvidia-container-toolkit(\.git)?\s" | grep -oE "^[a-z]+" | sort -u )
|
||||||
|
>&2 echo "Detected remote as '${remote}'"
|
||||||
|
git fetch ${remote} --tags
|
||||||
|
|
||||||
# if REFERENCE is not set, get the latest tag
|
# if REFERENCE is not set, get the latest tag
|
||||||
if [ -z "$REFERENCE" ]; then
|
if [ -z "$REFERENCE" ]; then
|
||||||
REFERENCE=$(git describe --tags $(git rev-list --tags --max-count=1))
|
most_recent_tag=$(git tag --sort=-creatordate | head -1)
|
||||||
|
if [ "${VERSION}" == "${most_recent_tag}" ]; then
|
||||||
|
REFERENCE=$(git tag --sort=-creatordate | head -2 | tail -1)
|
||||||
|
else
|
||||||
|
REFERENCE=${most_recent_tag}
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
>&2 echo "Using ${REFERENCE} as previous version"
|
||||||
|
|
||||||
# Print the changelog
|
# Print the changelog
|
||||||
echo "## Changelog"
|
echo "## Changelog"
|
||||||
echo ""
|
echo ""
|
||||||
|
53
hack/prepare-artifacts.sh
Executable file
53
hack/prepare-artifacts.sh
Executable file
@ -0,0 +1,53 @@
|
|||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
# Copyright (c) 2023, 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.
|
||||||
|
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
# if arg1 is set, it will be used as the version number
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
VERSION=$(awk -F= '/^VERSION/ { print $2 }' versions.mk | tr -d '[:space:]')
|
||||||
|
else
|
||||||
|
VERSION=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z ${VERSION} ]]; then
|
||||||
|
echo "VERSION must be specified"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
SHA=$(git rev-parse --short=8 ${VERSION})
|
||||||
|
|
||||||
|
IMAGE_NAME="ghcr.io/nvidia/container-toolkit"
|
||||||
|
IMAGE_TAG=${SHA}-packaging
|
||||||
|
|
||||||
|
REPO="experimental"
|
||||||
|
if [[ ${VERSION/rc./} == ${VERSION} ]]; then
|
||||||
|
REPO="stable"
|
||||||
|
fi
|
||||||
|
|
||||||
|
PACKAGE_ROOT=release-${VERSION}-${REPO}
|
||||||
|
|
||||||
|
./hack/pull-packages.sh \
|
||||||
|
${IMAGE_NAME}:${IMAGE_TAG} \
|
||||||
|
${PACKAGE_ROOT}
|
||||||
|
|
||||||
|
PACKAGE_VERSION=${VERSION/-/\~}
|
||||||
|
PACKAGE_VERSION=${PACKAGE_VERSION#v}
|
||||||
|
|
||||||
|
tar -czvf ${PACKAGE_ROOT}/nvidia-container-toolkit-${VERSION}.deb.amd64.tar.gz ${PACKAGE_ROOT}/packages/ubuntu18.04/amd64/*_${PACKAGE_VERSION}-1_amd64.deb
|
||||||
|
tar -czvf ${PACKAGE_ROOT}/nvidia-container-toolkit-${VERSION}.deb.arm64.tar.gz ${PACKAGE_ROOT}/packages/ubuntu18.04/arm64/*_${PACKAGE_VERSION}-1_arm64.deb
|
||||||
|
tar -czvf ${PACKAGE_ROOT}/nvidia-container-toolkit-${VERSION}.rpm.aarch64.tar.gz ${PACKAGE_ROOT}/packages/centos7/aarch64/*-${PACKAGE_VERSION}-1.aarch64.rpm
|
||||||
|
tar -czvf ${PACKAGE_ROOT}/nvidia-container-toolkit-${VERSION}.rpm.x86_64.tar.gz ${PACKAGE_ROOT}/packages/centos7/x86_64/*-${PACKAGE_VERSION}-1.x86_64.rpm
|
186
hack/prepare-release.sh
Executable file
186
hack/prepare-release.sh
Executable file
@ -0,0 +1,186 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2024, 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.
|
||||||
|
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
this=`basename $0`
|
||||||
|
|
||||||
|
usage () {
|
||||||
|
cat << EOF
|
||||||
|
Usage: $this [-h] [-a] RELEASE_VERSION
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--previous-version specify the previous version (default: latest tag)
|
||||||
|
--help/-h show this help and exit
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
$this {{ VERSION }}
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_semver() {
|
||||||
|
local version=$1
|
||||||
|
local semver_regex="^v([0-9]+)\.([0-9]+)\.([0-9]+)(-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?$"
|
||||||
|
|
||||||
|
if [[ $version =~ $semver_regex ]]; then
|
||||||
|
major=${BASH_REMATCH[1]}
|
||||||
|
minor=${BASH_REMATCH[2]}
|
||||||
|
patch=${BASH_REMATCH[3]}
|
||||||
|
|
||||||
|
# Check if major, minor, and patch are numeric
|
||||||
|
if ! [[ $major =~ ^[0-9]+$ ]] || ! [[ $minor =~ ^[0-9]+$ ]] || ! [[ $patch =~ ^[0-9]+$ ]]; then
|
||||||
|
echo "Invalid SemVer format: $version"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Validate prerelease if present
|
||||||
|
if [[ ! -z "${BASH_REMATCH[5]}" ]]; then
|
||||||
|
prerelease=${BASH_REMATCH[5]}
|
||||||
|
prerelease_regex="^([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)$"
|
||||||
|
if ! [[ $prerelease =~ $prerelease_regex ]]; then
|
||||||
|
echo "Invalid SemVer format: $version"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Valid SemVer format: $version"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Invalid SemVer format: $version"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Parse command line
|
||||||
|
#
|
||||||
|
no_patching=
|
||||||
|
previous_version=$(git describe --tags $(git rev-list --tags --max-count=1))
|
||||||
|
# Parse command line options
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
key="$1"
|
||||||
|
case $key in
|
||||||
|
--previous-version)
|
||||||
|
previous_version="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--help/-h) usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*) break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check that no extra args were provided
|
||||||
|
if [ $# -ne 1 ]; then
|
||||||
|
if [ $# -lt 1 ]; then
|
||||||
|
echo -e "ERROR: too few arguments\n"
|
||||||
|
else
|
||||||
|
echo -e "ERROR: unknown arguments: ${@:3}\n"
|
||||||
|
fi
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
release=$1
|
||||||
|
shift 1
|
||||||
|
|
||||||
|
container_image=nvcr.io/nvidia/k8s-device-plugin:$release
|
||||||
|
|
||||||
|
#
|
||||||
|
# Check/parse release number
|
||||||
|
#
|
||||||
|
if [ -z "$release" ]; then
|
||||||
|
echo -e "ERROR: missing RELEASE_VERSION\n"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# validate the release version
|
||||||
|
if ! validate_semver $release; then
|
||||||
|
echo -e "ERROR: invalid RELEASE_VERSION\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
semver=${release:1}
|
||||||
|
|
||||||
|
# validate the previous version
|
||||||
|
if ! validate_semver $previous_version; then
|
||||||
|
echo -e "ERROR: invalid PREVIOUS_VERSION\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
pre_semver=${previous_version:1}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Modify files in the repo to point to new release
|
||||||
|
#
|
||||||
|
# Darwin or Linux
|
||||||
|
DOCKER="docker"
|
||||||
|
if [[ "$(uname)" == "Darwin" ]]; then
|
||||||
|
SED="$DOCKER run -i --rm -v $(PWD):$(PWD) -w $(PWD) alpine:latest sed"
|
||||||
|
else
|
||||||
|
SED="sed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# TODO: We need to ensure that this tooling also works on `release-*` branches.
|
||||||
|
if [[ "$FORCE_BRANCH" != "yes" && "$(git rev-parse --abbrev-ref HEAD)" != "main" ]]; then
|
||||||
|
echo "Release scripts should be run on 'main'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
git fetch
|
||||||
|
git diff --quiet FETCH_HEAD
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "Local changes detected:"
|
||||||
|
git diff FETCH_HEAD | cat
|
||||||
|
echo "Exiting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create a release issue.
|
||||||
|
echo "Creating release tracking issue"
|
||||||
|
cat RELEASE.md | sed "s/{{ .VERSION }}/$release/g" | \
|
||||||
|
gh issue create -F - \
|
||||||
|
-R NVIDIA/cloud-native-team \
|
||||||
|
--title "Release nvidia-container-toolkit $release" \
|
||||||
|
--label release
|
||||||
|
|
||||||
|
|
||||||
|
echo "Creating a version bump branch: bump-release-${release}"
|
||||||
|
git checkout -f -b bump-release-${release}
|
||||||
|
|
||||||
|
# Patch versions.mk
|
||||||
|
echo Patching versions.mk to refer to $release
|
||||||
|
$SED -i "s/^VERSION.*$/VERSION ?= $release/" versions.mk
|
||||||
|
|
||||||
|
git add versions.mk
|
||||||
|
git commit -s -m "Bump version for $release release"
|
||||||
|
|
||||||
|
if [[ $release != *-rc.* ]]; then
|
||||||
|
# Patch README.md
|
||||||
|
echo Patching README.md to refer to $release
|
||||||
|
$SED -E -i -e "s/([^[:space:]])$previous_version([^[:alnum:]]|$)/\1$release\2/g" README.md
|
||||||
|
$SED -E -i -e "s/$pre_semver/$semver/g" README.md
|
||||||
|
|
||||||
|
git add -u README.md
|
||||||
|
git commit -s -m "Bump version to $release in README"
|
||||||
|
else
|
||||||
|
echo "Skipping README update for prerelease version"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Please validated changes and create a pull request"
|
@ -42,7 +42,7 @@ if [[ -z ${DIST_DIR} ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -e ${DIST_DIR} ]]; then
|
if [[ x"${IGNORE_DIST_DIR}" != x"yes" && -e ${DIST_DIR} ]]; then
|
||||||
echo "ERROR: The specified DIST_DIR ${DIST_DIR} exists."
|
echo "ERROR: The specified DIST_DIR ${DIST_DIR} exists."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
@ -58,7 +58,7 @@ fi
|
|||||||
PACKAGE_CACHE=release-${VERSION}-${REPO}
|
PACKAGE_CACHE=release-${VERSION}-${REPO}
|
||||||
|
|
||||||
echo "Fetching packages with SHA '${SHA}' as tag '${VERSION}' to ${PACKAGE_CACHE}"
|
echo "Fetching packages with SHA '${SHA}' as tag '${VERSION}' to ${PACKAGE_CACHE}"
|
||||||
${SCRIPTS_DIR}/pull-packages.sh \
|
${SCRIPTS_DIR}/../hack/pull-packages.sh \
|
||||||
${IMAGE_NAME}:${IMAGE_TAG} \
|
${IMAGE_NAME}:${IMAGE_TAG} \
|
||||||
${PACKAGE_CACHE}
|
${PACKAGE_CACHE}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user