Release #47
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 { | |
| } | |
| ' 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 | |
| } | |
| { | |
| } | |
| ' 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" |