diff --git a/.github/workflows/revision-bump.yml b/.github/workflows/revision-bump.yml index 6e15d75b..a39deccd 100644 --- a/.github/workflows/revision-bump.yml +++ b/.github/workflows/revision-bump.yml @@ -2,28 +2,63 @@ name: Bump build.func Revision on: push: - branches: [ main ] + branches: + - main paths: - - 'misc/*.func' - - 'misc/*.sh' + - "misc/*.func" + - "misc/*.sh" + workflow_dispatch: jobs: bump-revision: + if: github.repository == 'community-scripts/ProxmoxVE' runs-on: ubuntu-latest - if: github.event.head_commit.author.name != 'github-actions[bot]' - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Detect misc changes + permissions: + contents: write + pull-requests: write + + steps: + - name: Generate token for PR + id: generate-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ vars.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + + - name: Generate token for auto-merge + id: generate-token-merge + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }} + private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }} + + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Get changed files id: changes run: | git diff --name-only HEAD^ HEAD > changed_files.txt - echo "changed=$(cat changed_files.txt)" >> $GITHUB_OUTPUT + echo "Changed files:" + cat changed_files.txt - - name: Bump Revision if needed - if: contains(steps.changes.outputs.changed, 'misc/') && !contains(steps.changes.outputs.changed, 'misc/build.func') + - name: Skip if only build.func changed + id: skipcheck + run: | + if grep -q "^misc/build.func$" changed_files.txt && [ $(wc -l < changed_files.txt) -eq 1 ]; then + echo "skip=true" >> $GITHUB_ENV + else + echo "skip=false" >> $GITHUB_ENV + fi + + - name: Disable file mode changes + run: git config core.fileMode false + + - name: Bump build.func revision + if: env.skip == 'false' run: | REV_FILE=".build-revision" if [ ! -f "$REV_FILE" ]; then echo 0 > "$REV_FILE"; fi @@ -31,14 +66,42 @@ jobs: echo $REV_NUM > $REV_FILE SHORT_SHA=$(git rev-parse --short HEAD) REV_STR="Revision: r${REV_NUM} (git-${SHORT_SHA})" + + echo "Updating build.func with $REV_STR" sed -i "s/^# Revision:.*/# $REV_STR/" misc/build.func echo "REV_STR=$REV_STR" >> $GITHUB_ENV - - name: Commit & push revision - if: contains(steps.changes.outputs.changed, 'misc/') && !contains(steps.changes.outputs.changed, 'misc/build.func') - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "GitHub Actions" + git config --global user.email "github-actions[bot]@users.noreply.github.com" git add misc/build.func .build-revision git commit -m "chore: bump build.func to $REV_STR" - git push + + - name: Create PR + if: env.skip == 'false' + run: | + BRANCH_NAME="pr-build-revision-$(date +'%Y%m%d%H%M%S')" + git checkout -b $BRANCH_NAME + git push origin $BRANCH_NAME + + gh pr create --title "[core] bump build.func to $REV_STR" \ + --body "This PR bumps build.func revision because files in misc/ changed." \ + --head $BRANCH_NAME \ + --base main \ + --label "automated pr" + env: + GH_TOKEN: ${{ steps.generate-token.outputs.token }} + + - name: Approve PR and merge + if: env.skip == 'false' + env: + GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }} + run: | + PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number') + if [ -n "$PR_NUMBER" ]; then + gh pr review $PR_NUMBER --approve + gh pr merge $PR_NUMBER --squash --admin + fi + + - name: Skip log + if: env.skip == 'true' + run: echo "Only build.func changed – nothing to do."