Merge remote-tracking branch 'origin/main' #239
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: Build and Release | |
| on: | |
| push: | |
| branches: | |
| - main | |
| jobs: | |
| build-and-release: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| fetch-tags: true | |
| - name: Check for version in commit message | |
| id: check_version | |
| run: | | |
| COMMIT_MSG=$(git log -1 --pretty=%B) | |
| echo "Commit message: $COMMIT_MSG" | |
| # Check if commit message contains a semver pattern | |
| if [[ $COMMIT_MSG =~ v?([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?) ]]; then | |
| VERSION="${BASH_REMATCH[1]}" | |
| TAG="$VERSION" | |
| echo "Found version: $VERSION" | |
| echo "SHOULD_RELEASE=true" >> $GITHUB_OUTPUT | |
| echo "VERSION=$VERSION" >> $GITHUB_OUTPUT | |
| echo "TAG=$TAG" >> $GITHUB_OUTPUT | |
| # Determine release type | |
| if [[ "$VERSION" == *"-alpha"* ]]; then | |
| echo "RELEASE_TYPE=alpha" >> $GITHUB_OUTPUT | |
| elif [[ "$VERSION" == *"-beta"* ]]; then | |
| echo "RELEASE_TYPE=beta" >> $GITHUB_OUTPUT | |
| else | |
| echo "RELEASE_TYPE=release" >> $GITHUB_OUTPUT | |
| fi | |
| echo "Release type: $RELEASE_TYPE" | |
| else | |
| echo "No version found in commit message" | |
| echo "SHOULD_RELEASE=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Setup JDK 21 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '21' | |
| distribution: 'temurin' | |
| - name: Setup Gradle | |
| uses: gradle/actions/setup-gradle@v4 | |
| - name: Grant execute permission for gradlew | |
| run: chmod +x gradlew | |
| - name: Run Data | |
| run: ./gradlew runData | |
| - name: Build with Gradle | |
| run: ./gradlew build | |
| - name: Get mod info | |
| id: mod_info | |
| run: | | |
| MOD_VERSION=$(sed -n 's/^mod_version=//p' gradle.properties | tr -d ' \r\n') | |
| MC_VERSION=$(sed -n 's/^minecraft_version=//p' gradle.properties | tr -d ' \r\n') | |
| NEO_VERSION=$(sed -n 's/^neo_version=//p' gradle.properties | tr -d ' \r\n') | |
| MOD_ID=$(sed -n 's/^mod_id=//p' gradle.properties | tr -d ' \r\n') | |
| MOD_NAME=$(sed -n 's/^mod_name=//p' gradle.properties | tr -d ' \r\n') | |
| CURSEFORGE_PROJECT_ID=$(sed -n 's/^curseforge_project_id=//p' gradle.properties | tr -d ' \r\n') | |
| MODRINTH_PROJECT_SLUG=$(sed -n 's/^modrinth_project_slug=//p' gradle.properties | tr -d ' \r\n') | |
| echo "Mod version: $MOD_VERSION" | |
| echo "Minecraft version: $MC_VERSION" | |
| echo "NeoForge Build version: $NEO_VERSION" | |
| cat >> $GITHUB_OUTPUT << EOF | |
| MOD_VERSION=${MOD_VERSION} | |
| MC_VERSION=${MC_VERSION} | |
| NEO_VERSION=${NEO_VERSION} | |
| MOD_ID=${MOD_ID} | |
| MOD_NAME=${MOD_NAME} | |
| CURSEFORGE_PROJECT_ID=${CURSEFORGE_PROJECT_ID} | |
| MODRINTH_PROJECT_SLUG=${MODRINTH_PROJECT_SLUG} | |
| EOF | |
| - name: Find built JAR files | |
| id: find_jars | |
| run: | | |
| echo "JAR_PATH=$(find build/libs -name "*.jar" -not -name "*-sources.jar" -not -name "*-javadoc.jar" | head -1)" | |
| echo "JAR_PATH=$(find build/libs -name "*.jar" -not -name "*-sources.jar" -not -name "*-javadoc.jar" | head -1)" >> $GITHUB_OUTPUT | |
| echo "SOURCES_JAR_PATH=$(find build/libs -name "*-sources.jar" | head -1)" | |
| echo "SOURCES_JAR_PATH=$(find build/libs -name "*-sources.jar" | head -1)" >> $GITHUB_OUTPUT | |
| echo "JAVADOC_JAR_PATH=$(find build/libs -name "*-javadoc.jar" | head -1)" | |
| echo "JAVADOC_JAR_PATH=$(find build/libs -name "*-javadoc.jar" | head -1)" >> $GITHUB_OUTPUT | |
| echo "JAR_NAME=$(basename $(find build/libs -name "*.jar" -not -name "*-sources.jar" -not -name "*-javadoc.jar" | head -1))" | |
| echo "JAR_NAME=$(basename $(find build/libs -name "*.jar" -not -name "*-sources.jar" -not -name "*-javadoc.jar" | head -1))" >> $GITHUB_OUTPUT | |
| - name: Get previous tag | |
| id: prev_tag | |
| run: | | |
| # Get the most recent tag (for comparison against current commit) | |
| tag=$(git tag --sort=-creatordate | head -1 || true) | |
| echo "Most recent tag: $tag" | |
| echo "tag=$tag" >> "$GITHUB_OUTPUT" | |
| - name: Get commit log | |
| id: commit_log | |
| run: | | |
| if [ -z "${{ steps.prev_tag.outputs.tag }}" ]; then | |
| echo "log=- First release" >> "$GITHUB_OUTPUT" | |
| else | |
| # Use a temporary file to avoid heredoc delimiter issues | |
| TEMP_LOG=$(mktemp) | |
| git log ${{ steps.prev_tag.outputs.tag }}..HEAD --pretty=format:"- %s (%an)" > "$TEMP_LOG" | |
| # Use unique delimiter with timestamp (capture once to ensure consistency) | |
| DELIMITER="COMMIT_LOG_DELIMITER_$(date +%s)" | |
| echo "log<<$DELIMITER" >> "$GITHUB_OUTPUT" | |
| cat "$TEMP_LOG" >> "$GITHUB_OUTPUT" | |
| echo "" >> "$GITHUB_OUTPUT" | |
| echo "$DELIMITER" >> "$GITHUB_OUTPUT" | |
| rm "$TEMP_LOG" | |
| fi | |
| # Only create tag and release if version was found in commit message | |
| - name: Create tag | |
| if: steps.check_version.outputs.SHOULD_RELEASE == 'true' | |
| run: | | |
| git config --local user.email "action@github.com" | |
| git config --local user.name "GitHub Action" | |
| git tag -a ${{ steps.check_version.outputs.TAG }} -m "Release ${{ steps.check_version.outputs.TAG }}" | |
| git push origin ${{ steps.check_version.outputs.TAG }} | |
| - name: Create Release and Upload JARs | |
| if: steps.check_version.outputs.SHOULD_RELEASE == 'true' | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| tag_name: ${{ steps.check_version.outputs.TAG }} | |
| name: "${{ steps.mod_info.outputs.MOD_NAME }} v${{ steps.check_version.outputs.TAG }}" | |
| body: | | |
| ## ${{ steps.mod_info.outputs.MOD_NAME }} v${{ steps.check_version.outputs.TAG }} | |
| ### Changes | |
| ${{ steps.commit_log.outputs.log }} | |
| ### Build Information | |
| - **Minecraft Version:** ${{ steps.mod_info.outputs.MC_VERSION }} | |
| - **NeoForge Version:** ${{ steps.mod_info.outputs.NEO_VERSION }} | |
| - **Mod Version:** ${{ steps.mod_info.outputs.MOD_VERSION }} | |
| ### Download | |
| Available on [CurseForge](https://www.curseforge.com/minecraft/mc-mods/${{ steps.mod_info.outputs.MOD_ID }}) and below. | |
| draft: false | |
| prerelease: ${{ contains(steps.check_version.outputs.VERSION, '-') }} | |
| files: build/libs/*.jar | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Upload to CurseForge | |
| if: steps.check_version.outputs.SHOULD_RELEASE == 'true' && env.CURSEFORGE_TOKEN != '' | |
| env: | |
| CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} | |
| RELEASE_TYPE: release | |
| CHANGELOG: ${{ github.event.head_commit.message }} | |
| MOD_VERSION: ${{ steps.mod_info.outputs.MOD_VERSION }} | |
| MC_VERSION: ${{ steps.mod_info.outputs.MC_VERSION }} | |
| MOD_ID: ${{ steps.mod_info.outputs.MOD_ID }} | |
| MOD_NAME: ${{ steps.mod_info.outputs.MOD_NAME }} | |
| CURSEFORGE_PROJECT_ID: ${{ steps.mod_info.outputs.CURSEFORGE_PROJECT_ID }} | |
| run: ./gradlew curseforge --no-configuration-cache | |
| - name: Upload to Modrinth | |
| if: steps.check_version.outputs.SHOULD_RELEASE == 'true' && env.MODRINTH_TOKEN != '' | |
| env: | |
| MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} | |
| RELEASE_TYPE: ${{ steps.check_version.outputs.RELEASE_TYPE }} | |
| CHANGELOG: ${{ github.event.head_commit.message }} | |
| MOD_VERSION: ${{ steps.mod_info.outputs.MOD_VERSION }} | |
| MC_VERSION: ${{ steps.mod_info.outputs.MC_VERSION }} | |
| MOD_ID: ${{ steps.mod_info.outputs.MOD_ID }} | |
| MOD_NAME: ${{ steps.mod_info.outputs.MOD_NAME }} | |
| MODRINTH_PROJECT_SLUG: ${{ steps.mod_info.outputs.MODRINTH_PROJECT_SLUG }} | |
| run: ./gradlew modrinth | |
| # Always upload artifacts for every build (even without release) | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: build-artifacts | |
| path: build/libs/*.jar |