Skip to content

Commit

Permalink
Add Version updater plugin (hivemq#184)
Browse files Browse the repository at this point in the history
  • Loading branch information
DC2-DanielKrueger authored Mar 25, 2024
1 parent 4449f62 commit 26c7163
Show file tree
Hide file tree
Showing 18 changed files with 199 additions and 15 deletions.
25 changes: 23 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
group = "com.hivemq"

plugins {
id("com.hivemq.edge-version-updater")
}

tasks.register("clean") {
group = "build"

Expand Down Expand Up @@ -43,7 +47,6 @@ tasks.register("testClasses") {
dependsOn(it.task(":$name"))
}
}

/* ******************** release tasks ******************** */

val hivemq: Configuration by configurations.creating { isCanBeConsumed = false; isCanBeResolved = false }
Expand Down Expand Up @@ -72,7 +75,7 @@ val moduleReleaseBinaries: Configuration by configurations.creating {

dependencies {
hivemq("com.hivemq:hivemq-edge")
edgeModule("com.hivemq:hivemq-edge-module-http")
edgeModule("com.hivemq:hivemq-edge-module-http")
// ** module-deps ** //
edgeModule("com.hivemq:hivemq-edge-module-plc4x")
edgeModule("com.hivemq:hivemq-edge-module-opcua")
Expand All @@ -95,3 +98,21 @@ val hivemqEdgeZip by tasks.registering(Zip::class) {
}
}

val edgeProjectsToUpdate = setOf(
"hivemq-edge",
"hivemq-edge-module-http",
"hivemq-edge-module-modbus",
"hivemq-edge-module-opcua",
"hivemq-edge-module-plc4x"
)

tasks.register("updateDependantVersions") {
group = "other"
dependsOn(":updateVersion")
edgeProjectsToUpdate.forEach {
dependsOn(gradle.includedBuild(it).task(":updateVersion"))
}
}



33 changes: 33 additions & 0 deletions edge-plugins/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
plugins {
`kotlin-dsl`
}

group = "com.hivemq"

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(8))
}
}

repositories {
mavenCentral()
}

dependencies {
implementation(libs.jackson.dataformat.xml)
}

gradlePlugin {
plugins {
create("edge-version-updater") {
id = "$group.$name"
implementationClass = "$group.versionupdater.VersionUpdaterPlugin"
}
}
}

tasks.withType<AbstractArchiveTask>().configureEach {
isPreserveFileTimestamps = false
isReproducibleFileOrder = true
}
5 changes: 5 additions & 0 deletions edge-plugins/gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[versions]
jackson = "2.14.2"

[libraries]
jackson-dataformat-xml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-xml", version.ref = "jackson" }
1 change: 1 addition & 0 deletions edge-plugins/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
rootProject.name = "edge-plugins"
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.hivemq.versionupdater

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import java.io.File

