From d5792ea1afd5603620feb74cd545ae81ad2100e9 Mon Sep 17 00:00:00 2001 From: Wesley Maxey Date: Wed, 16 Oct 2024 21:32:55 +0000 Subject: [PATCH] Add reusable workflow for updating version in branch with a PR --- .github/workflows/update-branch-version.yml | 147 ++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 .github/workflows/update-branch-version.yml diff --git a/.github/workflows/update-branch-version.yml b/.github/workflows/update-branch-version.yml new file mode 100644 index 00000000000..b03a9699566 --- /dev/null +++ b/.github/workflows/update-branch-version.yml @@ -0,0 +1,147 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +name: "Release: 0. Update version in target branch" + +# The branch or tag selected when starting the workflow should be: +# 1. "branch/{major}.{minor}.x" if it exists, or +# 2. "main" + +on: + workflow_dispatch: + inputs: + new_version: + description: "Version 'X.Y.Z' for the release branch." + type: string + required: true + default: "0.0.0" + target_branch: + description: "Target branch for the version update" + type: string + required: false + default: "main" + force: + description: "Enable overwriting existing PR branches (this does not force overwrite the target branch or skip creating a PR)" + type: boolean + required: true + default: false + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +jobs: + update-version: + permissions: + contents: write + pull-requests: write + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ github.token }} + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + + - name: Verify run from main + id: verify-main + run: | + # This action can only be run from main. + if [[ $GITHUB_REF != refs/heads/main ]]; then + echo " This action may only be run fom main" | tee -a $GITHUB_STEP_SUMMARY + exit 1 + fi + + - name: Prepare environment + id: prepare-env + run: | + log_and_export_vars() { + for var in "$@"; do + printf "%-15s %s\n" "$var:" "${!var}" | tee -a $GITHUB_STEP_SUMMARY + echo "${var}=${!var}" | tee -a $GITHUB_ENV | tee -a $GITHUB_OUTPUT + done + } + + full_version=${{ inputs.new_version }} + major_version=$(echo ${full_version} | cut -d. -f1) + minor_version=$(echo ${full_version} | cut -d. -f2) + patch_version=$(echo ${full_version} | cut -d. -f3) + branch_name=${{ inputs.target_branch }} + enable_force_push="${{ inputs.force }}" + pr_title="[Version] Update ${branch_name} to v${full_version}" + pr_body="Bump ${branch_name} to ${full_version}." + pr_branch="pr/ver/${branch_name}-v${full_version}" + + log_and_export_vars \ + full_version major_version minor_version patch_version \ + branch_name pr_title pr_branch pr_body enable_force_push + + echo "Branch ref: $GITHUB_REF" | tee -a $GITHUB_STEP_SUMMARY + echo "Branch SHA: $GITHUB_SHA" | tee -a $GITHUB_STEP_SUMMARY + echo "Branch commit: $(git show --oneline --no-patch ${GITHUB_SHA})" | tee -a $GITHUB_STEP_SUMMARY + + - name: Verify environment + id: verify-env + run: | + # Target branch must already exist + if ! git ls-remote --exit-code origin ${branch_name}; then + echo " Target branch must already exist" | tee -a $GITHUB_STEP_SUMMARY + exit 1 + fi + + # PR branch must *not* exist + if [ "${enable_force_push}" == "false" ]; then + if git ls-remote --exit-code origin ${pr_branch}; then + echo " PR branch cannot already exist - Delete branch and retry workflow or enable 'force'" | tee -a $GITHUB_STEP_SUMMARY + exit 1 + fi + fi + + if [[ ! $full_version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Invalid version number: $full_version" + exit 1 + fi + + - name: Update version numbers in target branch + id: create-pr-branch + run: | + git checkout ${branch_name} + git checkout -b ${pr_branch} + echo "::group::Running update_version.sh" + ./ci/update_version.sh ${major_version} ${minor_version} ${patch_version} + echo "::endgroup::" + + if ! git diff --quiet; then + echo "::group::Diff" + git diff + echo "::endgroup::" + + git add . + + git config user.name github-actions + git config user.email github-actions@github.com + git commit -m "${pr_body}" + + # Push the changes to the release branch: + git push --force origin ${pr_branch} + fi + + - name: Create pull request for target branch + id: create-pr + run: | + gh pr create \ + -B "${branch_name}" \ + -b "${pr_body}" \ + -t "${pr_title}" \ + -H "${pr_branch}"