Skip to content

Create Release

Create Release #4

Workflow file for this run

name: Create Release
on:
push:
tags:
- '*-v[0-9]*.[0-9]*.[0-9]*'
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Extract package name and version from tag
id: tag
run: |
TAG="${GITHUB_REF_NAME}"
# Tag format: <package>-v<version> (e.g. markopress-v0.1.0)
if [[ ! "$TAG" =~ ^(.+)-v([0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?)$ ]]; then
echo "Invalid tag format: $TAG" >&2
exit 1
fi
PKG_NAME="${BASH_REMATCH[1]}"
VERSION="${BASH_REMATCH[2]}"
IS_PRERELEASE=false
if [[ "$VERSION" == *-* ]]; then
IS_PRERELEASE=true
fi
echo "pkg_name=${PKG_NAME}" >> "$GITHUB_OUTPUT"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
echo "is_prerelease=${IS_PRERELEASE}" >> "$GITHUB_OUTPUT"
- name: Extract changelog entry for this version
id: changelog
run: |
CHANGELOG="packages/${{ steps.tag.outputs.pkg_name }}/CHANGELOG.md"
if [ ! -f "$CHANGELOG" ]; then
echo "body=No changelog found." >> "$GITHUB_OUTPUT"
exit 0
fi
# Extract the section for the released version between ## headings
VERSION="${{ steps.tag.outputs.version }}"
BODY=$(awk -v version="$VERSION" '
$0 ~ ("^## \\[" version "\\]") { found = 1; next }
found && /^## / { exit }
found { print }
' "$CHANGELOG")
if [ -z "$BODY" ]; then
BODY="_No changelog entry found for v${VERSION}._"
fi
# Use a delimiter to preserve multi-line content
{
echo "body<<CHANGELOG_EOF"
echo "$BODY"
echo "CHANGELOG_EOF"
} >> "$GITHUB_OUTPUT"
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: ${{ steps.tag.outputs.pkg_name }} v${{ steps.tag.outputs.version }}
body: ${{ steps.changelog.outputs.body }}
draft: false
prerelease: ${{ steps.tag.outputs.is_prerelease == 'true' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}