From 0badef4ac585ae6e6dba08523d72faeda9fa857a Mon Sep 17 00:00:00 2001 From: Xerus <27jf@web.de> Date: Sat, 28 Sep 2019 16:00:16 +0200 Subject: [PATCH 1/6] chore(gradle): reimagine versioning & releasing --- gradle.properties | 7 +++-- gradle/build.gradle.kts | 65 ++++++++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/gradle.properties b/gradle.properties index e68e3f11f..7685739ad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,4 @@ -gameName = hive -year = 2020 -socha.version = 1.0 +socha.gameName = hive +socha.version.year = 20 +socha.version.minor = 00 +socha.version.patch = 10 diff --git a/gradle/build.gradle.kts b/gradle/build.gradle.kts index 714d0de44..0f2d8ec8b 100644 --- a/gradle/build.gradle.kts +++ b/gradle/build.gradle.kts @@ -10,10 +10,11 @@ plugins { id("org.jetbrains.dokka") version "0.9.17" } -val year: String by project -val gameName: String by project -val game by extra { "${gameName}_$year" } -version = year.substring(2) + "." + property("socha.version") +val gameName = property("socha.gameName") as String +val versions = arrayOf("year", "mimor", "patch").map { property("socha.version.$it").toString().toInt() } +val versionObject = KotlinVersion(versions[0], versions[1], versions[2]) +version = versions.joinToString { it.toString().padStart(2, '0') } +val game by extra { "${gameName}_${versionObject.major}" } println("Current version: $version Game: $game") val deployDir by extra { buildDir.resolve("deploy") } @@ -32,7 +33,7 @@ tasks { dependsOn(":server:run") group = mainGroup } - + val doc by creating(DokkaTask::class) { val includedProjects = arrayOf("sdk", "plugin") mustRunAfter(includedProjects.map { "$it:classes" }) @@ -46,24 +47,36 @@ tasks { classpath = files(sourceSets.map { it.runtimeClasspath }.flatMap { it.files }.filter { it.exists() }) } } - + val deploy by creating { dependsOn(doc) dependOnSubprojects() group = mainGroup - description = "Zips everything up for release into ./build/deploy" + description = "Zips everything up for release into build/deploy/" } - + val release by creating { dependsOn(deploy) group = mainGroup description = "Prepares a new Release by bumping the version and creating a commit and a git tag" doLast { - val v = project.properties["v"]?.toString()?.takeIf { it.count { char -> char == '.' } == 1 } - ?: throw InvalidUserDataException("Die Flag -Pv=\"Version\" wird im Format X.X benötigt") + when { + project.hasProperty("manual") -> {} + project.hasProperty("patch") -> { + + } + project.hasProperty("minor") -> { + + } + } + val v = project.properties["patch"]?.toString() + ?: throw InvalidUserDataException("Gib entweder -Ppatch oder -Pminor an, um die Versionsnummer automatisch zu inkrementieren, oder ändere sie selbst in gradle.properties und gib dann -Pmanual an") + val propsFile = file("gradle.properties") + propsFile.useLines { + it + }.forEach { propsFile.bufferedWriter().appendln(it) } val desc = project.properties["desc"]?.toString() - ?: throw InvalidUserDataException("Die Flag -Pdesc=\"Beschreibung dieser Version\" wird benötigt") - val version = "${year.substring(2)}.$v" + ?: throw InvalidUserDataException("Das Argument -Pdesc=\"Beschreibung dieser Version\" wird benötigt") println("Version: $version") println("Beschreibung: $desc") file("gradle.properties").writeText(file("gradle.properties").readText() @@ -93,15 +106,15 @@ tasks { ===================================================""".trimIndent()) } } - + val maxGameLength = 150L - + val clearTestLogs by creating(Delete::class) { delete(testLogDir) } - + val testGame by creating { - enabled = false + enabled = versionObject.minor > 0 dependsOn(clearTestLogs, ":server:deploy", ":player:deploy") doFirst { testLogDir.mkdirs() @@ -147,9 +160,9 @@ tasks { println("Successfully played a game using the deployed server & client!") } } - + val testTestClient by creating { - enabled = false + enabled = versionObject.minor > 0 dependsOn(clearTestLogs, ":server:deploy") val testClientGames = 3 doFirst { @@ -157,7 +170,7 @@ tasks { val unzipped = testLogDir.resolve("software-challenge-server") unzipped.deleteRecursively() Runtime.getRuntime().exec("unzip software-challenge-server.zip -d $unzipped", null, deployDir).waitFor() - + println("Testing TestClient...") val testClient = ProcessBuilder( project("test-client").tasks.getByName("createScripts").content.split(" ") + @@ -175,12 +188,12 @@ tasks { } } } - + val integrationTest by creating { dependsOn(testGame, testTestClient) group = mainGroup } - + clean { dependOnSubprojects() group = mainGroup @@ -255,13 +268,13 @@ allprojects { project("sdk") { sourceSets.main.get().java.srcDirs("src/framework", "src/server-api") - + dependencies { api(kotlin("stdlib")) api("com.thoughtworks.xstream", "xstream", "1.4.11.1") api("jargs", "jargs", "1.0") api("ch.qos.logback", "logback-classic", "1.2.3") - + implementation("org.hamcrest", "hamcrest-core", "2.1") implementation("net.sf.kxml", "kxml2", "2.3.0") implementation("xmlpull", "xmlpull", "1.1.3.1") @@ -273,14 +286,14 @@ project("plugin") { main.get().java.srcDirs("src/client", "src/server", "src/shared") test.get().java.srcDir("src/test") } - + dependencies { api(project(":sdk")) - + testImplementation("junit", "junit", "4.12") testImplementation("io.kotlintest", "kotlintest-runner-junit5", "3.3.2") } - + tasks.jar.get().archiveBaseName.set(game) } From 45cb71dfc963fc1262de17529bcf48c209cc588c Mon Sep 17 00:00:00 2001 From: Xerus <27jf@web.de> Date: Fri, 11 Oct 2019 11:36:30 +0200 Subject: [PATCH 2/6] chore(gradle): add new release system --- gradle.properties | 8 +++---- gradle/build.gradle.kts | 51 ++++++++++++++--------------------------- 2 files changed, 21 insertions(+), 38 deletions(-) diff --git a/gradle.properties b/gradle.properties index 7685739ad..1fef96475 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -socha.gameName = hive -socha.version.year = 20 -socha.version.minor = 00 -socha.version.patch = 10 +socha.gameName=hive +socha.version.year=20 +socha.version.minor=00 +socha.version.patch=10 diff --git a/gradle/build.gradle.kts b/gradle/build.gradle.kts index 0f2d8ec8b..3fb10ab75 100644 --- a/gradle/build.gradle.kts +++ b/gradle/build.gradle.kts @@ -60,50 +60,33 @@ tasks { group = mainGroup description = "Prepares a new Release by bumping the version and creating a commit and a git tag" doLast { - when { - project.hasProperty("manual") -> {} - project.hasProperty("patch") -> { - - } - project.hasProperty("minor") -> { - - } + val filter: (String) -> String = when { + project.hasProperty("manual") -> ({ it }) + project.hasProperty("minor") -> ({ + if(it.startsWith("socha.version.minor")) + "socha.version.minor=${versionObject.minor.toString().padStart(2, '0')}" + else it + }) + project.hasProperty("patch") -> ({ + if(it.startsWith("socha.version.patch")) + "socha.version.patch=${versionObject.patch.toString().padStart(2, '0')}" + else it + }) + else -> throw InvalidUserDataException("Gib entweder -Ppatch oder -Pminor an, um die Versionsnummer automatisch zu inkrementieren, oder ändere sie selbst in gradle.properties und gib dann -Pmanual an!") } - val v = project.properties["patch"]?.toString() - ?: throw InvalidUserDataException("Gib entweder -Ppatch oder -Pminor an, um die Versionsnummer automatisch zu inkrementieren, oder ändere sie selbst in gradle.properties und gib dann -Pmanual an") val propsFile = file("gradle.properties") - propsFile.useLines { - it - }.forEach { propsFile.bufferedWriter().appendln(it) } + propsFile.readLines().forEach { + propsFile.bufferedWriter().appendln(filter(it)) + } + val desc = project.properties["desc"]?.toString() ?: throw InvalidUserDataException("Das Argument -Pdesc=\"Beschreibung dieser Version\" wird benötigt") println("Version: $version") println("Beschreibung: $desc") - file("gradle.properties").writeText(file("gradle.properties").readText() - .replace(Regex("socha.version.*"), "socha.version = $v")) exec { commandLine("git", "add", "gradle.properties") } exec { commandLine("git", "commit", "-m", version, "--no-verify") } exec { commandLine("git", "tag", version, "-m", desc) } exec { commandLine("git", "push", "--follow-tags") } - println(""" - =================================================== - Fertig! Jetzt noch folgende Schritte ausfuehren: - - 1. Ein Release für die GUI erstellen - - 2. Auf der Wettkampfseite (http://contest.software-challenge.de) was unter Aktuelles schreiben: - - Eine neue Version der Software ist verfügbar: $desc - Dafür gibt es einen neuen Server und Simpleclient im [Download-Bereich der Website][1]. - - [1]: http://www.software-challenge.de/downloads/ - - 3. Etwas im Discord-Server in #news schreiben: - Good news @everyone! Neue Version der Software: http://www.software-challenge.de/downloads/ - Highlights: $desc - - Siehe auch https://www.notion.so/softwarechallenge/Creating-a-Release-1732217fb0234469b3d5653436f357db - ===================================================""".trimIndent()) } } From a482f3dc6cf05fe90e6d60e5cb663f2ce53e87dd Mon Sep 17 00:00:00 2001 From: Xerus <27jf@web.de> Date: Fri, 11 Oct 2019 12:19:17 +0200 Subject: [PATCH 3/6] chore(gradle): fix extra properties --- gradle/build.gradle.kts | 15 ++++++++------- player/build.gradle.kts | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/gradle/build.gradle.kts b/gradle/build.gradle.kts index 3fb10ab75..b55765e36 100644 --- a/gradle/build.gradle.kts +++ b/gradle/build.gradle.kts @@ -10,11 +10,12 @@ plugins { id("org.jetbrains.dokka") version "0.9.17" } -val gameName = property("socha.gameName") as String -val versions = arrayOf("year", "mimor", "patch").map { property("socha.version.$it").toString().toInt() } +val gameName by extra { property("socha.gameName") as String } +val versions = arrayOf("year", "minor", "patch").map { property("socha.version.$it").toString().toInt() } val versionObject = KotlinVersion(versions[0], versions[1], versions[2]) -version = versions.joinToString { it.toString().padStart(2, '0') } -val game by extra { "${gameName}_${versionObject.major}" } +version = versions.joinToString(".") { it.toString().padStart(2, '0') } +val year by extra { "20${versionObject.major}" } +val game by extra { "${gameName}_$year" } println("Current version: $version Game: $game") val deployDir by extra { buildDir.resolve("deploy") } @@ -97,7 +98,6 @@ tasks { } val testGame by creating { - enabled = versionObject.minor > 0 dependsOn(clearTestLogs, ":server:deploy", ":player:deploy") doFirst { testLogDir.mkdirs() @@ -145,7 +145,6 @@ tasks { } val testTestClient by creating { - enabled = versionObject.minor > 0 dependsOn(clearTestLogs, ":server:deploy") val testClientGames = 3 doFirst { @@ -173,7 +172,9 @@ tasks { } val integrationTest by creating { - dependsOn(testGame, testTestClient) + enabled = versionObject.minor > 0 + if(enabled) + dependsOn(testGame, testTestClient) group = mainGroup } diff --git a/player/build.gradle.kts b/player/build.gradle.kts index 0b47815da..17427639a 100644 --- a/player/build.gradle.kts +++ b/player/build.gradle.kts @@ -8,6 +8,7 @@ val year: String by project val gameName: String by project val deployDir: File by project val testLogDir: File by project +val version = rootProject.version.toString() sourceSets.main { java.srcDir("src") @@ -35,7 +36,7 @@ tasks { with(copySpec { from("buildscripts") filter { - it.replace("VERSION", rootProject.version.toString()).replace("GAME", game).replace("YEAR", year) + it.replace("VERSION", version).replace("GAME", game).replace("YEAR", year) } }, copySpec { from(rootDir.resolve("gradlew"), rootDir.resolve("gradlew.bat")) From e405501471ec0dca644e4ddc85f44f3ade056aaf Mon Sep 17 00:00:00 2001 From: Xerus <27jf@web.de> Date: Fri, 11 Oct 2019 12:23:46 +0200 Subject: [PATCH 4/6] chore(gradle): remove version padding --- gradle/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/build.gradle.kts b/gradle/build.gradle.kts index b55765e36..a3baee91f 100644 --- a/gradle/build.gradle.kts +++ b/gradle/build.gradle.kts @@ -13,7 +13,7 @@ plugins { val gameName by extra { property("socha.gameName") as String } val versions = arrayOf("year", "minor", "patch").map { property("socha.version.$it").toString().toInt() } val versionObject = KotlinVersion(versions[0], versions[1], versions[2]) -version = versions.joinToString(".") { it.toString().padStart(2, '0') } +version = versions.joinToString(".") { it.toString() } val year by extra { "20${versionObject.major}" } val game by extra { "${gameName}_$year" } println("Current version: $version Game: $game") From 4cf6b51708e2f61800df7464d15cf7aa691dfaa5 Mon Sep 17 00:00:00 2001 From: Xerus <27jf@web.de> Date: Fri, 11 Oct 2019 12:50:06 +0200 Subject: [PATCH 5/6] chore(gradle): improve release automation --- gradle/build.gradle.kts | 33 +++++++++++++++++++-------------- player/build.gradle.kts | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/gradle/build.gradle.kts b/gradle/build.gradle.kts index a3baee91f..4d30d6893 100644 --- a/gradle/build.gradle.kts +++ b/gradle/build.gradle.kts @@ -61,32 +61,37 @@ tasks { group = mainGroup description = "Prepares a new Release by bumping the version and creating a commit and a git tag" doLast { + fun edit(original: String, version: String, new: Int) = + if(original.startsWith("socha.version.$version")) + "socha.version.$version=${new.toString().padStart(2, '0')}" + else original + + var newVersion = version val filter: (String) -> String = when { project.hasProperty("manual") -> ({ it }) project.hasProperty("minor") -> ({ - if(it.startsWith("socha.version.minor")) - "socha.version.minor=${versionObject.minor.toString().padStart(2, '0')}" - else it + newVersion = "${versionObject.major}.${versionObject.minor + 1}.0" + edit(edit(it, "minor", versionObject.minor + 1), "patch", 0) }) project.hasProperty("patch") -> ({ - if(it.startsWith("socha.version.patch")) - "socha.version.patch=${versionObject.patch.toString().padStart(2, '0')}" - else it + newVersion = "${versionObject.major}.${versionObject.minor}.${versionObject.patch + 1}" + edit(it, "patch", versionObject.patch + 1) }) else -> throw InvalidUserDataException("Gib entweder -Ppatch oder -Pminor an, um die Versionsnummer automatisch zu inkrementieren, oder ändere sie selbst in gradle.properties und gib dann -Pmanual an!") } - val propsFile = file("gradle.properties") - propsFile.readLines().forEach { - propsFile.bufferedWriter().appendln(filter(it)) - } - val desc = project.properties["desc"]?.toString() ?: throw InvalidUserDataException("Das Argument -Pdesc=\"Beschreibung dieser Version\" wird benötigt") - println("Version: $version") + + val propsFile = file("gradle.properties") + propsFile.writeText( + propsFile.readLines().joinToString("\n") { filter(it) } + ) + + println("Version: $newVersion") println("Beschreibung: $desc") exec { commandLine("git", "add", "gradle.properties") } - exec { commandLine("git", "commit", "-m", version, "--no-verify") } - exec { commandLine("git", "tag", version, "-m", desc) } + exec { commandLine("git", "commit", "-m", newVersion, "--no-verify") } + exec { commandLine("git", "tag", newVersion, "-m", desc) } exec { commandLine("git", "push", "--follow-tags") } } } diff --git a/player/build.gradle.kts b/player/build.gradle.kts index 17427639a..c30eb0208 100644 --- a/player/build.gradle.kts +++ b/player/build.gradle.kts @@ -90,7 +90,7 @@ tasks { into(execDir) } val command = arrayListOf("./gradlew", "shadowJar", "--quiet") - if(System.getenv("CI") != "true") + if(System.getenv("CI") == "true") command.add("--offline") testLogDir.mkdirs() val process = ProcessBuilder(command).directory(execDir) From d1e46dea28a0320d2512025b749f4cf138bb87fb Mon Sep 17 00:00:00 2001 From: Xerus <27jf@web.de> Date: Fri, 18 Oct 2019 14:58:52 +0200 Subject: [PATCH 6/6] chore(travis): fix deployment --- .travis.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index d3e3a90da..cb2fddf63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,13 +20,14 @@ script: - ./gradlew build || (exitcode=$?; find build/tests -type f | while read f; do echo -e "\033[4m$f\033[0m"; cat $f; done && return $exitcode) before_deploy: - if $buildNSSC; then - cd .. && - git clone "https://socha-bot:$GH_TOKEN@github.com/CAU-Kiel-Tech-Inf/not-so-simple-client.git" && - cd not-so-simple-client && - ./gradlew shadowJar && - cd "$TRAVIS_BUILD_DIR"; - fi + - ./gradlew deploy + - if $buildNSSC; then + cd .. && + git clone "https://socha-bot:$GH_TOKEN@github.com/CAU-Kiel-Tech-Inf/not-so-simple-client.git" && + cd not-so-simple-client && + ./gradlew shadowJar && + cd "$TRAVIS_BUILD_DIR"; + fi deploy: provider: releases