From 6e8ef18d44863ae76f2ab3a6d293ab16b1500b61 Mon Sep 17 00:00:00 2001 From: KoSHeroff Date: Sun, 26 Jul 2026 00:50:38 +0500 Subject: [PATCH] ci: publish releases to CurseForge alongside Modrinth Add CurseForge upload steps mirroring the Modrinth ones. They run only when the CURSEFORGE_ID repo variable is set and are all continue-on-error, so CurseForge never blocks the gated Modrinth release. Requires a CURSEFORGE_TOKEN secret. --- .github/workflows/release.yml | 108 ++++++++++++++++++++++++++++++++++ gradle.properties | 5 +- 2 files changed, 111 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 100d4ea..ed4ecf5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -221,6 +221,114 @@ jobs: changelog: ${{ steps.notes.outputs.body }} files: versions/26.1.2-neoforge/build/libs/!(*-@(dev|sources|javadoc)).jar + # CurseForge — mirrors the Modrinth uploads. Only runs when the CURSEFORGE_ID + # repo variable is set, and never blocks the (gated) Modrinth release: + # every step is continue-on-error. + - name: Publish 1.20.1 Fabric to CurseForge + if: steps.check.outputs.release == 'true' && vars.CURSEFORGE_ID != '' + continue-on-error: true + uses: Kir-Antipov/mc-publish@v3.3 + with: + curseforge-id: ${{ vars.CURSEFORGE_ID }} + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + name: WebGUI ${{ steps.meta.outputs.version }} (1.20.1 Fabric) + version: ${{ steps.meta.outputs.version }}+mc1.20.1-fabric + version-type: release + loaders: fabric + game-versions: '1.20.1' + changelog: ${{ steps.notes.outputs.body }} + files: versions/1.20.1-fabric/build/libs/!(*-@(dev|sources|javadoc)).jar + + - name: Publish 1.21.1 Fabric to CurseForge + if: steps.check.outputs.release == 'true' && vars.CURSEFORGE_ID != '' + continue-on-error: true + uses: Kir-Antipov/mc-publish@v3.3 + with: + curseforge-id: ${{ vars.CURSEFORGE_ID }} + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + name: WebGUI ${{ steps.meta.outputs.version }} (1.21.1 Fabric) + version: ${{ steps.meta.outputs.version }}+mc1.21.1-fabric + version-type: release + loaders: fabric + game-versions: '1.21.1' + changelog: ${{ steps.notes.outputs.body }} + files: versions/1.21.1-fabric/build/libs/!(*-@(dev|sources|javadoc)).jar + + - name: Publish 1.21.11 Fabric to CurseForge + if: steps.check.outputs.release == 'true' && vars.CURSEFORGE_ID != '' + continue-on-error: true + uses: Kir-Antipov/mc-publish@v3.3 + with: + curseforge-id: ${{ vars.CURSEFORGE_ID }} + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + name: WebGUI ${{ steps.meta.outputs.version }} (1.21.11 Fabric) + version: ${{ steps.meta.outputs.version }}+mc1.21.11-fabric + version-type: release + loaders: fabric + game-versions: '1.21.11' + changelog: ${{ steps.notes.outputs.body }} + files: versions/1.21.11-fabric/build/libs/!(*-@(dev|sources|javadoc)).jar + + - name: Publish 1.21.1 NeoForge to CurseForge + if: steps.check.outputs.release == 'true' && vars.CURSEFORGE_ID != '' + continue-on-error: true + uses: Kir-Antipov/mc-publish@v3.3 + with: + curseforge-id: ${{ vars.CURSEFORGE_ID }} + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + name: WebGUI ${{ steps.meta.outputs.version }} (1.21.1 NeoForge) + version: ${{ steps.meta.outputs.version }}+mc1.21.1-neoforge + version-type: release + loaders: neoforge + game-versions: '1.21.1' + changelog: ${{ steps.notes.outputs.body }} + files: versions/1.21.1-neoforge/build/libs/!(*-@(dev|sources|javadoc)).jar + + - name: Publish 1.21.11 NeoForge to CurseForge + if: steps.check.outputs.release == 'true' && vars.CURSEFORGE_ID != '' + continue-on-error: true + uses: Kir-Antipov/mc-publish@v3.3 + with: + curseforge-id: ${{ vars.CURSEFORGE_ID }} + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + name: WebGUI ${{ steps.meta.outputs.version }} (1.21.11 NeoForge) + version: ${{ steps.meta.outputs.version }}+mc1.21.11-neoforge + version-type: release + loaders: neoforge + game-versions: '1.21.11' + changelog: ${{ steps.notes.outputs.body }} + files: versions/1.21.11-neoforge/build/libs/!(*-@(dev|sources|javadoc)).jar + + - name: Publish 26.2 NeoForge to CurseForge (beta) + if: steps.check.outputs.release == 'true' && vars.CURSEFORGE_ID != '' + continue-on-error: true + uses: Kir-Antipov/mc-publish@v3.3 + with: + curseforge-id: ${{ vars.CURSEFORGE_ID }} + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + name: WebGUI ${{ steps.meta.outputs.version }} (26.2 NeoForge, beta) + version: ${{ steps.meta.outputs.version }}+mc26.2-neoforge + version-type: beta + loaders: neoforge + game-versions: '26.2' + changelog: ${{ steps.notes.outputs.body }} + files: versions/26.2-neoforge/build/libs/!(*-@(dev|sources|javadoc)).jar + + - name: Publish 26.1.2 NeoForge to CurseForge (beta) + if: steps.check.outputs.release == 'true' && vars.CURSEFORGE_ID != '' + continue-on-error: true + uses: Kir-Antipov/mc-publish@v3.3 + with: + curseforge-id: ${{ vars.CURSEFORGE_ID }} + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + name: WebGUI ${{ steps.meta.outputs.version }} (26.1.2 NeoForge, beta) + version: ${{ steps.meta.outputs.version }}+mc26.1.2-neoforge + version-type: beta + loaders: neoforge + game-versions: '26.1.2' + changelog: ${{ steps.notes.outputs.body }} + files: versions/26.1.2-neoforge/build/libs/!(*-@(dev|sources|javadoc)).jar + # mc-publish can report success without actually creating a version (e.g. # a token lacking the "Create versions" scope). Confirm every version is # really on Modrinth so a green run can't lie. diff --git a/gradle.properties b/gradle.properties index 11e6c56..6627fba 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,7 @@ mod_version=1.6.0 maven_group=land.webgui archives_base_name=webgui -# Publishing — fill in your project IDs (or set via CI secrets) +# Publishing. Modrinth id is hard-coded in the release workflow. +# CurseForge publishing activates when the CURSEFORGE_ID repo variable and the +# CURSEFORGE_TOKEN repo secret are set (Settings → Secrets and variables → Actions). MODRINTH_PROJECT_ID=tDw1xQja -# CURSEFORGE_PROJECT_ID=