diff --git a/.github/scripts/compare_versions.py b/.github/scripts/compare_versions.py new file mode 100644 index 00000000..ac03e0d6 --- /dev/null +++ b/.github/scripts/compare_versions.py @@ -0,0 +1,59 @@ +# +# Copyright 2025 The Dapr Authors +# 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. +# +# This script parses release version from Git tag and set the parsed version to +# environment variable, REL_VERSION. If the tag is the final version, it sets +# LATEST_RELEASE to true to add 'latest' tag to docker image. +import os +import sys +import semver + +# compare_versions returns True if the comparison is successful. +# It returns False if the versions are invalid. +# The result of the comparison is written to the VERSION_UPDATE_REQUIRED GitHub environment variable. +def compare_versions(new_version, existing_version) -> bool: + try: + new_ver = semver.VersionInfo.parse(new_version) + existing_ver = semver.VersionInfo.parse(existing_version) + except ValueError: + print("Invalid version format") + set_github_env("VERSION_UPDATE_REQUIRED", "false") + return False + + update_required = new_ver > existing_ver + status_message = "New version is greater than existing version." if update_required else "New version is not greater. Skipping update." + print(status_message) + + # Write the update requirement status to GITHUB_ENV + github_env_path = os.getenv("GITHUB_ENV") + if github_env_path: + with open(github_env_path, "a") as github_env: + set_github_env("VERSION_UPDATE_REQUIRED", str(update_required).lower()) + return True + +def set_github_env(name: str, value: str): + github_env_path = os.getenv("GITHUB_ENV") + if github_env_path: + with open(github_env_path, "a") as github_env: + github_env.write(f"{name}={value}\n") + +if len(sys.argv) != 3: + print("Usage: compare_versions.py ") + sys.exit(1) + +new_version = sys.argv[1] +existing_version = sys.argv[2] + +if compare_versions(new_version, existing_version): + sys.exit(0) +else: + sys.exit(1) \ No newline at end of file diff --git a/.github/workflows/dapr-deploy.yml b/.github/workflows/dapr-deploy.yml index 79304458..db9bc3f6 100644 --- a/.github/workflows/dapr-deploy.yml +++ b/.github/workflows/dapr-deploy.yml @@ -11,6 +11,7 @@ on: - master paths: - 'config/dapr_runtime.version' + - 'config/dapr_cli.version' workflow_dispatch: jobs: diff --git a/.github/workflows/version-update-cli.yml b/.github/workflows/version-update-cli.yml new file mode 100644 index 00000000..c97533d2 --- /dev/null +++ b/.github/workflows/version-update-cli.yml @@ -0,0 +1,86 @@ +# +# Copyright 2025 The Dapr Authors +# 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: update-cli-version + +on: + pull_request: + paths: + - '.github/workflows/version-update-cli.yml' + - '.github/scripts/compare_versions.py' + + workflow_dispatch: + inputs: + rel_version: + description: 'Dapr release version (examples: 1.9.0-rc.1, 1.9.1)' + required: true + type: string + +jobs: + update-longhauls: + name: Update the dapr version in longhaul tests + runs-on: ubuntu-latest + permissions: + contents: write + env: + LONG_HAUL_REPO: test-infra + REL_VERSION: ${{ github.event.inputs.rel_version || '99.99.99' }} + steps: + - name: Check out code into the Go module directory + uses: actions/checkout@v4 + - name: Checkout the dapr repo + uses: actions/checkout@v4 + with: + repository: dapr/cli + path: .dapr_cli + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install pcre2-utils + pip install semver + - name: Parse release version and set REL_VERSION and LATEST_RELEASE + run: python .dapr_cli/.github/scripts/get_release_version.py ${{ github.event_name }} + - name: Compare versions and determine if update of long haul tests is required + id: compare_versions + run: | + REL_VERSION=`echo "${{ env.REL_VERSION }}" | sed -r 's/^[vV]?([0-9].+)$/\1/'` + + # Thanks to https://ihateregex.io/expr/semver/ + SEMVER_REGEX='^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$' + if [ `echo $REL_VERSION | pcre2grep "$SEMVER_REGEX"` ]; then + echo "$REL_VERSION is a valid semantic version." + else + echo "$REL_VERSION is not a valid semantic version." + exit 1 + fi + echo "REL_VERSION=${REL_VERSION,,}" >>${GITHUB_ENV} + + EXISTING_VERSION=$(cat "config/dapr_runtime.version") + echo "Existing version in longhaul tests: $EXISTING_VERSION" + echo "New version: $REL_VERSION" + python .github/scripts/compare_versions.py "$REL_VERSION" "$EXISTING_VERSION" + - name: Update dapr cli version in the longhaul tests repo + if: env.VERSION_UPDATE_REQUIRED == 'true' + run: | + echo "${REL_VERSION}" > config/dapr_cli.version + - name: Show Diff + run: | + git diff + - name: Commit and push changes + if: github.event_name == 'workflow_dispatch' && env.VERSION_UPDATE_REQUIRED == 'true' + run: | + git config --global user.name "github-actions" + git config --global user.email "github-actions@github.com" + git add config/dapr_cli.version + git commit -s -m "Updates dapr cli version to ${REL_VERSION}" + git push \ No newline at end of file diff --git a/.github/workflows/version-update-dapr.yml b/.github/workflows/version-update-dapr.yml new file mode 100644 index 00000000..d314ded3 --- /dev/null +++ b/.github/workflows/version-update-dapr.yml @@ -0,0 +1,85 @@ +# +# Copyright 2025 The Dapr Authors +# 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: update-dapr-version + +on: + pull_request: + paths: + - '.github/workflows/version-update-dapr.yml' + - '.github/scripts/compare_versions.py' + workflow_dispatch: + inputs: + rel_version: + description: 'Dapr release version (examples: 1.9.0-rc.1, 1.9.1)' + required: true + type: string + +jobs: + update-longhauls: + name: Update the dapr version in longhaul tests + runs-on: ubuntu-latest + permissions: + contents: write + env: + LONG_HAUL_REPO: test-infra + REL_VERSION: ${{ github.event.inputs.rel_version || '99.99.99' }} + steps: + - name: Check out code into the Go module directory + uses: actions/checkout@v4 + - name: Checkout the dapr repo + uses: actions/checkout@v4 + with: + repository: dapr/dapr + path: .dapr_repo + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install pcre2-utils + pip install semver + - name: Parse release version and set REL_VERSION and LATEST_RELEASE + run: python .dapr_repo/.github/scripts/get_release_version.py ${{ github.event_name }} + - name: Compare versions and determine if update of long haul tests is required + id: compare_versions + run: | + REL_VERSION=`echo "${{ env.REL_VERSION }}" | sed -r 's/^[vV]?([0-9].+)$/\1/'` + + # Thanks to https://ihateregex.io/expr/semver/ + SEMVER_REGEX='^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$' + if [ `echo $REL_VERSION | pcre2grep "$SEMVER_REGEX"` ]; then + echo "$REL_VERSION is a valid semantic version." + else + echo "$REL_VERSION is not a valid semantic version." + exit 1 + fi + echo "REL_VERSION=${REL_VERSION,,}" >>${GITHUB_ENV} + + EXISTING_VERSION=$(cat "config/dapr_runtime.version") + echo "Existing version in longhaul tests: $EXISTING_VERSION" + echo "New version: $REL_VERSION" + python .github/scripts/compare_versions.py "$REL_VERSION" "$EXISTING_VERSION" + - name: Update dapr runtime version in the longhaul tests repo + if: env.VERSION_UPDATE_REQUIRED == 'true' + run: | + echo "${REL_VERSION}" > config/dapr_runtime.version + - name: Show Diff + run: | + git diff + - name: Commit and push changes + if: github.event_name == 'workflow_dispatch' && env.VERSION_UPDATE_REQUIRED == 'true' + run: | + git config --global user.name "github-actions" + git config --global user.email "github-actions@github.com" + git add config/dapr_runtime.version + git commit -s -m "Updates dapr runtime version to ${REL_VERSION}" + git push \ No newline at end of file