Skip to content

Commit

Permalink
PublishingConfiguration.kt
Browse files Browse the repository at this point in the history
  • Loading branch information
nulls committed Jul 27, 2023
1 parent 34c8035 commit 201ba16
Show file tree
Hide file tree
Showing 7 changed files with 249 additions and 8 deletions.
5 changes: 3 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import com.saveourtool.osv4k.buildutils.configureDiktat
import com.saveourtool.osv4k.buildutils.configureVersioning
import com.saveourtool.osv4k.buildutils.createDetektTask

plugins {
Expand All @@ -14,7 +15,7 @@ repositories {
}

// version generation
// configureVersioning()
configureVersioning()
// checks and validations

configureDiktat()
Expand All @@ -38,7 +39,6 @@ kotlin {
api(libs.kotlinx.datetime)
}
}
@Suppress("UNUSED_VARIABLE")
val commonTest by getting {
dependencies {
implementation(kotlin("test"))
Expand All @@ -62,6 +62,7 @@ kotlin {
api(libs.jackson.databind)
}
}
@Suppress("UNUSED_VARIABLE")
val jvmTest by getting {
dependsOn(commonTest)
dependencies {
Expand Down
5 changes: 2 additions & 3 deletions buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ dependencies {
implementation(libs.diktat.gradle.plugin)
implementation(libs.detekt.gradle.plugin)
implementation(libs.kotlin.plugin.serialization)
// implementation("io.github.gradle-nexus:publish-plugin:1.3.0")
implementation("org.ajoberstar.reckon:reckon-gradle:0.13.2")
// implementation("org.ajoberstar.reckon:reckon-gradle:0.18.0")
implementation("io.github.gradle-nexus:publish-plugin:1.3.0")
implementation("org.ajoberstar.reckon:reckon-gradle:0.18.0")
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import org.gradle.kotlin.dsl.withType
fun Project.configureDetekt() {
apply<DetektPlugin>()
configure<DetektExtension> {
config = rootProject.files("detekt.yml")
config.from(rootProject.files("detekt.yml"))
buildUponDefaultConfig = true
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/**
* Configure JaCoCo for code coverage calculation
*/

@file:Suppress("FILE_WILDCARD_IMPORTS")

package com.saveourtool.osv4k.buildutils

import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test
import org.gradle.kotlin.dsl.*
import org.gradle.testing.jacoco.plugins.JacocoPlugin
import org.gradle.testing.jacoco.plugins.JacocoPluginExtension
import org.gradle.testing.jacoco.plugins.JacocoTaskExtension
import org.gradle.testing.jacoco.tasks.JacocoReport
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension

/**
* Calculate code coverage from JVM test executions.
*/
fun Project.configureJacoco() {
apply<JacocoPlugin>()

configure<JacocoPluginExtension> {
toolVersion = "0.8.8"
}

val kotlin: KotlinMultiplatformExtension = extensions.getByType()
val jvmTestTask by tasks.named<Test>("jvmTest") {
configure<JacocoTaskExtension> {
// this is needed to generate jacoco/jvmTest.exec
isEnabled = true
}
}

val configure: JacocoReport.() -> Unit = {
executionData(jvmTestTask.extensions.getByType(JacocoTaskExtension::class.java).destinationFile)
// todo: include platform-specific source sets
additionalSourceDirs(
kotlin.sourceSets["commonMain"].kotlin.sourceDirectories +
kotlin.sourceSets["commonNonJvmMain"].kotlin.sourceDirectories

Check failure

Code scanning / ktlint

[WRONG_INDENTATION] only spaces are allowed for indentation and each indentation should equal to 4 spaces (tabs are not allowed): expected 20 but was 12 Error

[WRONG_INDENTATION] only spaces are allowed for indentation and each indentation should equal to 4 spaces (tabs are not allowed): expected 20 but was 12
)
classDirectories.setFrom(fileTree("$buildDir/classes/kotlin/jvm/main").apply {
exclude("**/*\$\$serializer.class")
})
reports {
xml.required.set(true)
html.required.set(true)
}
}

// `application` plugin creates jacocoTestReport task in plugin section (this is definitely incorrect behavior)
// AFTER that in "com.saveourtool.save.buildutils.kotlin-library" we try to register this task once again and fail
// so the order of plugins in `apply` is critically important
val jacocoTestReportTask = if (project.name == "save-cli") {
val jacocoTestReportTask by tasks.named("jacocoTestReport", configure)
jacocoTestReportTask
} else {
val jacocoTestReportTask by tasks.register("jacocoTestReport", configure)
jacocoTestReportTask
}

jvmTestTask.finalizedBy(jacocoTestReportTask)
jacocoTestReportTask.dependsOn(jvmTestTask)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/**
* Publishing configuration file.
*/

package com.saveourtool.osv4k.buildutils

import io.github.gradlenexus.publishplugin.NexusPublishExtension
import io.github.gradlenexus.publishplugin.NexusPublishPlugin
import org.gradle.api.Project
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven
import org.gradle.api.publish.maven.tasks.PublishToMavenRepository
import org.gradle.api.tasks.bundling.Jar
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.extra
import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.register
import org.gradle.kotlin.dsl.withType
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
import org.gradle.plugins.signing.Sign
import org.gradle.plugins.signing.SigningExtension
import org.gradle.plugins.signing.SigningPlugin

@Suppress(
"MISSING_KDOC_ON_FUNCTION",
"MISSING_KDOC_TOP_LEVEL",
"TOO_LONG_FUNCTION"
)
fun Project.configurePublishing() {
// If present, set properties from env variables. If any are absent, release will fail.
System.getenv("OSSRH_USERNAME")?.let {
extra.set("sonatypeUsername", it)
}
System.getenv("OSSRH_PASSWORD")?.let {
extra.set("sonatypePassword", it)
}
System.getenv("GPG_SEC")?.let {
extra.set("signingKey", it)
}
System.getenv("GPG_PASSWORD")?.let {
extra.set("signingPassword", it)
}

if (this == rootProject) {
apply<NexusPublishPlugin>()
if (hasProperty("sonatypeUsername")) {
configureNexusPublishing()
}
}

apply<MavenPublishPlugin>()
apply<SigningPlugin>()

configurePublications()

if (hasProperty("signingKey")) {
configureSigning()
}

// https://kotlinlang.org/docs/mpp-publish-lib.html#avoid-duplicate-publications
afterEvaluate {
val publicationsFromMainHost = listOf(
"jvm",
"js",
"linuxX64", "mingwX64", "macosX64",
"kotlinMultiplatform", "metadata",
)
configure<PublishingExtension> {
publications.matching { it.name in publicationsFromMainHost }.all {
val targetPublication = this@all
tasks.withType<AbstractPublishToMaven>()
.matching { it.publication == targetPublication }
.configureEach {
onlyIf {
// main publishing CI job is executed on Linux host
DefaultNativePlatform.getCurrentOperatingSystem().isLinux.apply {
if (!this) {
logger.lifecycle("Publication ${(it as AbstractPublishToMaven).publication.name} is skipped on current host")
}
}
}
}
}
}
}
}

@Suppress("TOO_LONG_FUNCTION", "GENERIC_VARIABLE_WRONG_DECLARATION")
private fun Project.configurePublications() {
val dokkaJarProvider = tasks.register<Jar>("dokkaJar") {
group = "documentation"
archiveClassifier.set("javadoc")
from(tasks.findByName("dokkaHtml"))
}
configure<PublishingExtension> {
repositories {
mavenLocal()
}
publications.withType<MavenPublication>().forEach { publication ->
publication.artifact(dokkaJarProvider)
publication.pom {
name.set(project.name)
description.set(project.description ?: project.name)
url.set("https://github.com/saveourtool/save")
licenses {
license {
name.set("MIT License")
url.set("http://www.opensource.org/licenses/mit-license.php")
distribution.set("repo")
}
}
developers {
developer {
id.set("petertrr")
name.set("Petr Trifanov")
email.set("peter.trifanov@gmail.com")
}
developer {
id.set("akuleshov7")
name.set("Andrey Kuleshov")
email.set("andrewkuleshov7@gmail.com")
}
}
scm {
url.set("https://github.com/saveourtool/save")
connection.set("scm:git:git://github.com/saveourtool/save.git")
}
}
}
}
}

private fun Project.configureSigning() {
configure<SigningExtension> {
useInMemoryPgpKeys(property("signingKey") as String?, property("signingPassword") as String?)
logger.lifecycle("The following publications are getting signed: ${extensions.getByType<PublishingExtension>().publications.map { it.name }}")
sign(*extensions.getByType<PublishingExtension>().publications.toTypedArray())
}

tasks.withType<PublishToMavenRepository>().configureEach {
// Workaround for the problem described at https://github.com/saveourtool/save-cli/pull/501#issuecomment-1439705340.
// We have a single Javadoc artifact shared by all platforms, hence all publications depend on signing of this artifact.
// This causes weird implicit dependencies, like `publishJsPublication...` depends on `signJvmPublication`.
dependsOn(tasks.withType<Sign>())
}
}

private fun Project.configureNexusPublishing() {
configure<NexusPublishExtension> {
repositories {
sonatype {
nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/"))
snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
username.set(property("sonatypeUsername") as String)
password.set(property("sonatypePassword") as String)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@

package com.saveourtool.osv4k.buildutils

import org.ajoberstar.reckon.core.Scope
import org.ajoberstar.reckon.gradle.ReckonExtension
import org.ajoberstar.reckon.gradle.ReckonPlugin
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.internal.storage.file.FileRepository
import org.eclipse.jgit.storage.file.FileRepositoryBuilder
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure

/**
* Configures how project version is determined.
Expand All @@ -19,6 +22,18 @@ import org.gradle.kotlin.dsl.apply
*/
fun Project.configureVersioning() {
apply<ReckonPlugin>()

configure<ReckonExtension> {
setDefaultInferredScope(Scope.MINOR)
snapshots()
setScopeCalc(calcScopeFromProp())
setStageCalc(calcStageFromProp())
}

val isRelease = hasProperty("reckon.stage") && property("reckon.stage") == "final"
if (isRelease) {
failOnUncleanTree()
}
}

private fun Project.failOnUncleanTree() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

package com.saveourtool.osv4k.buildutils

import org.gradle.kotlin.dsl.kotlin
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTest

Expand Down Expand Up @@ -112,7 +111,7 @@ kotlin {
}

// configureJacoco()
// configurePublishing()
configurePublishing()
configureDiktat()
configureDetekt()

Expand Down

0 comments on commit 201ba16

Please sign in to comment.