name: Auto Release
on:
pull_request:
types: [closed]
branches: [main]
permissions:
contents: write
jobs:
tag-release:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Determine version bump
id: bump
uses: actions/github-script@v7
with:
script: |
const labels = context.payload.pull_request.labels.map(l => l.name);
let bump = null;
if (labels.includes('major')) bump = 'major';
else if (labels.includes('minor')) bump = 'minor';
else if (labels.includes('patch')) bump = 'patch';
else {
core.info('No version label found, skipping release.');
return;
}
core.setOutput('bump', bump);
- name: Get current version
if: steps.bump.outputs.bump
id: version
run: |
CURRENT=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/')
echo "current=$CURRENT" >> $GITHUB_OUTPUT
- name: Compute next version
if: steps.bump.outputs.bump
id: next
uses: actions/github-script@v7
with:
script: |
const current = '${{ steps.version.outputs.current }}';
const bump = '${{ steps.bump.outputs.bump }}';
const [major, minor, patch] = current.split('.').map(Number);
let next;
if (bump === 'major') next = `${major + 1}.0.0`;
else if (bump === 'minor') next = `${major}.${minor + 1}.0`;
else next = `${major}.${minor}.${patch + 1}`;
core.setOutput('version', next);
core.info(`Bumping ${current} → ${next} (${bump})`);
- name: Create tag
if: steps.bump.outputs.bump
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag -a "v${{ steps.next.outputs.version }}" -m "Release v${{ steps.next.outputs.version }}"
git push origin "v${{ steps.next.outputs.version }}"