Skip to content

Commit 6d6ce0d

Browse files
committed
build: Git-based versioning and simplified release workflow
- Version now derived from git tags automatically (no manual updates) - Local dev builds show: {tag}-SNAPSHOT-dirty - CI branch builds show: {tag}-SNAPSHOT - CI release builds show: exact tag version (e.g., 0.8.0) Release workflow simplified: - Create release in GitHub UI with tag (e.g., 0.8.0) - CI automatically builds and uploads artifacts to the release - Branch pushes create/update latest-prerelease
1 parent 4b026ae commit 6d6ce0d

3 files changed

Lines changed: 138 additions & 68 deletions

File tree

.github/workflows/release.yml

Lines changed: 46 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,77 @@
1-
name: release
1+
name: Release
22

33
on:
4+
# Trigger on GitHub UI release creation
5+
release:
6+
types: [published]
7+
# Trigger on branch push for pre-releases
48
push:
5-
branches: [ connect ]
6-
tags: [ "*.*.*" ]
9+
branches: [connect]
710

811
jobs:
9-
1012
build:
1113
runs-on: ubuntu-latest
1214
permissions:
1315
contents: write
14-
env:
15-
RELEASE_DIR: release
16-
LATEST_RELEASE_DIR: latest/release
17-
LATEST_PRERELEASE_DIR: latest/prerelease
1816
steps:
19-
- uses: actions/checkout@v3
17+
- uses: actions/checkout@v4
18+
with:
19+
fetch-depth: 0 # Fetch all history for git describe
2020

2121
- name: Set up JDK 17
22-
uses: actions/setup-java@v3
22+
uses: actions/setup-java@v4
2323
with:
2424
distribution: 'temurin'
2525
java-version: '17'
26+
cache: 'gradle'
2627

2728
- name: Setup Gradle
28-
uses: gradle/gradle-build-action@v2
29+
uses: gradle/actions/setup-gradle@v3
2930

30-
- name: Build with Maven
31+
- name: Build
3132
run: ./gradlew build
3233

