diff --git a/.github/workflows/pr-create.yml b/.github/workflows/pr-create.yml index 4064975..5362186 100644 --- a/.github/workflows/pr-create.yml +++ b/.github/workflows/pr-create.yml @@ -1,12 +1,10 @@ name: Open / Update Version Bump PR -# Triggered by any push to main where src/, debian/ files changed. -# This happens when a feature PR is merged to main. -# Creates a dedicated chore/version-bump branch and opens a PR from it. -# When creating a new PR it assigns the default "bump:patch" label. -# When updating an existing PR the label is NOT changed, preserving any -# manual label change (e.g. bump:minor, bump:major) made by a reviewer. -# The bot guard prevents this from firing on changelog commits. +# Triggered when any PR merges to main touching src/ or debian/. +# Accumulates changes on chore/version-bump branch by appending to CHANGES.md. +# Opens the bump PR if it doesn't exist, updates body if it does. +# Label is never changed on update — preserving manual bump:minor / bump:major. +# Bot guard prevents firing on the changelog commit from version-bump.yml. on: push: @@ -15,7 +13,7 @@ on: paths: - 'src/**' - 'debian/**' - + permissions: contents: write pull-requests: write @@ -31,7 +29,7 @@ jobs: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - - name: Collect src/ commits from merge + - name: Collect src/ commits from this merge id: commits run: | LOG=$(git log "HEAD~1..HEAD" --oneline -- src/ | head -50) @@ -40,29 +38,53 @@ jobs: echo "$LOG" >> "$GITHUB_OUTPUT" echo "$EOF" >> "$GITHUB_OUTPUT" - - name: Create or reset version bump branch + - name: Update chore/version-bump branch + env: + COMMITS: ${{ steps.commits.outputs.log }} run: | - git checkout -B chore/version-bump - git push origin chore/version-bump --force + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + + # Checkout existing bump branch or create it from main + git fetch origin chore/version-bump 2>/dev/null && \ + git checkout chore/version-bump || \ + git checkout -b chore/version-bump + + # Append this merge's changes to the top of CHANGES.md + mkdir -p .github/version-bump + PREV=$(cat .github/version-bump/CHANGES.md 2>/dev/null || true) + { + echo "### Merged at $(date -R)" + echo "${COMMITS:-No src/ changes detected.}" + echo "" + echo "$PREV" + } > .github/version-bump/CHANGES.md + + git add .github/version-bump/CHANGES.md + git commit -m "chore: accumulate changes from $(git rev-parse --short HEAD~1)" + git push origin chore/version-bump + + - name: Build PR body from accumulated changes + run: | + VERSION=$(grep -m1 '(' debian/changelog | sed 's/.*(\(.*\)).*/\1/') + { + echo "## Pending changes for next release (current: v${VERSION})" + echo "" + cat .github/version-bump/CHANGES.md + echo "" + echo "---" + echo "*Change label to \`bump:minor\` or \`bump:major\` before merging if needed.*" + echo "*Default is \`bump:patch\`.*" + echo "*Merge this PR when ready to release.*" + } > /tmp/pr-body.md - name: Create or update version bump PR env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - COMMITS: ${{ steps.commits.outputs.log }} run: | BUMP_BRANCH="chore/version-bump" VERSION=$(grep -m1 '(' debian/changelog | sed 's/.*(\(.*\)).*/\1/') - TITLE="chore: bump pve-mod to v${VERSION}" - - { - echo "## Changes merged to main" - echo "" - echo "${COMMITS:-No src/ changes detected.}" - echo "" - echo "---" - echo "*Apply a bump:minor or bump:major label before merging if needed.*" - echo "*Default label is bump:patch.*" - } > /tmp/pr-body.md + TITLE="chore: release next version (current: v${VERSION})" EXISTING=$(gh pr list \ --head "$BUMP_BRANCH" \ @@ -73,7 +95,7 @@ jobs: gh pr edit "$EXISTING" \ --title "$TITLE" \ --body-file /tmp/pr-body.md - echo "Updated PR #${EXISTING} body and title (label unchanged)" + echo "Updated PR #${EXISTING} (label unchanged)" else gh pr create \ --title "$TITLE" \ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4bcaacd..4c00aad 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: Build and Release # Triggered when debian/changelog changes on main — meaning version-bump.yml # just committed a new version. Builds the .deb and publishes a GitHub Release. -# The actor guard ensures this only fires for the bot's commit, not manual edits. +# The actor guard ensures this only fires for the bot's changelog commit. on: push: @@ -50,25 +50,15 @@ jobs: dpkg-buildpackage -us -uc -b ls -lh ../pve-mod_*.deb - - name: Collect release assets - id: assets - run: | - DEB=$(ls ../pve-mods_${{ steps.version.outputs.version }}.deb) - echo "deb=$DEB" >> "$GITHUB_OUTPUT" - - name: Extract release notes from changelog id: notes run: | - # Pull the top changelog entry (lines between first and second "^pve-mod (") - NOTES=$(awk ' + awk ' /^pve-mod \(/ { if (found) exit; found=1; next } found && /^ --/ { exit } found { print } - ' debian/changelog | grep '^\s*\*' | sed 's/^\s*\* /- /') - EOF=$(dd if=/dev/urandom bs=15 count=1 2>/dev/null | base64) - echo "notes<<$EOF" >> "$GITHUB_OUTPUT" - echo "$NOTES" >> "$GITHUB_OUTPUT" - echo "$EOF" >> "$GITHUB_OUTPUT" + ' debian/changelog | grep '^\s*\*' | sed 's/^\s*\* /- /' > /tmp/notes.md + [[ -s /tmp/notes.md ]] || echo "- Automated release." > /tmp/notes.md - name: Create Git tag env: @@ -79,15 +69,22 @@ jobs: git tag "$TAG" git push origin "$TAG" + - name: Collect release assets + id: assets + run: | + DEB=$(ls ../pve-mod_*.deb) + echo "deb=$DEB" >> "$GITHUB_OUTPUT" + - name: Create GitHub Release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAG: ${{ steps.version.outputs.tag }} - NOTES: ${{ steps.notes.outputs.notes }} - DEB: ${{ steps.assets.outputs.deb }} + TAG: ${{ steps.version.outputs.tag }} + DEB: ${{ steps.assets.outputs.deb }} run: | + ASSETS="$DEB" + [[ -f install.sh ]] && ASSETS="$ASSETS install.sh" + gh release create "$TAG" \ --title "pve-mod $TAG" \ - --notes "$NOTES" \ - "$DEB" \ - "install.sh" + --notes-file /tmp/notes.md \ + $ASSETS \ No newline at end of file diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index e0a38b1..9fde4d3 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -1,9 +1,10 @@ name: Version Bump # Triggered when the chore/version-bump PR is merged to main. -# Reads the bump:patch / bump:minor / bump:major label to determine -# the version increment, updates debian/changelog, and commits it. -# release.yml then picks up the changelog change and builds the release. +# Reads the bump:patch / bump:minor / bump:major label from the merged PR. +# Updates debian/changelog and commits to main. +# Cleans up the CHANGES.md accumulator file in the same commit. +# release.yml picks up the changelog change and builds the release. on: pull_request: @@ -31,7 +32,7 @@ jobs: - name: Determine bump type from PR label id: bump_type env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} PR_NUMBER: ${{ github.event.pull_request.number }} run: | LABELS=$(gh pr view "$PR_NUMBER" --json labels --jq '[.labels[].name] | join(",")') @@ -67,15 +68,11 @@ jobs: echo "current=$CURRENT" >> "$GITHUB_OUTPUT" echo "new=$NEW" >> "$GITHUB_OUTPUT" - - name: Collect src/ commits since last tag + - name: Collect accumulated changes id: commits run: | - LAST_TAG=$(git tag -l 'v*' | sort -V | tail -n1) - if [[ -n "$LAST_TAG" ]]; then - LOG=$(git log "${LAST_TAG}..HEAD" --oneline -- src/ | head -50) - else - LOG=$(git log --oneline -- src/ | head -50) - fi + # Read from the CHANGES.md that was merged in + LOG=$(cat .github/version-bump/CHANGES.md 2>/dev/null || true) EOF=$(openssl rand -hex 16) echo "log<<$EOF" >> "$GITHUB_OUTPUT" echo "$LOG" >> "$GITHUB_OUTPUT" @@ -84,7 +81,7 @@ jobs: - name: Prepend new changelog entry env: NEW_VERSION: ${{ steps.version.outputs.new }} - COMMITS: ${{ steps.commits.outputs.log }} + COMMITS: ${{ steps.commits.outputs.log }} run: | DATE=$(date -R) { @@ -101,12 +98,13 @@ jobs: } > debian/changelog.new mv debian/changelog.new debian/changelog - - name: Commit and push changelog + - name: Commit changelog and clean up accumulator env: NEW_VERSION: ${{ steps.version.outputs.new }} run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add debian/changelog + git rm --ignore-unmatch .github/version-bump/CHANGES.md git commit -m "Release v${NEW_VERSION}" git push \ No newline at end of file