From f69402db37964a3839f677f0d45d7cd5b3bb0e9e Mon Sep 17 00:00:00 2001 From: KC Berg Date: Wed, 9 Jul 2025 06:52:17 -0600 Subject: [PATCH 1/7] ci: add commit message filter to prevent workflow loops on bumpver commits --- .github/workflows/ci.yml | 5 +++-- .github/workflows/prepare-release.yml | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a49067..23e1e83 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,7 @@ on: jobs: test: + if: !contains(github.event.head_commit.message, 'bump: version') runs-on: ubuntu-latest strategy: matrix: @@ -41,7 +42,7 @@ jobs: pytest --maxfail=1 --disable-warnings tag-version: - if: github.ref == 'refs/heads/main' && github.event_name == 'push' + if: !contains(github.event.head_commit.message, 'bump: version') && github.ref == 'refs/heads/main' && github.event_name == 'push' needs: test runs-on: ubuntu-latest steps: @@ -88,7 +89,7 @@ jobs: GIT_TRACE_PACKET=1 GIT_TRACE=1 GIT_CURL_VERBOSE=1 git push origin v${{ steps.get_version.outputs.version }} bump-version: - if: github.ref == 'refs/heads/main' && github.event_name == 'push' + if: !contains(github.event.head_commit.message, 'bump: version') && github.ref == 'refs/heads/main' && github.event_name == 'push' needs: [test, tag-version] runs-on: ubuntu-latest steps: diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index ab13c8b..efd469e 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -10,6 +10,7 @@ jobs: bump-minor-version: name: Bump Minor Version runs-on: ubuntu-latest + if: !contains(github.event.head_commit.message, 'bump: version') steps: - name: Check for bumpver commit id: skip_bumpver From 28aa4722b159e784f74aec9fd80a2dd98c1c1c34 Mon Sep 17 00:00:00 2001 From: KC Berg Date: Wed, 9 Jul 2025 06:54:34 -0600 Subject: [PATCH 2/7] ci: use step-based skip for bumpver commit filter (fix YAML syntax error) --- .github/workflows/ci.yml | 3 --- .github/workflows/prepare-release.yml | 1 - 2 files changed, 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 23e1e83..aafabab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,6 @@ on: jobs: test: - if: !contains(github.event.head_commit.message, 'bump: version') runs-on: ubuntu-latest strategy: matrix: @@ -42,7 +41,6 @@ jobs: pytest --maxfail=1 --disable-warnings tag-version: - if: !contains(github.event.head_commit.message, 'bump: version') && github.ref == 'refs/heads/main' && github.event_name == 'push' needs: test runs-on: ubuntu-latest steps: @@ -89,7 +87,6 @@ jobs: GIT_TRACE_PACKET=1 GIT_TRACE=1 GIT_CURL_VERBOSE=1 git push origin v${{ steps.get_version.outputs.version }} bump-version: - if: !contains(github.event.head_commit.message, 'bump: version') && github.ref == 'refs/heads/main' && github.event_name == 'push' needs: [test, tag-version] runs-on: ubuntu-latest steps: diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index efd469e..ab13c8b 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -10,7 +10,6 @@ jobs: bump-minor-version: name: Bump Minor Version runs-on: ubuntu-latest - if: !contains(github.event.head_commit.message, 'bump: version') steps: - name: Check for bumpver commit id: skip_bumpver From 94650c310ef20a087270337ea5213abe7565255b Mon Sep 17 00:00:00 2001 From: KC Berg Date: Wed, 9 Jul 2025 06:57:42 -0600 Subject: [PATCH 3/7] ci: ensure tag-version and bump-version jobs only run on push to main --- .github/workflows/ci.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aafabab..d2d8932 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,34 +52,34 @@ jobs: exit 0 fi - uses: actions/checkout@v4 - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' with: persist-credentials: 'false' - name: Generate GitHub App token - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' id: generate_token uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.HAWKY_APP_ID }} private_key: ${{ secrets.HAWKY_APP_PRIVATE_KEY }} - name: Set up git for pushing - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' run: | git remote set-url origin https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/${{ github.repository }}.git - name: Show current branch and HEAD - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' run: | git branch -a git status git rev-parse --abbrev-ref HEAD - name: Get version from pyproject.toml - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' id: get_version run: | VERSION=$(grep '^version =' pyproject.toml | head -1 | cut -d '"' -f2) echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Create and push tag for current version (with verbose logging) - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' run: | git remote -v git tag v${{ steps.get_version.outputs.version }} @@ -98,35 +98,35 @@ jobs: exit 0 fi - uses: actions/checkout@v4 - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' with: persist-credentials: 'false' - name: Generate GitHub App token - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' id: generate_token uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.HAWKY_APP_ID }} private_key: ${{ secrets.HAWKY_APP_PRIVATE_KEY }} - name: Set up git for pushing - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' run: | git remote set-url origin https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/${{ github.repository }}.git - name: Install dependencies - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install . - name: Set git user for HawkyMcBuilderFace bot - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' run: | git config user.name "HawkyMcBuilderFace[bot]" git config user.email "hawkymcbuilderface[bot]@users.noreply.github.com" - name: Bump patch version with bumpver - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' run: bumpver update --patch --commit - name: Push version bump commit - if: steps.skip_bumpver.outcome == 'success' + if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' run: | git push From 3d9d0a1edad3550afda728f968ecbfe3b2d920af Mon Sep 17 00:00:00 2001 From: KC Berg Date: Wed, 9 Jul 2025 06:59:39 -0600 Subject: [PATCH 4/7] ci: skip tag-version and bump-version jobs unless push to main --- .github/workflows/ci.yml | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d2d8932..5a49067 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,6 +41,7 @@ jobs: pytest --maxfail=1 --disable-warnings tag-version: + if: github.ref == 'refs/heads/main' && github.event_name == 'push' needs: test runs-on: ubuntu-latest steps: @@ -52,34 +53,34 @@ jobs: exit 0 fi - uses: actions/checkout@v4 - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' with: persist-credentials: 'false' - name: Generate GitHub App token - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' id: generate_token uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.HAWKY_APP_ID }} private_key: ${{ secrets.HAWKY_APP_PRIVATE_KEY }} - name: Set up git for pushing - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' run: | git remote set-url origin https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/${{ github.repository }}.git - name: Show current branch and HEAD - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' run: | git branch -a git status git rev-parse --abbrev-ref HEAD - name: Get version from pyproject.toml - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' id: get_version run: | VERSION=$(grep '^version =' pyproject.toml | head -1 | cut -d '"' -f2) echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Create and push tag for current version (with verbose logging) - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' run: | git remote -v git tag v${{ steps.get_version.outputs.version }} @@ -87,6 +88,7 @@ jobs: GIT_TRACE_PACKET=1 GIT_TRACE=1 GIT_CURL_VERBOSE=1 git push origin v${{ steps.get_version.outputs.version }} bump-version: + if: github.ref == 'refs/heads/main' && github.event_name == 'push' needs: [test, tag-version] runs-on: ubuntu-latest steps: @@ -98,35 +100,35 @@ jobs: exit 0 fi - uses: actions/checkout@v4 - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' with: persist-credentials: 'false' - name: Generate GitHub App token - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' id: generate_token uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.HAWKY_APP_ID }} private_key: ${{ secrets.HAWKY_APP_PRIVATE_KEY }} - name: Set up git for pushing - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' run: | git remote set-url origin https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/${{ github.repository }}.git - name: Install dependencies - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install . - name: Set git user for HawkyMcBuilderFace bot - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' run: | git config user.name "HawkyMcBuilderFace[bot]" git config user.email "hawkymcbuilderface[bot]@users.noreply.github.com" - name: Bump patch version with bumpver - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' run: bumpver update --patch --commit - name: Push version bump commit - if: steps.skip_bumpver.outcome == 'success' && github.ref == 'refs/heads/main' && github.event_name == 'push' + if: steps.skip_bumpver.outcome == 'success' run: | git push From 41ec31a5f64b44c822144f2c80cc3492518b54ff Mon Sep 17 00:00:00 2001 From: KC Berg Date: Wed, 9 Jul 2025 07:05:10 -0600 Subject: [PATCH 5/7] ci: fail job on bumpver commit to prevent workflow loop; disable test job on push to main --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a49067..69911e0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,7 @@ on: jobs: test: + if: github.event_name != 'push' || github.ref != 'refs/heads/main' runs-on: ubuntu-latest strategy: matrix: @@ -17,8 +18,8 @@ jobs: id: skip_bumpver run: | if [[ "${{ github.event.head_commit.message }}" == *"bump: version"* ]]; then - echo "Bumpver commit detected, skipping job." - exit 0 + echo "Bumpver commit detected, failing job to prevent workflow loop." + exit 1 fi - uses: actions/checkout@v4 if: steps.skip_bumpver.outcome == 'success' From c3c73b2af188d1ab4d99f63d4ebbb84bdaea8908 Mon Sep 17 00:00:00 2001 From: KC Berg Date: Wed, 9 Jul 2025 07:08:34 -0600 Subject: [PATCH 6/7] ci: use dynamic output skip pattern for tag-version and bump-version jobs (no fail) --- .github/workflows/ci.yml | 43 ++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 69911e0..13d756f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,47 +41,48 @@ jobs: run: | pytest --maxfail=1 --disable-warnings - tag-version: - if: github.ref == 'refs/heads/main' && github.event_name == 'push' - needs: test + check-bumpver: runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.check.outputs.should_run }} steps: - name: Check for bumpver commit - id: skip_bumpver + id: check run: | if [[ "${{ github.event.head_commit.message }}" == *"bump: version"* ]]; then - echo "Bumpver commit detected, skipping job." - exit 0 + echo "should_run=false" >> $GITHUB_OUTPUT + else + echo "should_run=true" >> $GITHUB_OUTPUT fi + + tag-version: + if: needs.check-bumpver.outputs.should_run == 'true' && github.ref == 'refs/heads/main' && github.event_name == 'push' + needs: [test, check-bumpver] + runs-on: ubuntu-latest + steps: - uses: actions/checkout@v4 - if: steps.skip_bumpver.outcome == 'success' with: persist-credentials: 'false' - name: Generate GitHub App token - if: steps.skip_bumpver.outcome == 'success' id: generate_token uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.HAWKY_APP_ID }} private_key: ${{ secrets.HAWKY_APP_PRIVATE_KEY }} - name: Set up git for pushing - if: steps.skip_bumpver.outcome == 'success' run: | git remote set-url origin https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/${{ github.repository }}.git - name: Show current branch and HEAD - if: steps.skip_bumpver.outcome == 'success' run: | git branch -a git status git rev-parse --abbrev-ref HEAD - name: Get version from pyproject.toml - if: steps.skip_bumpver.outcome == 'success' id: get_version run: | VERSION=$(grep '^version =' pyproject.toml | head -1 | cut -d '"' -f2) echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Create and push tag for current version (with verbose logging) - if: steps.skip_bumpver.outcome == 'success' run: | git remote -v git tag v${{ steps.get_version.outputs.version }} @@ -89,47 +90,33 @@ jobs: GIT_TRACE_PACKET=1 GIT_TRACE=1 GIT_CURL_VERBOSE=1 git push origin v${{ steps.get_version.outputs.version }} bump-version: - if: github.ref == 'refs/heads/main' && github.event_name == 'push' - needs: [test, tag-version] + if: needs.check-bumpver.outputs.should_run == 'true' && github.ref == 'refs/heads/main' && github.event_name == 'push' + needs: [test, tag-version, check-bumpver] runs-on: ubuntu-latest steps: - - name: Check for bumpver commit - id: skip_bumpver - run: | - if [[ "${{ github.event.head_commit.message }}" == *"bump: version"* ]]; then - echo "Bumpver commit detected, skipping job." - exit 0 - fi - uses: actions/checkout@v4 - if: steps.skip_bumpver.outcome == 'success' with: persist-credentials: 'false' - name: Generate GitHub App token - if: steps.skip_bumpver.outcome == 'success' id: generate_token uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.HAWKY_APP_ID }} private_key: ${{ secrets.HAWKY_APP_PRIVATE_KEY }} - name: Set up git for pushing - if: steps.skip_bumpver.outcome == 'success' run: | git remote set-url origin https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/${{ github.repository }}.git - name: Install dependencies - if: steps.skip_bumpver.outcome == 'success' run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install . - name: Set git user for HawkyMcBuilderFace bot - if: steps.skip_bumpver.outcome == 'success' run: | git config user.name "HawkyMcBuilderFace[bot]" git config user.email "hawkymcbuilderface[bot]@users.noreply.github.com" - name: Bump patch version with bumpver - if: steps.skip_bumpver.outcome == 'success' run: bumpver update --patch --commit - name: Push version bump commit - if: steps.skip_bumpver.outcome == 'success' run: | git push From e1c2be54a858eb09f4ede190ce931f1786cd2845 Mon Sep 17 00:00:00 2001 From: KC Berg Date: Wed, 9 Jul 2025 07:09:27 -0600 Subject: [PATCH 7/7] prepare-release: use dynamic output skip pattern to prevent workflow loop on bumpver commits --- .github/workflows/prepare-release.yml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index ab13c8b..ef60e1b 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -7,54 +7,55 @@ permissions: contents: write jobs: - bump-minor-version: - name: Bump Minor Version + check-bumpver: runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.check.outputs.should_run }} steps: - name: Check for bumpver commit - id: skip_bumpver + id: check run: | if [[ "${{ github.event.head_commit.message }}" == *"bump: version"* ]]; then - echo "Bumpver commit detected, skipping job." - exit 0 + echo "should_run=false" >> $GITHUB_OUTPUT + else + echo "should_run=true" >> $GITHUB_OUTPUT fi + + bump-minor-version: + name: Bump Minor Version + if: needs.check-bumpver.outputs.should_run == 'true' + needs: check-bumpver + runs-on: ubuntu-latest + steps: - name: Checkout code - if: steps.skip_bumpver.outcome == 'success' uses: actions/checkout@v4 with: ref: main fetch-depth: 0 - name: Set up Python - if: steps.skip_bumpver.outcome == 'success' uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install dependencies - if: steps.skip_bumpver.outcome == 'success' run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install . - name: Generate GitHub App token - if: steps.skip_bumpver.outcome == 'success' id: generate_token uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.HAWKY_APP_ID }} private_key: ${{ secrets.HAWKY_APP_PRIVATE_KEY }} - name: Set up git for pushing - if: steps.skip_bumpver.outcome == 'success' run: | git remote set-url origin https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/${{ github.repository }}.git - name: Set git user for HawkyMcBuilderFace bot - if: steps.skip_bumpver.outcome == 'success' run: | git config user.name "HawkyMcBuilderFace[bot]" git config user.email "hawkymcbuilderface[bot]@users.noreply.github.com" - name: Bump minor version with bumpver - if: steps.skip_bumpver.outcome == 'success' run: bumpver update --minor --commit - name: Push version bump commit - if: steps.skip_bumpver.outcome == 'success' run: | git push origin HEAD:main \ No newline at end of file