abstract class UpdateVersionTask : DefaultTask() {

@TaskAction
protected fun run() {
val newVersion = project.version.toString()

// If the new version is not a SNAPSHOT version, we have to update all versions in the extra-files
if ("-SNAPSHOT" !in newVersion) {
var previousPatchVersion = project.properties["prevVersion"]

if (previousPatchVersion == null) {
previousPatchVersion = previousPatchVersion()
}

if (previousPatchVersion == null) {
error("Cannot infer previous version for version ${newVersion}. Please specify it with '-PprevVersion=x.x.x'.")
}

updateExtraFiles(newVersion, previousPatchVersion.toString())
}

updateGradleProperties(newVersion)
}

private fun updateGradleProperties(newVersion: String) {
val gradleProperties = project.file("gradle.properties")
replaceInFile(gradleProperties, """^version=.+""".toRegex(), "version=${newVersion}")
}

private fun updateExtraFiles(newVersion: String, previousVersion: String) {
val filesToUpdate = project.properties[PROPERTIES_FILES_KEY]
if ((filesToUpdate != null) && (filesToUpdate is Array<*>)) {
filesToUpdate.forEach {
val file = project.file(it.toString())
replaceInFile(file, "${previousVersion}(-SNAPSHOT)?".toRegex(), newVersion)
}
}
}

private fun replaceInFile(file: File, find: Regex, replace: String) {
require(file.exists()) { "File ${file.absolutePath} does not exist" }
require(file.isFile) { "File ${file.absolutePath} is not a file" }

val text = file.readText()
val replacedText = text.replace(find, replace)
file.writeText(replacedText)
}

private fun previousPatchVersion(): String? {
val currentVersion = project.version.toString()
val patchVersion = currentVersion.substringAfterLast('.').toInt()

return if (patchVersion == 0) {
null
} else {
currentVersion.substringBefore('.') + // Major version
".${currentVersion.substringAfter('.').substringBefore('.')}." + // Minor version
(patchVersion - 1)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.hivemq.versionupdater

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.*

class VersionUpdaterPlugin : Plugin<Project> {

override fun apply(project: Project) {
project.tasks.register<UpdateVersionTask>(UPDATE_VERSION_TASK_NAME)
}
}

const val UPDATE_VERSION_TASK_NAME: String = "updateVersion"
const val PROPERTIES_FILES_KEY = "versionUpdaterFiles"
19 changes: 10 additions & 9 deletions ext/release-process.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ Step 2 - Ensure you checkout the release branch locally (master for now) and pul
Step 3 - Ensure you dev environment is clean
Step 4 - Run hivemq-edge/hivemq-edge/src/test functional tests - - if <> green follow test failure procedure. - This process will take approximately 1-2 minutes
Step 5 - Ensure hivemq-edge-test/ is up to date and run integration test suite - This process will take approximately 18-19 minutes - if <> green follow test failure procedure
Step 6 - Update "version" property in hivemq-edge/gradle.properties
Step 7 - Update "version" property in hivemq-edge/hivemq-edge/gradle.properties
Step 8 - Update "hivemq-edge-extension-sdk.version" property in hivemq-edge/hivemq-edge/gradle.properties
Step 9 - Update "version" property in ~all hivemq-edge/modules/${moduleName}/gradle.properties
Step 10 - Update "version" property in hivemq-edge-composite/gradle.properties
Step 11 - Update "version" property in hivemq-edge-extension-sdk/gradle.properties
Step 12 - Update VERSION field in HiveMQEdgeConstants (this is where the module versions are derived - for now)
Step 13(a) - Ensure any ~new protocol adapter definitions are added to the "modules" array hivemq-edge/src/resources/hivemq-edge-configuration.json remote config file
Step 13(b) - Update all the "version" attributes in each of the objects in the "modules" array in the hivemq-edge/src/resources/hivemq-edge-configuration.json file (this surfaces these modules up to legacy installations)
REMOVE: Step 6 - Update "version" property in hivemq-edge/gradle.properties
REMOVE: Step 7 - Update "version" property in hivemq-edge/hivemq-edge/gradle.properties
REMOVE: Step 8 - Update "hivemq-edge-extension-sdk.version" property in hivemq-edge/hivemq-edge/gradle.properties
REMOVE: Step 9 - Update "version" property in ~all hivemq-edge/modules/${moduleName}/gradle.properties
REMOVE: Step 10 - Update "version" property in hivemq-edge-composite/gradle.properties
REMOVE: Step 11 - Update "version" property in hivemq-edge-extension-sdk/gradle.properties
REMOVE: Step 12 - Update VERSION field in HiveMQEdgeConstants (this is where the module versions are derived - for now)
MOVE BEFORE VERSION UPDATE: Step 13(a) - Ensure any ~new protocol adapter definitions are added to the "modules" array hivemq-edge/src/resources/hivemq-edge-configuration.json remote config file
REPLACE WITH CHECK: Step 13(b) - Update all the "version" attributes in each of the objects in the "modules" array in the hivemq-edge/src/resources/hivemq-edge-configuration.json file (this surfaces these modules up to legacy installations)
ADD: version updater plugin use

Step 14 - Run a full gradle refresh on your workspace (this may take a few seconds)
Step 15 - Execute "./gradlew :hiveMqEdgeZip" at the terminal whilst in the ./hivemq-edge project
Expand Down
8 changes: 8 additions & 0 deletions hivemq-edge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@ import nl.javadude.gradle.plugins.license.DownloadLicensesExtension.license
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent

plugins.withId("com.hivemq.edge-version-updater") {
project.ext.set(
"versionUpdaterFiles",
arrayOf("src/main/resources/hivemq-edge-configuration.json", "gradle.properties")
)
}

plugins {
java
`java-library`
Expand All @@ -22,6 +29,7 @@ plugins {
id("com.github.spotbugs")
id("de.thetaphi.forbiddenapis")
id("io.swagger.core.v3.swagger-gradle-plugin") version "2.2.8"
id("com.hivemq.edge-version-updater")
}

group = "com.hivemq"
Expand Down
7 changes: 5 additions & 2 deletions hivemq-edge/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,12 @@ pluginManagement {
id("com.github.ben-manes.versions") version "${extra["plugin.versions.version"]}"
id("com.github.node-gradle.node") version "${extra["plugin.node.version"]}"
}
includeBuild("../edge-plugins")
}

includeBuild("./src/frontend"){
name="hivemq-edge-frontend"

includeBuild("./src/frontend") {
name = "hivemq-edge-frontend"
}

if (file("../../hivemq-extension-sdk").exists()) {
Expand Down Expand Up @@ -72,3 +74,4 @@ if (file("../../hivemq-edge-extension-sdk").exists()) {
""".trimIndent()
)
}

2 changes: 2 additions & 0 deletions modules/hivemq-edge-module-http/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ import nl.javadude.gradle.plugins.license.DownloadLicensesExtension.license
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent.*


plugins {
id("java")
id("com.github.sgtsilvio.gradle.utf8")
id("com.github.johnrengelman.shadow")
id("com.github.hierynomus.license")
id("org.owasp.dependencycheck")
id("com.hivemq.edge-version-updater")
}

group = "com.hivemq"
Expand Down
2 changes: 2 additions & 0 deletions modules/hivemq-edge-module-http/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ pluginManagement {
id("com.github.hierynomus.license") version "${extra["plugin.license.version"]}"
id("org.owasp.dependencycheck") version "${extra["plugin.dependencycheck.version"]}"
}
includeBuild("../../edge-plugins")
}


includeBuild("../../hivemq-edge")
4 changes: 4 additions & 0 deletions modules/hivemq-edge-module-modbus/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@ import nl.javadude.gradle.plugins.license.DownloadLicensesExtension.license
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent.*


plugins {
id("java")
id("com.github.sgtsilvio.gradle.utf8")
id("com.github.johnrengelman.shadow")
id("com.github.hierynomus.license")
id("org.owasp.dependencycheck")
id("com.hivemq.edge-version-updater")
}



group = "com.hivemq"

java {
Expand Down
3 changes: 3 additions & 0 deletions modules/hivemq-edge-module-modbus/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ pluginManagement {
id("com.github.hierynomus.license") version "${extra["plugin.license.version"]}"
id("org.owasp.dependencycheck") version "${extra["plugin.dependencycheck.version"]}"
}
includeBuild("../../edge-plugins")

}


includeBuild("../../hivemq-edge")
8 changes: 8 additions & 0 deletions modules/hivemq-edge-module-opcua/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@ import nl.javadude.gradle.plugins.license.DownloadLicensesExtension.license
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent.*

buildscript {
if (gradle.includedBuilds.any { it.name == "edge-plugins" }) {
plugins {
id("com.hivemq.edge-version-updater")
}
}
}

plugins {
id("java")
id("com.github.sgtsilvio.gradle.utf8")
Expand Down
2 changes: 2 additions & 0 deletions modules/hivemq-edge-module-opcua/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ pluginManagement {
id("com.github.hierynomus.license") version "${extra["plugin.license.version"]}"
id("org.owasp.dependencycheck") version "${extra["plugin.dependencycheck.version"]}"
}
includeBuild("../../edge-plugins")
}


includeBuild("../../hivemq-edge")
2 changes: 2 additions & 0 deletions modules/hivemq-edge-module-plc4x/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ import nl.javadude.gradle.plugins.license.DownloadLicensesExtension.license
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent.*


plugins {
id("java")
id("com.github.sgtsilvio.gradle.utf8")
id("com.github.johnrengelman.shadow")
id("com.github.hierynomus.license")
id("org.owasp.dependencycheck")
id("com.hivemq.edge-version-updater")
}

group = "com.hivemq"
Expand Down
2 changes: 2 additions & 0 deletions modules/hivemq-edge-module-plc4x/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ pluginManagement {
id("com.github.hierynomus.license") version "${extra["plugin.license.version"]}"
id("org.owasp.dependencycheck") version "${extra["plugin.dependencycheck.version"]}"
}
includeBuild("../../edge-plugins")
}


includeBuild("../../hivemq-edge")
9 changes: 7 additions & 2 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
rootProject.name = "hivemq-edge-build"

pluginManagement {
plugins {
id("com.gradle.enterprise") version "3.12.3"
id("com.gradle.common-custom-user-data-gradle-plugin") version "1.8.2"
includeBuild("./edge-plugins")
}
}
includeBuild("./hivemq-edge")

// ** module-deps ** //
Expand All @@ -10,5 +17,3 @@ includeBuild("./modules/hivemq-edge-module-modbus")
includeBuild("./modules/hivemq-edge-module-opcua")




0 comments on commit 26c7163

Please sign in to comment.