From c8fc07e0b284588ef16319e06cdafbb6a965ddaa Mon Sep 17 00:00:00 2001 From: bom Date: Fri, 17 Nov 2023 13:13:34 +0100 Subject: [PATCH] release: 0.28.2 --- build.gradle | 263 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 262 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d638c4d..6e7a4e3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,2 +1,263 @@ +buildscript { + ext.kotlin_version = "1.7.20" + ext.CI_PROJECT_ID = System.env.CI_PROJECT_ID -version = "3.3.3-SNAPSHOT" + repositories { + mavenCentral() + } +} + +plugins { + id "org.jetbrains.kotlin.jvm" version "$kotlin_version" + id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version" + id "java" + id "java-test-fixtures" +} +apply plugin: "maven-publish" + + +version = "0.28.2" +group = "org.domaindrivenarchitecture.provs" + + +repositories { + mavenCentral() +} + + +java { + // https://stackoverflow.com/questions/21904269/configure-gradle-to-publish-sources-and-javadoc + withSourcesJar() + withJavadocJar() + + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } +} + +jar { + duplicatesStrategy(DuplicatesStrategy.EXCLUDE) +} + + +test { + // set properties for the tests + def propertiesForTests = ["testdockerwithoutsudo"] + for (def prop : propertiesForTests) { + def value = System.getProperty(prop) + if (value != null) { + systemProperty prop, value + } + } + + useJUnitPlatform { + def excludedTags = System.getProperty("excludeTags") + if (System.getProperty("excludeTags") != null) { + excludeTags(excludedTags.split(",")) + } + if (System.getenv("CI_JOB_TOKEN") != null) { + excludeTags("containernonci") + } + } +} + +compileJava.options.debugOptions.debugLevel = "source,lines,vars" +compileTestFixturesJava.options.debugOptions.debugLevel = "source,lines,vars" +compileTestJava.options.debugOptions.debugLevel = "source,lines,vars" + + +dependencies { + + api("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version") + api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2") + api("org.jetbrains.kotlinx:kotlinx-serialization-core:1.3.2") + api("org.jetbrains.kotlinx:kotlinx-cli:0.3.4") + + api('com.charleskorn.kaml:kaml:0.54.0') + + api("org.slf4j:slf4j-api:1.7.36") + api('ch.qos.logback:logback-classic:1.2.11') + api('ch.qos.logback:logback-core:1.2.11') + + implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlin_version") + implementation("com.hierynomus:sshj:0.32.0") + + implementation("aws.sdk.kotlin:s3:0.17.1-beta") + + testFixturesApi("org.junit.jupiter:junit-jupiter-api:5.8.2") + testFixturesApi('io.mockk:mockk:1.12.3') + + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2") +} + + +tasks.register('uberjarDesktop', Jar) { + + from sourceSets.main.output + + dependsOn configurations.runtimeClasspath + from { + configurations.runtimeClasspath.findAll { it.name.endsWith("jar") }.collect { zipTree(it) } + } { + duplicatesStrategy(DuplicatesStrategy.EXCLUDE) + exclude "META-INF/*.RSA", "META-INF/*.SF", "META-INF/*.DSA" + } + + manifest { + attributes "Implementation-Title": "Uberjar of provs", + "Implementation-Version": project.version, + "Main-Class": "org.domaindrivenarchitecture.provs.desktop.application.ApplicationKt" + } + archiveFileName = "provs-desktop.jar" +} + + +tasks.register('uberjarServer', Jar) { + + from sourceSets.main.output + + dependsOn configurations.runtimeClasspath + from { + configurations.runtimeClasspath.findAll { it.name.endsWith("jar") }.collect { zipTree(it) } + } { + duplicatesStrategy(DuplicatesStrategy.EXCLUDE) + exclude "META-INF/*.RSA", "META-INF/*.SF", "META-INF/*.DSA" + } + + manifest { + attributes "Implementation-Title": "Uberjar of provs", + "Implementation-Version": project.version, + "Main-Class": "org.domaindrivenarchitecture.provs.server.application.ApplicationKt" + } + archiveFileName = "provs-server.jar" +} + + +tasks.register('uberjarSyspec', Jar) { + + from sourceSets.main.output + + dependsOn configurations.runtimeClasspath + from { + configurations.runtimeClasspath.findAll { it.name.endsWith("jar") }.collect { zipTree(it) } + } { + duplicatesStrategy(DuplicatesStrategy.EXCLUDE) + exclude "META-INF/*.RSA", "META-INF/*.SF", "META-INF/*.DSA" + } + + manifest { + attributes "Implementation-Title": "Uberjar of provs", + "Implementation-Version": project.version, + "Main-Class": "org.domaindrivenarchitecture.provs.syspec.application.ApplicationKt" + } + archiveFileName = "provs-syspec.jar" +} +def projectRoot = rootProject.projectDir + + +// copy jar to /usr/local/bin and make it executable +// Remark: to be able to use it you must have jarwrapper installed (sudo apt install jarwrapper) +tasks.register('installlocally') { + dependsOn(uberjarServer, uberjarDesktop, uberjarSyspec) + doLast { + exec { commandLine("sh", "-c", "sudo apt-get update & sudo apt-get install jarwrapper") } + exec { commandLine("sh", "-c", "sudo cp $projectRoot/build/libs/provs-server.jar /usr/local/bin/") } + exec { commandLine("sh", "-c", "sudo cp $projectRoot/build/libs/provs-desktop.jar /usr/local/bin/") } + exec { commandLine("sh", "-c", "sudo cp $projectRoot/build/libs/provs-syspec.jar /usr/local/bin/") } + exec { commandLine("sh", "-c", "sudo chmod 755 /usr/local/bin/provs-server.jar") } + exec { commandLine("sh", "-c", "sudo chmod 755 /usr/local/bin/provs-desktop.jar") } + exec { commandLine("sh", "-c", "sudo chmod 755 /usr/local/bin/provs-syspec.jar") } + } +} + + +// publish to repo.prod.meissa.de with task "publishLibraryPublicationToMeissaRepository" -- (using pattern "publishLibraryPublicationToRepository") +publishing { + publications { + library(MavenPublication) { + groupId 'org.domaindrivenarchitecture' + artifactId 'provs' + from components.java + } + } + + repositories { + maven { + name = "gitlab" + url = "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/packages/maven" + credentials(HttpHeaderCredentials) { + name = "Job-Token" + value = System.getenv("CI_JOB_TOKEN") + } + authentication { + header(HttpHeaderAuthentication) + } + } + maven { + name = "meissa" + url = uri("https://repo.prod.meissa.de/api/packages/meissa/maven") + + credentials(HttpHeaderCredentials) { + name = "Authorization" + if (System.getenv("CI_JOB_TOKEN") != null) { + def tokenFromEnv = System.getenv("RELEASE_TOKEN") + if (tokenFromEnv == null) { + println "Error: RELEASE_TOKEN not found" + } else { + value = "token " + tokenFromEnv + println "RELEASE_TOKEN found - " + } + } else { + // use project-property (define e.g. in "~/.gradle/gradle.properties") when not running in ci + // you can create a token in gitea "Profile and Settings ... > Settings > Applications", Token Name, Select scopes (write:package) > "Generate Token" + if (!project.hasProperty("RELEASE_TOKEN")) { + // if RELEASE_TOKEN is missing, provide a dummy in order to avoid error "Could not get unknown property 'RELEASE_TOKEN' for Credentials [header: Authorization]" for other gradle tasks + ext.RELEASE_TOKEN = "RELEASE_TOKEN not provided in file \".gradle/gradle.properties\"" + println "Error: RELEASE_TOKEN not found" + } + value = "token $RELEASE_TOKEN" + } + } + + authentication { + header(HttpHeaderAuthentication) + } + } + } +} + + +tasks.register('createReleaseAndUploadAssets') { + dependsOn(uberjarServer, uberjarDesktop, uberjarSyspec) + doLast { + + def token = project.properties.get("RELEASE_TOKEN") ?: System.getenv("RELEASE_TOKEN") + if (token == null) { + throw new GradleException('No token found.') + } + + def output1 = new ByteArrayOutputStream() + exec { + standardOutput = output1 + def TAG = project.version + commandLine("sh", "-c", "curl -X 'POST' 'https://repo.prod.meissa.de/api/v1/repos/meissa/provs/releases' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{ \"body\": \"Provides jar-files for release $TAG\\nAttention: The \\\"Source Code\\\"-files below are not up-to-date!\", \"tag_name\": \"$TAG\" }' -H \"Authorization: token $token\"") + } + + def matches = output1 =~ /\{"id":(\d+?),/ + if (!matches) { + throw new GradleException('id of release could not be parsed in: ' + output1) + } + + def releaseId = matches.group(1) + println "Release=$releaseId" + + def releaseApiUrl = "https://repo.prod.meissa.de/api/v1/repos/meissa/provs/releases" + exec { commandLine("sh", "-c", "find build/libs/ -type f -exec sha256sum {} \\; | sort > build/libs/sha256sum.lst") } + exec { commandLine("sh", "-c", "find build/libs/ -type f -exec sha512sum {} \\; | sort > build/libs/sha512sum.lst") } + exec { commandLine("sh", "-c", "curl -X 'POST' '$releaseApiUrl/$releaseId/assets' -H 'accept: application/json' -H \"Authorization: token $token\" -H 'Content-Type: multipart/form-data' -F 'attachment=@build/libs/provs-desktop.jar;type=application/x-java-archive'") } + exec { commandLine("sh", "-c", "curl -X 'POST' '$releaseApiUrl/$releaseId/assets' -H 'accept: application/json' -H \"Authorization: token $token\" -H 'Content-Type: multipart/form-data' -F 'attachment=@build/libs/provs-server.jar;type=application/x-java-archive'") } + exec { commandLine("sh", "-c", "curl -X 'POST' '$releaseApiUrl/$releaseId/assets' -H 'accept: application/json' -H \"Authorization: token $token\" -H 'Content-Type: multipart/form-data' -F 'attachment=@build/libs/provs-syspec.jar;type=application/x-java-archive'") } + exec { commandLine("sh", "-c", "curl -X 'POST' '$releaseApiUrl/$releaseId/assets' -H 'accept: application/json' -H \"Authorization: token $token\" -H 'Content-Type: multipart/form-data' -F 'attachment=@build/libs/sha256sum.lst;type=text/plain'") } + exec { commandLine("sh", "-c", "curl -X 'POST' '$releaseApiUrl/$releaseId/assets' -H 'accept: application/json' -H \"Authorization: token $token\" -H 'Content-Type: multipart/form-data' -F 'attachment=@build/libs/sha512sum.lst;type=text/plain'") } + } +}