Skip to content

Release

Release #47

Workflow file for this run

name: Release
on:
workflow_dispatch:
permissions:
contents: write
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
jobs:
release:
runs-on: ubuntu-latest
environment: Release
steps:
- name: Check out repository
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Java 21
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '21'
- name: Set up Gradle
uses: gradle/actions/setup-gradle@v6
- name: Read mod version
id: version
run: |
version="$(sed -n 's/^mod_version=//p' gradle.properties | head -n 1)"
if [ -z "$version" ]; then
echo "Could not find mod_version in gradle.properties." >&2
exit 1
fi
echo "version=$version" >> "$GITHUB_OUTPUT"
- name: Check whether release already exists
id: release_check
env:
GH_TOKEN: ${{ github.token }}
run: |
if gh release view "v${{ steps.version.outputs.version }}" > /dev/null 2>&1; then
echo "exists=true" >> "$GITHUB_OUTPUT"
else
echo "exists=false" >> "$GITHUB_OUTPUT"
fi
- name: Skip existing release
if: steps.release_check.outputs.exists == 'true'
run: echo "Release v${{ steps.version.outputs.version }} already exists. Skipping."
- name: Extract release metadata for this version
if: steps.release_check.outputs.exists != 'true'
id: release_meta
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
awk -v version="$VERSION" '
$0 ~ "^## \\[" version "\\]" {
in_section = 1
}
/^## \[/ && in_section && $0 !~ "^## \\[" version "\\]" {
exit
}
in_section {
print
}
' CHANGELOG.md > release-section.md
if [ ! -s release-section.md ]; then
echo "Could not find a CHANGELOG.md entry for version $VERSION." >&2
echo "Add a section like: ## [$VERSION] - Release Title" >&2
exit 1
fi
header="$(head -n 1 release-section.md)"
title="$(printf '%s\n' "$header" | sed -n "s/^## \\[$VERSION\\][[:space:]]*-[[:space:]]*//p")"
if printf '%s' "$title" | grep -Eq '^[0-9]{4}-[0-9]{2}-[0-9]{2}$|^[0-9]{2}-[0-9]{2}-[0-9]{4}$|^[0-9]{2}/[0-9]{2}/[0-9]{4}$|^[0-9]{4}/[0-9]{2}/[0-9]{2}$'; then
title=""
fi
if [ -z "$title" ]; then
title="$(sed -n 's/^Title:[[:space:]]*//p' release-section.md | head -n 1)"
fi
if [ -z "$title" ]; then
title="v$VERSION"
fi
echo "title=$title" >> "$GITHUB_OUTPUT"
awk '
BEGIN {
skipped_header = 0
skipped_title = 0
}
/^## \[/ && skipped_header == 0 {
skipped_header = 1
next
}
/^Title:[[:space:]]*/ && skipped_title == 0 {
skipped_title = 1
next
}
{
print
}
' release-section.md > release-notes.md
- name: Build mod
if: steps.release_check.outputs.exists != 'true'
run: ./gradlew build --stacktrace
- name: Create GitHub release
if: steps.release_check.outputs.exists != 'true'
env:
GH_TOKEN: ${{ github.token }}
VERSION: ${{ steps.version.outputs.version }}
run: |
mapfile -t assets < <(
find fabric/build/libs neoforge/build/libs -maxdepth 1 -type f -name '*.jar' \
! -name '*-dev-shadow.jar' \
! -name '*-sources.jar' \
| sort
)
if [ "${#assets[@]}" -eq 0 ]; then
echo "No release jars were produced." >&2
exit 1
fi
gh release create "v$VERSION" "${assets[@]}" \
--title "${{ steps.release_meta.outputs.title }}" \
--notes-file release-notes.md \
--target "$GITHUB_SHA"
- name: Publish to Modrinth and CurseForge
if: steps.release_check.outputs.exists != 'true'
env:
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }}
MODRINTH_PROJECT_ID: ${{ vars.MODRINTH_PROJECT_ID }}
CURSEFORGE_PROJECT_ID: ${{ vars.CURSEFORGE_PROJECT_ID }}
CURSEFORGE_PROJECT_SLUG: ${{ vars.CURSEFORGE_PROJECT_SLUG }}
run: |
if [ -z "$MODRINTH_TOKEN" ] || [ -z "$CURSEFORGE_TOKEN" ] || [ -z "$MODRINTH_PROJECT_ID" ] || [ -z "$CURSEFORGE_PROJECT_ID" ]; then
echo "Modrinth/CurseForge credentials or project IDs are missing. Skipping external publishing."
exit 0
fi
./gradlew fabric:publishMods neoforge:publishMods --stacktrace \
-Ppublish_changelog_file=release-notes.md \
-Pmodrinth_project_id="$MODRINTH_PROJECT_ID" \
-Pcurseforge_project_id="$CURSEFORGE_PROJECT_ID" \
-Pcurseforge_project_slug="$CURSEFORGE_PROJECT_SLUG"