Skip to content

release(shell-bson-parser): 1.5.7 #10

release(shell-bson-parser): 1.5.7

release(shell-bson-parser): 1.5.7 #10

Workflow file for this run

name: Publish Release
on:
push:
branches:
- esm
permissions:
contents: read
jobs:
publish_package:
if: startsWith(github.event.head_commit.message, 'release(')
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
environment: release
steps:
- uses: actions/checkout@v6
- name: Extract package name
id: extract
run: |
COMMIT_MSG="${{ github.event.head_commit.message }}"
# sed will get all between "release(" and "):"
PACKAGE_NAME=$(echo "$COMMIT_MSG" | sed -n 's/^release(\([^)]*\)):.*/\1/p')
if [ -z "$PACKAGE_NAME" ]; then
echo "Missing package name. Expected format: \"release(package-name):\""
exit 1
fi
echo "Package: $PACKAGE_NAME"
echo "package_name=$PACKAGE_NAME" >> $GITHUB_OUTPUT
- name: Install Node
uses: actions/setup-node@v6
with:
node-version: 24
registry-url: 'https://registry.npmjs.org'
- name: Install dependencies & build
working-directory: ./packages/${{ steps.extract.outputs.package_name }}
run: yarn install && yarn build
- name: Create NPM release
working-directory: ./packages/${{ steps.extract.outputs.package_name }}
run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Create GitHub release
uses: actions/github-script@v8
with:
script: |
const { owner, repo } = context.repo
const { data: releases } = await github.rest.repos.listReleases({
owner,
repo
})
const packageName = process.env.PACKAGE_NAME
const version = require(`./packages/${packageName}/package.json`).version
const versionTag = `${packageName}-v${version}`
let releaseNotes = ''
if (releases.length === 0) {
releaseNotes = 'First release!'
} else {
// Get range of commits using the API (from the previous release to the current HEAD)
const { data: comparison } = await github.rest.repos.compareCommits({
owner,
repo,
base: releases[0].tag_name,
head: context.sha
})
const features = []
const fixes = []
const breaking =[]
// Split commits by standard Conventional Commits
for (const { commit, sha } of comparison.commits) {
const firstLine = commit.message.split('\n')[0].trim()
const shortSha = sha.substring(0, 7)
const entry = `- ${firstLine} (${shortSha})`
// Breaking Changes "!" before the colon, e.g. "feat!:"
if (/^[a-zA-Z]+(?:\([^)]+\))?!:/.test(firstLine)) {
breaking.push(entry)
}
// Features with prefix "feat:" or "feat(scope):"
else if (/^feat(?:\([^)]+\))?:/.test(firstLine)) {
features.push(entry)
}
// Bug Fixes with prefix "fix:" or "fix(scope):"
else if (/^fix(?:\([^)]+\))?:/.test(firstLine)) {
fixes.push(entry)
}
}
if (breaking.length > 0) releaseNotes += '### Breaking Changes\n' + breaking.join('\n') + '\n\n'
if (features.length > 0) releaseNotes += '### Features\n' + features.join('\n') + '\n\n'
if (fixes.length > 0) releaseNotes += '### Bug Fixes\n' + fixes.join('\n') + '\n\n'
}
const defaultBranch = context.ref.replace('refs/heads/', '')
await github.rest.repos.createRelease({
owner,
repo,
tag_name: versionTag,
target_commitish: defaultBranch,
name: versionTag,
body: releaseNotes.trim()
})
console.log(`Release ${versionTag} created`)