From 0632195d8d2258fc5109fa72af024bb79891fde7 Mon Sep 17 00:00:00 2001 From: Griffin Baxter <74513598+GriffinBaxterSeequent@users.noreply.github.com> Date: Mon, 23 Feb 2026 08:46:44 +1300 Subject: [PATCH] Update CHANGELOG.md GitHub action Created an action for automatically updating CHANGELOG.md via GitHub actions. --- .github/scripts/create-verified-commit.js | 65 +++++++++++++++++++++++ .github/workflows/update-changelog.yml | 38 +++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 .github/scripts/create-verified-commit.js create mode 100644 .github/workflows/update-changelog.yml diff --git a/.github/scripts/create-verified-commit.js b/.github/scripts/create-verified-commit.js new file mode 100644 index 00000000..45250778 --- /dev/null +++ b/.github/scripts/create-verified-commit.js @@ -0,0 +1,65 @@ +const fs = require('fs'); +const { execSync } = require('child_process'); + +module.exports = async ({ github, context }) => { + if (!context.commitMessage) { + throw new Error('commitMessage is required in context'); + } + + const headSha = execSync('git rev-parse HEAD').toString().trim(); + + const changedFiles = execSync('git diff --name-only HEAD').toString().trim().split('\n').filter(f => f); + + if (changedFiles.length === 0) { + console.log('No changes to commit'); + return; + } + + const treeData = []; + for (const file of changedFiles) { + const content = fs.readFileSync(file, 'utf8'); + treeData.push({ + path: file, + mode: '100644', + type: 'blob', + content: content + }); + } + + const tree = await github.rest.git.createTree({ + owner: context.repo.owner, + repo: context.repo.repo, + tree: treeData, + base_tree: headSha + }); + + const commit = await github.rest.git.createCommit({ + owner: context.repo.owner, + repo: context.repo.repo, + message: context.commitMessage, + tree: tree.data.sha, + parents: [headSha] + }); + + let targetBranch; + const ref = context.ref || ''; + + if (ref.startsWith('refs/heads/')) { + targetBranch = context.ref.split('/').pop(); + } else { + const repo = await github.rest.repos.get({ + owner: context.repo.owner, + repo: context.repo.repo + }); + targetBranch = repo.data.default_branch; + } + + await github.rest.git.updateRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: `heads/${targetBranch}`, + sha: commit.data.sha + }); + + console.log(`Created verified commit: ${commit.data.sha} on branch ${targetBranch}`); +}; diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml new file mode 100644 index 00000000..1db96ef8 --- /dev/null +++ b/.github/workflows/update-changelog.yml @@ -0,0 +1,38 @@ +name: "Update Changelog" + +on: + release: + types: [released] + +jobs: + update-changelog: + name: Update CHANGELOG.md + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Update Changelog + uses: stefanzweifel/changelog-updater-action@v1 + with: + latest-version: ${{ github.event.release.tag_name }} + release-notes: ${{ github.event.release.body }} + + - name: Check for changes + id: changes + run: | + if [ -n "$(git status --porcelain CHANGELOG.md)" ]; then + echo "has_changes=true" >> $GITHUB_OUTPUT + else + echo "has_changes=false" >> $GITHUB_OUTPUT + fi + + - name: Commit and push changes + if: steps.changes.outputs.has_changes == 'true' + uses: actions/github-script@v8 + with: + script: | + const commitMessage = 'Update CHANGELOG.md'; + const script = require('${{ github.workspace }}/.github/scripts/create-verified-commit.js'); + const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/'); + await script({ github, context: { ...context, commitMessage, repo: { owner, repo } } });