33-
- name: Rename JARs for Latest Pre-Release
34-
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
34+
- name: Get version
35+
id: version
3536
run: |
36-
mkdir -p ${LATEST_PRERELEASE_DIR}
37-
cp spigot/build/libs/connect-spigot.jar ${LATEST_PRERELEASE_DIR}/connect-spigot-prerelease.jar
38-
cp velocity/build/libs/connect-velocity.jar ${LATEST_PRERELEASE_DIR}/connect-velocity-prerelease.jar
39-
cp bungee/build/libs/connect-bungee.jar ${LATEST_PRERELEASE_DIR}/connect-bungee-prerelease.jar
37+
VERSION=$(./gradlew properties -q | grep "^version:" | awk '{print $2}')
38+
echo "version=$VERSION" >> $GITHUB_OUTPUT
39+
echo "Building version: $VERSION"
4040
41-
- name: Rename JARs for Latest Release
42-
if: startsWith(github.ref, 'refs/tags/')
43-
run: |
44-
mkdir -p ${LATEST_RELEASE_DIR}
45-
cp spigot/build/libs/connect-spigot.jar ${LATEST_RELEASE_DIR}/connect-spigot.jar
46-
cp velocity/build/libs/connect-velocity.jar ${LATEST_RELEASE_DIR}/connect-velocity.jar
47-
cp bungee/build/libs/connect-bungee.jar ${LATEST_RELEASE_DIR}/connect-bungee.jar
41+
# For release events: upload artifacts to the release
42+
- name: Upload Release Artifacts
43+
if: github.event_name == 'release'
44+
uses: softprops/action-gh-release@v1
45+
with:
46+
files: |
47+
spigot/build/libs/connect-spigot.jar
48+
velocity/build/libs/connect-velocity.jar
49+
bungee/build/libs/connect-bungee.jar
50+
LICENSE
4851
49-
- name: Rename JARs for Release
50-
if: startsWith(github.ref, 'refs/tags/')
52+
# For branch push: create/update pre-release
53+
- name: Prepare Pre-Release Artifacts
54+
if: github.event_name == 'push'
5155
run: |
52-
mkdir -p ${RELEASE_DIR}
53-
REF=${GITHUB_REF##*/}
54-
cp spigot/build/libs/connect-spigot.jar ${RELEASE_DIR}/connect-spigot-${REF}.jar
55-
cp velocity/build/libs/connect-velocity.jar ${RELEASE_DIR}/connect-velocity-${REF}.jar
56-
cp bungee/build/libs/connect-bungee.jar ${RELEASE_DIR}/connect-bungee-${REF}.jar
56+
mkdir -p prerelease
57+
cp spigot/build/libs/connect-spigot.jar prerelease/connect-spigot-prerelease.jar
58+
cp velocity/build/libs/connect-velocity.jar prerelease/connect-velocity-prerelease.jar
59+
cp bungee/build/libs/connect-bungee.jar prerelease/connect-bungee-prerelease.jar
5760
58-
- name: Latest Pre Release
59-
uses: marvinpinto/action-automatic-releases@latest
60-
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
61+
- name: Update Pre-Release
62+
if: github.event_name == 'push'
63+
uses: softprops/action-gh-release@v1
6164
with:
62-
repo_token: ${{ secrets.GH_TOKEN }}
63-
automatic_release_tag: latest-prerelease
65+
tag_name: latest-prerelease
66+
name: "Latest Pre-Release (${{ steps.version.outputs.version }})"
6467
prerelease: true
65-
title: Latest Pre-Release
6668
files: |
67-
latest/prerelease/*.jar
69+
prerelease/*.jar
6870
LICENSE
71+
body: |
72+
Automated pre-release build from `connect` branch.
6973
70-
- name: Latest Release
71-
uses: marvinpinto/action-automatic-releases@latest
72-
if: startsWith(github.ref, 'refs/tags/')
73-
with:
74-
repo_token: ${{ secrets.GH_TOKEN }}
75-
automatic_release_tag: latest
76-
prerelease: false
77-
title: Latest Release
78-
files: |
79-
latest/release/*.jar
80-
LICENSE
74+
**Version:** ${{ steps.version.outputs.version }}
75+
**Commit:** ${{ github.sha }}
8176
82-
- name: Release version
83-
uses: marvinpinto/action-automatic-releases@latest
84-
if: startsWith(github.ref, 'refs/tags/')
85-
with:
86-
repo_token: ${{ secrets.GH_TOKEN }}
87-
prerelease: false
88-
files: |
89-
release/*.jar
90-
LICENSE
77+
⚠️ This is a development build and may be unstable.

build-logic/src/main/kotlin/extensions.kt

Lines changed: 91 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,99 @@ import net.kyori.indra.git.IndraGitExtension
2727
import org.gradle.api.Project
2828
import org.gradle.api.artifacts.ProjectDependency
2929
import org.gradle.kotlin.dsl.the
30+
import java.io.ByteArrayOutputStream
31+
32+
/**
33+
* Calculates the version from git tags.
34+
* - For tagged commits: returns the tag (e.g., "0.7.0")
35+
* - For non-tagged commits: returns "{last-tag}-SNAPSHOT" (e.g., "0.7.0-SNAPSHOT")
36+
* - For dirty working tree: appends "-dirty"
37+
*/
38+
fun Project.gitVersion(): String {
39+
// Check if GITHUB_REF_TYPE is "tag" - if so, use the tag name directly
40+
val refType = System.getenv("GITHUB_REF_TYPE")
41+
val refName = System.getenv("GITHUB_REF_NAME")
42+
if (refType == "tag" && !refName.isNullOrEmpty()) {
43+
return refName.removePrefix("v")
44+
}
45+
46+
// Try to get version from git describe
47+
return try {
48+
val stdout = ByteArrayOutputStream()
49+
exec {
50+
commandLine("git", "describe", "--tags", "--always", "--dirty")
51+
standardOutput = stdout
52+
isIgnoreExitValue = true
53+
}
54+
val describe = stdout.toString().trim()
55+
56+
if (describe.isEmpty()) {
57+
"0.0.0-SNAPSHOT"
58+
} else {
59+
parseGitDescribe(describe)
60+
}
61+
} catch (e: Exception) {
62+
"0.0.0-SNAPSHOT"
63+
}
64+
}
65+
66+
/**
67+
* Parses git describe output into a version string.
68+
* Examples:
69+
* - "0.7.0" -> "0.7.0" (exactly on tag)
70+
* - "v0.7.0" -> "0.7.0" (exactly on tag with v prefix)
71+
* - "0.7.0-5-gabcdef" -> "0.7.0-SNAPSHOT" (5 commits after tag)
72+
* - "0.7.0-5-gabcdef-dirty" -> "0.7.0-SNAPSHOT-dirty" (with uncommitted changes)
73+
* - "abcdef" -> "0.0.0-SNAPSHOT" (no tags, just commit hash)
74+
* - "abcdef-dirty" -> "0.0.0-SNAPSHOT-dirty"
75+
*/
76+
private fun parseGitDescribe(describe: String): String {
77+
val isDirty = describe.endsWith("-dirty")
78+
val cleanDescribe = describe.removeSuffix("-dirty")
79+
80+
// Pattern: tag-commits-hash or just tag or just hash
81+
val parts = cleanDescribe.split("-")
82+
83+
val version = when {
84+
// Just a hash (no tags exist)
85+
parts.size == 1 && parts[0].matches(Regex("[a-f0-9]+")) -> "0.0.0-SNAPSHOT"
86+
// Exactly on a tag: "0.7.0" or "v0.7.0"
87+
parts.size == 1 -> parts[0].removePrefix("v")
88+
// Tag with v prefix split: "v0", "7", "0" - rejoin
89+
parts[0] == "v" || parts[0].startsWith("v") -> {
90+
// Check if this looks like a versioned tag with commits after
91+
if (parts.size >= 3 && parts[parts.size - 1].startsWith("g")) {
92+
// Has commits after tag: "v0.7.0-5-gabcdef" or "0.7.0-5-gabcdef"
93+
val tagParts = parts.dropLast(2) // Remove commit count and hash
94+
tagParts.joinToString("-").removePrefix("v") + "-SNAPSHOT"
95+
} else {
96+
// Just the tag, possibly with dashes in it
97+
cleanDescribe.removePrefix("v")
98+
}
99+
}
100+
// Tag-commits-hash format: "0.7.0-5-gabcdef"
101+
parts.size >= 3 && parts[parts.size - 1].startsWith("g") -> {
102+
val tagParts = parts.dropLast(2)
103+
tagParts.joinToString("-").removePrefix("v") + "-SNAPSHOT"
104+
}
105+
// Some other format, use as-is
106+
else -> cleanDescribe.removePrefix("v")
107+
}
108+
109+
return if (isDirty) "$version-dirty" else version
110+
}
30111

31112
fun Project.isSnapshot(): Boolean =
32-
version.toString().endsWith("-SNAPSHOT")
113+
version.toString().contains("-SNAPSHOT")
33114

34115
fun Project.fullVersion(): String {
35-
var version = version.toString()
36-
if (version.endsWith("-SNAPSHOT")) {
37-
version += " (b${buildNumberAsString()}-${lastCommitHash()})"
116+
val ver = version.toString()
117+
return if (ver.contains("-SNAPSHOT")) {
118+
val commitHash = lastCommitHash() ?: "unknown"
119+
ver.replace("-SNAPSHOT", "-SNAPSHOT+$commitHash")
120+
} else {
121+
ver
38122
}
39-
return version
40123
}
41124

42125
fun Project.lastCommitHash(): String? =
@@ -45,9 +128,9 @@ fun Project.lastCommitHash(): String? =
45128
// retrieved from https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project
46129
// some properties might be specific to Jenkins
47130
fun Project.branchName(): String =
48-
System.getenv("GIT_BRANCH") ?: "local/dev"
131+
System.getenv("GIT_BRANCH") ?: System.getenv("GITHUB_REF_NAME") ?: "local/dev"
49132
fun Project.buildNumber(): Int =
50-
Integer.parseInt(System.getenv("BUILD_NUMBER") ?: "-1")
133+
Integer.parseInt(System.getenv("BUILD_NUMBER") ?: System.getenv("GITHUB_RUN_NUMBER") ?: "-1")
51134

52135
fun Project.buildNumberAsString(): String =
53136
buildNumber().takeIf { it != -1 }?.toString() ?: "??"
@@ -76,4 +159,4 @@ fun Project.relocate(pattern: String) =
76159
.add(pattern)
77160

78161
private fun calcExclusion(section: String, bit: Int, excludedOn: Int): String =
79-
if (excludedOn and bit > 0) section else ""
162+
if (excludedOn and bit > 0) section else ""

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66

77
allprojects {
88
group = "com.minekube.connect"
9-
version = "0.7.0"
9+
version = gitVersion()
1010
description =
1111
"Connects the server/proxy to the global Connect network to reach more players while also supporting online mode server, bungee or velocity mode. Visit https://minekube.com/connect"
1212
}

0 commit comments

Comments
 (0)