From 826007ebaaa1bf09a7080a071e42e006fa8d66bf Mon Sep 17 00:00:00 2001 From: Luke Hagar Date: Mon, 16 Feb 2026 11:12:55 -0600 Subject: [PATCH 1/3] Refactor GitHub Actions workflows for SDK build and release - Consolidated SDK build steps into a single action in `build_pr.yaml`. - Removed outdated workflows for version bumping and package publishing to Test PyPI. - Enhanced `release.yaml` to include version checking and automatic version bumping. - Updated environment variables and checkout steps for better clarity and efficiency. --- .github/actions/build-sdk/action.yaml | 103 +++++++++++ .github/workflows/build_pr.yaml | 73 +------- .github/workflows/bump_version.yaml | 161 ------------------ .github/workflows/publish.yaml | 31 ++++ .../workflows/push_package_to_testpypi.yaml | 59 ------- .github/workflows/release.yaml | 160 ++++++++++++++--- 6 files changed, 277 insertions(+), 310 deletions(-) create mode 100644 .github/actions/build-sdk/action.yaml delete mode 100644 .github/workflows/bump_version.yaml create mode 100644 .github/workflows/publish.yaml delete mode 100644 .github/workflows/push_package_to_testpypi.yaml diff --git a/.github/actions/build-sdk/action.yaml b/.github/actions/build-sdk/action.yaml new file mode 100644 index 000000000..af3efbf16 --- /dev/null +++ b/.github/actions/build-sdk/action.yaml @@ -0,0 +1,103 @@ +name: "Build Python SDK" +description: "Build all API versions of the Python SDK from OpenAPI specs" + +inputs: + api-specs-path: + description: "Path to the checked-out api-specs repository" + required: false + default: "api-specs" + skip-tests: + description: "Skip running tests after building" + required: false + default: "false" + +runs: + using: "composite" + steps: + - name: Set up Node + uses: actions/setup-node@v6 + with: + node-version: "24" + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Download OpenAPI Generator + shell: bash + run: | + wget -q https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.12.0/openapi-generator-cli-7.12.0.jar -O openapi-generator-cli.jar + + - name: Run Prescript + shell: bash + run: node sdk-resources/prescript.js ${{ inputs.api-specs-path }}/idn + + - name: Build V3 SDK + shell: bash + run: | + rm -rf ./sailpoint/v3 + java -jar openapi-generator-cli.jar generate \ + -i ${{ inputs.api-specs-path }}/idn/sailpoint-api.v3.yaml \ + -g python -o . \ + --global-property skipFormModel=false,apiDocs=true,modelDocs=true \ + --config sdk-resources/v3-config.yaml \ + --enable-post-process-file + node sdk-resources/postscript.js ./sailpoint/v3 + + - name: Build Beta SDK + shell: bash + run: | + rm -rf ./sailpoint/beta + java -jar openapi-generator-cli.jar generate \ + -i ${{ inputs.api-specs-path }}/idn/sailpoint-api.beta.yaml \ + -g python -o . \ + --global-property skipFormModel=false,apiDocs=true,modelDocs=true \ + --config sdk-resources/beta-config.yaml \ + --enable-post-process-file + node sdk-resources/postscript.js ./sailpoint/beta + + - name: Build V2024 SDK + shell: bash + run: | + rm -rf ./sailpoint/v2024 + java -jar openapi-generator-cli.jar generate \ + -i ${{ inputs.api-specs-path }}/idn/sailpoint-api.v2024.yaml \ + -g python -o . \ + --global-property skipFormModel=false,apiDocs=true,modelDocs=true \ + --config sdk-resources/v2024-config.yaml \ + --enable-post-process-file + node sdk-resources/postscript.js ./sailpoint/v2024 + + - name: Build V2025 SDK + shell: bash + run: | + rm -rf ./sailpoint/v2025 + java -jar openapi-generator-cli.jar generate \ + -i ${{ inputs.api-specs-path }}/idn/sailpoint-api.v2025.yaml \ + -g python -o . \ + --global-property skipFormModel=false,apiDocs=true,modelDocs=true \ + --config sdk-resources/v2025-config.yaml \ + --enable-post-process-file + node sdk-resources/postscript.js ./sailpoint/v2025 + + - name: Build V2026 SDK + shell: bash + run: | + rm -rf ./sailpoint/v2026 + java -jar openapi-generator-cli.jar generate \ + -i ${{ inputs.api-specs-path }}/idn/sailpoint-api.v2026.yaml \ + -g python -o . \ + --global-property skipFormModel=false,apiDocs=true,modelDocs=true \ + --config sdk-resources/v2026-config.yaml \ + --enable-post-process-file + node sdk-resources/postscript.js ./sailpoint/v2026 + + - name: Build and Test + shell: bash + run: | + pip install -r requirements.txt + pip install -e . + if [ "${{ inputs.skip-tests }}" != "true" ]; then + python validation_test.py -v + fi diff --git a/.github/workflows/build_pr.yaml b/.github/workflows/build_pr.yaml index 12287bbe2..d150090bf 100644 --- a/.github/workflows/build_pr.yaml +++ b/.github/workflows/build_pr.yaml @@ -16,80 +16,15 @@ jobs: name: Build Python SDK runs-on: ubuntu-latest steps: - - name: Checkout PR branch + - name: Checkout uses: actions/checkout@v6 - with: - ref: ${{ github.ref }} - - name: Checkout API Specs Repo + - name: Checkout API Specs uses: actions/checkout@v6 with: repository: sailpoint-oss/api-specs path: api-specs ref: main - - - name: Set up Node - uses: actions/setup-node@v6 - with: - node-version: "24" - - - name: Download OpenAPI Generator - run: | - wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.11.0/openapi-generator-cli-7.11.0.jar -O openapi-generator-cli.jar - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Run Prescript - id: prescript - run: | - node sdk-resources/prescript.js api-specs/idn - - - name: Build V3 SDK - id: buildV3 - if: steps.prescript.outcome == 'success' - run: | - rm -rf ./sailpoint/v3 - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.v3.yaml -g python -o . --global-property skipFormModel=false,apiDocs=true,modelDocs=true --config sdk-resources/v3-config.yaml --enable-post-process-file - node sdk-resources/postscript.js ./sailpoint/v3 - - - name: Build Beta SDK - id: buildBeta - if: steps.buildV3.outcome == 'success' - run: | - rm -rf ./sailpoint/beta - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.beta.yaml -g python -o . --global-property skipFormModel=false,apiDocs=true,modelDocs=true --config sdk-resources/beta-config.yaml --enable-post-process-file - node sdk-resources/postscript.js ./sailpoint/beta - - - name: Build V2024 SDK - id: buildV2024 - if: steps.buildBeta.outcome == 'success' - run: | - rm -rf ./sailpoint/v2024 - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.v2024.yaml -g python -o . --global-property skipFormModel=false,apiDocs=true,modelDocs=true --config sdk-resources/v2024-config.yaml --enable-post-process-file - node sdk-resources/postscript.js ./sailpoint/v2024 - - - name: Build V2025 SDK - id: buildV2025 - if: steps.buildV2024.outcome == 'success' - run: | - rm -rf ./sailpoint/v2025 - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.v2025.yaml -g python -o . --global-property skipFormModel=false,apiDocs=true,modelDocs=true --config sdk-resources/v2025-config.yaml --enable-post-process-file - node sdk-resources/postscript.js ./sailpoint/v2025 - - - name: Build V2026 SDK - id: buildV2026 - if: steps.buildV2025.outcome == 'success' - run: | - rm -rf ./sailpoint/v2026 - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.v2026.yaml -g python -o . --global-property skipFormModel=false,apiDocs=true,modelDocs=true --config sdk-resources/v2026-config.yaml --enable-post-process-file - node sdk-resources/postscript.js ./sailpoint/v2026 - - name: After SDK Build - if: steps.buildV2026.outcome == 'success' - run: | - pip install -r requirements.txt - pip install -e . - python validation_test.py -v + - name: Build SDK + uses: ./.github/actions/build-sdk diff --git a/.github/workflows/bump_version.yaml b/.github/workflows/bump_version.yaml deleted file mode 100644 index 56354511c..000000000 --- a/.github/workflows/bump_version.yaml +++ /dev/null @@ -1,161 +0,0 @@ -name: "Update Python SDK Version" - -env: - SAIL_CLIENT_ID: ${{ secrets.SDK_TEST_TENANT_CLIENT_ID }} - SAIL_CLIENT_SECRET: ${{ secrets.SDK_TEST_TENANT_CLIENT_SECRET }} - SAIL_BASE_URL: ${{ secrets.SDK_TEST_TENANT_BASE_URL }} - -run-name: Update Python SDK Version to ${{ github.event.inputs.version }} - -on: - workflow_dispatch: - inputs: - version: - description: The version to bump to - -jobs: - update_python_version: - name: Update Python Version - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - ref: ${{ github.ref }} - fetch-depth: 0 - token: ${{ secrets.DEVREL_SERVICE_TOKEN }} - - - - name: Checkout API Specs Repo - uses: actions/checkout@v6 - with: - repository: sailpoint-oss/api-specs - path: api-specs - ref: main - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Set up Node - uses: actions/setup-node@v6 - with: - node-version: "24" - - - name: Run Prescript - id: prescript - run: | - node sdk-resources/prescript.js api-specs/idn - - # Install yq for working with yaml files - - name: Set up yq - uses: frenck/action-setup-yq@v1 - - # Check input version is greater than the current tag - - name: Check valid version - run: | - function ver { printf "%03d%03d%03d%03d" $(echo "$1" | tr '.' ' '); } - - LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`) - echo $LATEST_TAG - if [ $(ver $LATEST_TAG) -lt $(ver ${{ github.event.inputs.version}}) ] - then - echo "Input version ${{ github.event.inputs.version }} valid" - else - echo "Current tagged version $LATEST_TAG is greater than input version ${{ github.event.inputs.version }}" - exit 1 - fi - - ## Update configuration files to new version - - name: Update config files with new version - id: updateVersion - run: | - yq -i '.packageVersion = "${{ github.event.inputs.version }}"' sdk-resources/beta-config.yaml - yq -i '.packageVersion = "${{ github.event.inputs.version }}"' sdk-resources/v3-config.yaml - yq -i '.packageVersion = "${{ github.event.inputs.version }}"' sdk-resources/v2024-config.yaml - yq -i '.packageVersion = "${{ github.event.inputs.version }}"' sdk-resources/v2025-config.yaml - yq -i '.packageVersion = "${{ github.event.inputs.version }}"' sdk-resources/v2026-config.yaml - - - - ## Update setup.py file with new version - - name: Update setup.py package - id: updatePackageVersion - if: steps.updateVersion.outcome == 'success' - run: | - LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`) - sed -e "s/VERSION = \"${LATEST_TAG:1}\"/VERSION = \"${{ github.event.inputs.version }}\"/g" setup.py > setup.py.tmp && mv setup.py.tmp setup.py - - - name: Build V3 SDK - id: buildV3 - if: steps.updatePackageVersion.outcome == 'success' - run: | - rm -rf ./sailpoint/v3 - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.v3.yaml -g python -o . --global-property skipFormModel=false --config sdk-resources/v3-config.yaml --enable-post-process-file - - - - name: Build Beta SDK - id: buildBeta - if: steps.buildV3.outcome == 'success' - run: | - rm -rf ./sailpoint/beta - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.beta.yaml -g python -o . --global-property skipFormModel=false --config sdk-resources/beta-config.yaml --enable-post-process-file - node sdk-resources/postscript.js ./sailpoint/beta - - - name: Build V2024 SDK - id: buildV2024 - if: steps.buildBeta.outcome == 'success' - run: | - rm -rf ./sailpoint/v2024 - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.v2024.yaml -g python -o . --global-property skipFormModel=false --config sdk-resources/v2024-config.yaml --enable-post-process-file - node sdk-resources/postscript.js ./sailpoint/v2024 - - - name: Build V2025 SDK - id: buildV2025 - if: steps.buildV2024.outcome == 'success' - run: | - rm -rf ./sailpoint/v2025 - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.v2025.yaml -g python -o . --global-property skipFormModel=false --config sdk-resources/v2025-config.yaml --enable-post-process-file - node sdk-resources/postscript.js ./sailpoint/v2025 - - name: Build V2026 SDK - id: buildV2026 - if: steps.buildV2025.outcome == 'success' - run: | - rm -rf ./sailpoint/v2026 - java -jar openapi-generator-cli.jar generate -i api-specs/idn/sailpoint-api.v2026.yaml -g python -o . --global-property skipFormModel=false --config sdk-resources/v2026-config.yaml --enable-post-process-file - node sdk-resources/postscript.js ./sailpoint/v2026 - - - name: After SDK Build - id: buildSDK - if: steps.buildV2026.outcome == 'success' - shell: pwsh - run: | - pip install -r requirements.txt - pip install -e . - python validation_test.py -v - - - name: Commit changes and create new version tag - if: steps.buildSDK.outcome == 'success' - uses: stefanzweifel/git-auto-commit-action@v7 - with: - commit_message: Bump version to ${{ github.event.inputs.version }} - tagging_message: v${{ github.event.inputs.version }} - commit_user_name: developer-relations-sp - commit_user_email: devrel-service@sailpoint.com - - - - - name: Create Draft Release - id: createRelease - uses: softprops/action-gh-release@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: v${{ github.event.inputs.version }} - name: v${{ github.event.inputs.version }} - draft: false - prerelease: false - diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 000000000..9821806d0 --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,31 @@ +name: "Publish to PyPI" + +on: + release: + types: [created] + workflow_dispatch: + +jobs: + pypi-publish: + name: Upload release to PyPI + runs-on: ubuntu-latest + environment: release + permissions: + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Install build package + run: python -m pip install --upgrade build + + - name: Build package + run: python -m build + + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/push_package_to_testpypi.yaml b/.github/workflows/push_package_to_testpypi.yaml deleted file mode 100644 index 168c6f74a..000000000 --- a/.github/workflows/push_package_to_testpypi.yaml +++ /dev/null @@ -1,59 +0,0 @@ -name: "Build and push SDK to Test PyPi" - -on: - workflow_dispatch: - -jobs: - pypi-publish: - name: Upload release to Test PyPI - runs-on: ubuntu-latest - permissions: - id-token: write # IMPORTANT: this permission is mandatory for trusted publishing - steps: - # retrieve your distributions here - - # Setup Python - - name: Checkout PR branch - uses: actions/checkout@v6 - with: - ref: ${{ github.ref }} - token: ${{secrets.DEVREL_SERVICE_TOKEN}} - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Install build and twine packages - id: requirements - run: | - python -m pip install --upgrade build - python -m pip install --upgrade twine - - - name: Build sailpoint package - id: build - if: steps.requirements.outcome == 'success' - run: | - python -m build - - - name: Setup JFrog CLI - uses: jfrog/setup-jfrog-cli@v3 - env: - JF_URL: https://sailpoint.jfrog.io - JF_ACCESS_TOKEN: ${{ secrets.ARTIFACTORY_TOKEN_DEV }} - - name: Publish distribution to JFrog - run: | - # Ping the server (test connection) - jf rt ping - # Upload the package - jf rt u dist/sailpoint-1.0.0-py3-none-any.whl sp-pypi-dev - jf rt u dist/sailpoint-1.0.0.tar.gz sp-pypi-dev - - - # - name: Publish package distributions to PyPI - # uses: pypa/gh-action-pypi-publish@release/v1 - # with: - # user: __token__ - # password: ${{secrets.ARTIFACTORY_TOKEN_DEV}} - # repository-url: https://sailpoint.jfrog.io/artifactory/sp-pypi-dev/ - # packages-dir: sailpoint/dist/ \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2c36883cf..a9f6c8f3e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,37 +1,155 @@ -name: Release +name: "Release Python SDK" + +run-name: >- + ${{ + github.event_name == 'workflow_dispatch' && github.event.inputs.version != '' + && format('Release Python SDK v{0}', github.event.inputs.version) + || 'Release Python SDK (auto)' + }} on: - release: - types: [created] workflow_dispatch: + inputs: + version: + description: "The version to release (e.g. 1.5.0). Leave empty to auto-increment patch." + required: false + repository_dispatch: + types: [api-specs-updated] + schedule: + - cron: "0 8 * * 1-5" + +env: + SAIL_CLIENT_ID: ${{ secrets.SDK_TEST_TENANT_CLIENT_ID }} + SAIL_CLIENT_SECRET: ${{ secrets.SDK_TEST_TENANT_CLIENT_SECRET }} + SAIL_BASE_URL: ${{ secrets.SDK_TEST_TENANT_BASE_URL }} jobs: - pypi-publish: - name: upload release to PyPI + check-changes: + name: Check for spec changes + runs-on: ubuntu-latest + outputs: + proceed: ${{ steps.check.outputs.proceed }} + steps: + - name: Checkout SDK + if: github.event_name == 'schedule' + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Checkout API Specs + if: github.event_name == 'schedule' + uses: actions/checkout@v6 + with: + repository: sailpoint-oss/api-specs + path: api-specs + ref: main + + - name: Determine whether to proceed + id: check + shell: bash + run: | + if [ "${{ github.event_name }}" != "schedule" ]; then + echo "proceed=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + + LATEST_TAG=$(git describe --tags $(git rev-list --tags --max-count=1) 2>/dev/null || echo "v0.0.0") + TAG_DATE=$(git log -1 --format=%aI "$LATEST_TAG" 2>/dev/null || echo "1970-01-01") + SPEC_CHANGES=$(cd api-specs && git log --after="$TAG_DATE" --oneline | wc -l) + + if [ "$SPEC_CHANGES" -eq 0 ]; then + echo "No spec changes since $LATEST_TAG ($TAG_DATE). Skipping release." + echo "proceed=false" >> "$GITHUB_OUTPUT" + else + echo "Found $SPEC_CHANGES spec changes since $LATEST_TAG. Proceeding." + echo "proceed=true" >> "$GITHUB_OUTPUT" + fi + + release: + name: Release Python SDK + needs: check-changes + if: needs.check-changes.outputs.proceed == 'true' runs-on: ubuntu-latest - environment: release permissions: - id-token: write + contents: write steps: - - name: Checkout branch + - name: Checkout uses: actions/checkout@v6 with: - ref: ${{ github.ref }} + ref: main + fetch-depth: 0 + token: ${{ secrets.DEVREL_SERVICE_TOKEN }} - - name: Set up Python - uses: actions/setup-python@v5 + - name: Checkout API Specs + uses: actions/checkout@v6 with: - python-version: '3.x' - - name: Install build package - id: requirements + repository: sailpoint-oss/api-specs + path: api-specs + ref: main + + - name: Set up yq + uses: frenck/action-setup-yq@v1 + + - name: Determine version + id: version + shell: bash + run: | + LATEST_TAG=$(git describe --tags $(git rev-list --tags --max-count=1) 2>/dev/null || echo "v0.0.0") + LATEST_VERSION="${LATEST_TAG#v}" + echo "latest=$LATEST_VERSION" >> "$GITHUB_OUTPUT" + + if [ -n "${{ github.event.inputs.version }}" ]; then + NEW_VERSION="${{ github.event.inputs.version }}" + else + IFS='.' read -r MAJOR MINOR PATCH <<< "$LATEST_VERSION" + PATCH=$((PATCH + 1)) + NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}" + fi + + function ver { printf "%03d%03d%03d%03d" $(echo "$1" | tr '.' ' '); } + if [ "$(ver "$LATEST_VERSION")" -ge "$(ver "$NEW_VERSION")" ]; then + echo "::error::New version $NEW_VERSION is not greater than current version $LATEST_VERSION" + exit 1 + fi + + echo "new=$NEW_VERSION" >> "$GITHUB_OUTPUT" + echo "Releasing version $NEW_VERSION (previous: $LATEST_VERSION)" + + - name: Update config files with new version + shell: bash run: | - python -m pip install --upgrade build + VERSION="${{ steps.version.outputs.new }}" + yq -i ".packageVersion = \"$VERSION\"" sdk-resources/v3-config.yaml + yq -i ".packageVersion = \"$VERSION\"" sdk-resources/beta-config.yaml + yq -i ".packageVersion = \"$VERSION\"" sdk-resources/v2024-config.yaml + yq -i ".packageVersion = \"$VERSION\"" sdk-resources/v2025-config.yaml + yq -i ".packageVersion = \"$VERSION\"" sdk-resources/v2026-config.yaml - - name: Build test package - id: build - if: steps.requirements.outcome == 'success' + - name: Update setup.py version + shell: bash run: | - python -m build + LATEST="${{ steps.version.outputs.latest }}" + NEW="${{ steps.version.outputs.new }}" + sed -e "s/VERSION = \"${LATEST}\"/VERSION = \"${NEW}\"/g" setup.py > setup.py.tmp && mv setup.py.tmp setup.py + + - name: Build SDK + uses: ./.github/actions/build-sdk - - name: Publish package distributions to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 \ No newline at end of file + - name: Commit changes and tag + uses: stefanzweifel/git-auto-commit-action@v7 + with: + commit_message: "Bump version to v${{ steps.version.outputs.new }}" + tagging_message: "v${{ steps.version.outputs.new }}" + commit_user_name: developer-relations-sp + commit_user_email: devrel-service@sailpoint.com + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: "v${{ steps.version.outputs.new }}" + name: "v${{ steps.version.outputs.new }}" + draft: false + prerelease: false + generate_release_notes: true From a0dae6d15bc23df0ab79ce24ce5342b384199fc9 Mon Sep 17 00:00:00 2001 From: Luke Hagar Date: Mon, 16 Feb 2026 11:56:22 -0600 Subject: [PATCH 2/3] Add concurrency settings to GitHub Actions workflows - Introduced concurrency groups to `build_pr.yaml`, `push_sdk_docs_to_dev_portal.yaml`, and `release.yaml` to manage workflow execution. - Enabled cancellation of in-progress builds for PR and documentation sync workflows, while maintaining the release workflow's execution. --- .github/workflows/build_pr.yaml | 4 ++++ .github/workflows/push_sdk_docs_to_dev_portal.yaml | 4 ++++ .github/workflows/release.yaml | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/.github/workflows/build_pr.yaml b/.github/workflows/build_pr.yaml index d150090bf..6d8bc9560 100644 --- a/.github/workflows/build_pr.yaml +++ b/.github/workflows/build_pr.yaml @@ -11,6 +11,10 @@ on: - main workflow_dispatch: +concurrency: + group: pr-build-${{ github.ref }} + cancel-in-progress: true + jobs: build_python_sdk: name: Build Python SDK diff --git a/.github/workflows/push_sdk_docs_to_dev_portal.yaml b/.github/workflows/push_sdk_docs_to_dev_portal.yaml index f67ee5b0c..ea1968c37 100644 --- a/.github/workflows/push_sdk_docs_to_dev_portal.yaml +++ b/.github/workflows/push_sdk_docs_to_dev_portal.yaml @@ -9,6 +9,10 @@ on: - main workflow_dispatch: +concurrency: + group: docs-sync-${{ github.repository }} + cancel-in-progress: true + jobs: push_spec_workflow: name: Push API spec changes diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index a9f6c8f3e..79c47f5aa 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -18,6 +18,10 @@ on: schedule: - cron: "0 8 * * 1-5" +concurrency: + group: release-${{ github.repository }} + cancel-in-progress: false + env: SAIL_CLIENT_ID: ${{ secrets.SDK_TEST_TENANT_CLIENT_ID }} SAIL_CLIENT_SECRET: ${{ secrets.SDK_TEST_TENANT_CLIENT_SECRET }} From feffdb4802dd6fbc1976da149f2acaff5880a875 Mon Sep 17 00:00:00 2001 From: Luke Hagar Date: Mon, 16 Feb 2026 12:27:57 -0600 Subject: [PATCH 3/3] Update version bumping logic in release workflow - Enhanced the version bumping process in `release.yaml` to properly escape dots in the current version string, ensuring accurate replacements in `setup.py`. --- .github/workflows/release.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 79c47f5aa..bea9f988d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -134,7 +134,8 @@ jobs: run: | LATEST="${{ steps.version.outputs.latest }}" NEW="${{ steps.version.outputs.new }}" - sed -e "s/VERSION = \"${LATEST}\"/VERSION = \"${NEW}\"/g" setup.py > setup.py.tmp && mv setup.py.tmp setup.py + LATEST_ESCAPED="${LATEST//./\\.}" + sed -e "s/VERSION = \"${LATEST_ESCAPED}\"/VERSION = \"${NEW}\"/g" setup.py > setup.py.tmp && mv setup.py.tmp setup.py - name: Build SDK uses: ./.github/actions/build-sdk