Skip to content

Commit

Permalink
✨ New docker plugin (#463)
Browse files Browse the repository at this point in the history
  • Loading branch information
devkanro authored Oct 18, 2022
1 parent 4cb5d0c commit 4f05f21
Show file tree
Hide file tree
Showing 13 changed files with 287 additions and 107 deletions.
2 changes: 1 addition & 1 deletion dependencies/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ dependencies {
api("com.netflix.nebula:gradle-contacts-plugin:6.0.0")
api("com.netflix.nebula:gradle-info-plugin:11.3.3")
api("com.netflix.nebula:nebula-publishing-plugin:18.4.0")
api("com.palantir.gradle.docker:gradle-docker:0.33.0")
api("com.bmuschko:gradle-docker-plugin:8.1.0")
api("com.salesforce.servicelibs:rxgrpc-stub:1.2.3")
api("com.squareup.okhttp3:okhttp:4.10.0")
api("com.squareup.retrofit2:retrofit:2.9.0")
Expand Down
1 change: 0 additions & 1 deletion tools/sisyphus-k8s-gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ dependencies {
implementation(Dependencies.Kotlin.reflect)
implementation(Dependencies.Kotlin.plugin)
implementation(Dependencies.kubeJavaClient)
compileOnly("com.palantir.gradle.docker:gradle-docker")
}

gradlePlugin {
Expand Down
2 changes: 1 addition & 1 deletion tools/sisyphus-project-gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ dependencies {
compileOnly("com.netflix.nebula:gradle-info-plugin")
compileOnly("com.netflix.nebula:gradle-contacts-plugin")
compileOnly("org.jlleitschuh.gradle:ktlint-gradle")
compileOnly("com.palantir.gradle.docker:gradle-docker")
compileOnly("com.bmuschko:gradle-docker-plugin")
compileOnly("org.springframework.boot:spring-boot-gradle-plugin")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,78 @@ package com.bybutter.sisyphus.project.gradle

import org.gradle.api.Project
import org.gradle.api.internal.artifacts.dsl.ParsedModuleStringNotation
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.MapProperty
import org.gradle.api.provider.Property
import org.gradle.kotlin.dsl.SisyphusDevelopmentLayer

open class SisyphusExtension(val project: Project) {
var version: String
val developer: Property<String> = project.objects.property(String::class.java)

val isDevelop: Boolean
val layer: Property<SisyphusDevelopmentLayer> =
project.objects.property(SisyphusDevelopmentLayer::class.java).value(SisyphusDevelopmentLayer.IMPLEMENTATION)

val layer: SisyphusDevelopmentLayer
val repositories: MapProperty<String, Repository> =
project.objects.mapProperty(String::class.java, Repository::class.java).empty()

val isSnapshot: Boolean
get() {
return version.endsWith("-SNAPSHOT")
}
val dependencyRepositories: ListProperty<String> =
project.objects.listProperty(String::class.java).value(listOf("local", "central", "portal", "google"))

val isRelease: Boolean
get() {
return !isSnapshot
}
val releaseRepositories: ListProperty<String> =
project.objects.listProperty(String::class.java).value(listOf("release"))

var repositories: MutableMap<String, Repository> = hashMapOf()
val snapshotRepositories: ListProperty<String> =
project.objects.listProperty(String::class.java).value(listOf("snapshot"))

var dependencyRepositories: MutableList<String> = mutableListOf("local", "central", "portal", "google")
val dockerPublishRegistries: ListProperty<String> = project.objects.listProperty(String::class.java).empty()

var releaseRepositories: MutableList<String> = mutableListOf("release")
val managedDependencies: MapProperty<String, ParsedModuleStringNotation> =
project.objects.mapProperty(String::class.java, ParsedModuleStringNotation::class.java).empty()

var snapshotRepositories: MutableList<String> = mutableListOf("snapshot")
init {
developer.set(project.findProperty("sisyphus.developer") as? String)
for (key in project.properties.keys) {
val result = repositoryUrlRegex.matchEntire(key) ?: continue
val repositoryName = result.groupValues[1]

var dockerPublishRegistries: MutableList<String> = mutableListOf()
val url = project.findProperty("sisyphus.repositories.$repositoryName.url") as? String ?: continue
val username = project.findProperty("sisyphus.repositories.$repositoryName.username") as? String
val password = project.findProperty("sisyphus.repositories.$repositoryName.password") as? String

var managedDependencies: MutableMap<String, ParsedModuleStringNotation> = mutableMapOf()
repositories.put(repositoryName, Repository(url, username, password))
}

val signKeyName: String?
(project.findProperty("sisyphus.dependency.repositories") as? String)?.split(',')?.let {
dependencyRepositories.set(it)
}
(project.findProperty("sisyphus.release.repositories") as? String)?.split(',')?.let {
releaseRepositories.set(it)
}
(project.findProperty("sisyphus.snapshot.repositories") as? String)?.split(',')?.let {
snapshotRepositories.set(it)
}
(project.findProperty("sisyphus.docker.repositories") as? String)?.split(',')?.let {
dockerPublishRegistries.set(it)
}
(project.findProperty("sisyphus.dependency.overriding") as? String)?.split(',')?.associate {
val moduleStringNotation = ParsedModuleStringNotation(it, "")
"${moduleStringNotation.group}:${moduleStringNotation.name}" to moduleStringNotation
}?.let {
managedDependencies.set(it)
}
(project.findProperty("sisyphus.layer") as? String)?.let { SisyphusDevelopmentLayer.valueOf(it) }?.let {
layer.set(it)
}
}

init {
val developer: String? = project.findProperty("sisyphus.developer") as? String
isDevelop = developer != null
fun recommendVersion(): String? {
val branchName: String? = System.getenv("BRANCH_NAME")
val githubRef: String? = System.getenv("GITHUB_REF")
val tagName: String? = System.getenv("TAG_NAME")
val buildVersion: String? = System.getenv("BUILD_VERSION")

version = when {
developer != null -> "$developer-SNAPSHOT"
return when {
!developer.orNull.isNullOrEmpty() -> "${developer.get()}-SNAPSHOT"
buildVersion != null -> "$buildVersion"
tagName != null -> "$tagName"
branchName != null -> "$branchName-SNAPSHOT"
Expand All @@ -54,43 +83,9 @@ open class SisyphusExtension(val project: Project) {
githubRef
)?.groupValues?.get(1)
}-SNAPSHOT"
else -> project.version as String
}

for (key in project.properties.keys) {
val result = repositoryUrlRegex.matchEntire(key) ?: continue
val repositoryName = result.groupValues[1]

val url = project.findProperty("sisyphus.repositories.$repositoryName.url") as? String ?: continue
val username = project.findProperty("sisyphus.repositories.$repositoryName.username") as? String
val password = project.findProperty("sisyphus.repositories.$repositoryName.password") as? String

repositories[repositoryName] = Repository(url, username, password)
else -> null
}

dependencyRepositories =
(project.findProperty("sisyphus.dependency.repositories") as? String)?.split(',')?.toMutableList()
?: dependencyRepositories
releaseRepositories =
(project.findProperty("sisyphus.release.repositories") as? String)?.split(',')?.toMutableList()
?: releaseRepositories
snapshotRepositories =
(project.findProperty("sisyphus.snapshot.repositories") as? String)?.split(',')?.toMutableList()
?: snapshotRepositories
dockerPublishRegistries =
(project.findProperty("sisyphus.docker.repositories") as? String)?.split(',')?.toMutableList()
?: dockerPublishRegistries

managedDependencies =
(project.findProperty("sisyphus.dependency.overriding") as? String)?.split(',')?.associate {
val moduleStringNotation = ParsedModuleStringNotation(it, "")
"${moduleStringNotation.group}:${moduleStringNotation.name}" to moduleStringNotation
}?.toMutableMap() ?: managedDependencies

signKeyName = project.findProperty("signing.gnupg.keyName") as? String

layer = (project.findProperty("sisyphus.layer") as? String)?.let { SisyphusDevelopmentLayer.valueOf(it) }
?: SisyphusDevelopmentLayer.IMPLEMENTATION
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class SisyphusProjectPlugin : Plugin<Project> {
target.pluginManager.apply(ProjectLicensePlugin::class.java)
target.pluginManager.apply(ProjectSigningPlugin::class.java)
target.pluginManager.apply(SisyphusAntlrKotlinPlugin::class.java)
if (isClassExist("com.palantir.gradle.docker.PalantirDockerPlugin")) {
if (isClassExist("com.bmuschko.gradle.docker.DockerRemoteApiPlugin")) {
target.pluginManager.apply(SisyphusDockerPlugin::class.java)
}
if (isClassExist("org.jlleitschuh.gradle.ktlint.KtlintExtension")) {
Expand All @@ -35,6 +35,10 @@ class SisyphusProjectPlugin : Plugin<Project> {

private fun applyBase(target: Project) {
val extension = target.extensions.create("sisyphus", SisyphusExtension::class.java, target)
target.version = extension.version
if (target.version.toString() == Project.DEFAULT_VERSION) {
extension.recommendVersion()?.let {
target.version = it
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ import org.gradle.api.Project
import org.gradle.api.artifacts.dsl.RepositoryHandler
import java.net.URI

internal fun Project.isSnapshot(): Boolean {
return version.toString().endsWith("-SNAPSHOT")
}

internal fun Project.isRelease(): Boolean {
return !isSnapshot()
}

internal fun Project.ensurePlugin(vararg ids: String, block: (Project) -> Unit): Boolean {
for (id in ids) {
if (!pluginManager.hasPlugin(id)) {
Expand Down Expand Up @@ -47,18 +55,22 @@ internal fun RepositoryHandler.applyFromRepositoryKeys(
this.mavenLocal()
null
}

"central" -> repositories[repositoryKey] ?: run {
this.mavenCentral()
null
}

"portal" -> repositories[repositoryKey] ?: run {
this.gradlePluginPortal()
null
}

"google" -> repositories[repositoryKey] ?: run {
this.google()
null
}

else -> repositories[repositoryKey]
}

Expand All @@ -85,3 +97,12 @@ internal fun isClassExist(className: String): Boolean {
false
}
}

fun getJavaMajorVersion(): Int? {
val javaVersion = System.getProperty("java.version")
return if (javaVersion.startsWith("1.")) {
javaVersion.substring(2, 3)
} else {
javaVersion.substringBefore('.')
}.toIntOrNull()
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class JavaBaseProjectPlugin : Plugin<Project> {
}

val extension = target.extensions.getByType(SisyphusExtension::class.java)
target.repositories.applyFromRepositoryKeys(extension.repositories, extension.dependencyRepositories)
target.repositories.applyFromRepositoryKeys(extension.repositories.get(), extension.dependencyRepositories.get())
target.pluginManager.apply(JavaDependenciesReplacePlugin::class.java)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class JavaDependenciesReplacePlugin : Plugin<Project> {

target.configurations.all {
it.resolutionStrategy.eachDependency { detail ->
extension.managedDependencies["${detail.requested.group}:${detail.requested.name}"]?.let { moduleStringNotation ->
extension.managedDependencies.getting("${detail.requested.group}:${detail.requested.name}")?.orNull?.let { moduleStringNotation ->
detail.useVersion(moduleStringNotation.version)
detail.because("The version of current dependency managed by Sisyphus Property")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package com.bybutter.sisyphus.project.gradle.publishing
import com.bybutter.sisyphus.project.gradle.SisyphusExtension
import com.bybutter.sisyphus.project.gradle.applyFromRepositoryKeys
import com.bybutter.sisyphus.project.gradle.ensurePlugin
import com.bybutter.sisyphus.project.gradle.isRelease
import com.bybutter.sisyphus.project.gradle.isSnapshot
import com.bybutter.sisyphus.project.gradle.tryApplyPluginClass
import org.gradle.api.Plugin
import org.gradle.api.Project
Expand All @@ -21,11 +23,11 @@ class ProjectPublishingPlugin : Plugin<Project> {
val sisyphus = target.extensions.getByType(SisyphusExtension::class.java)
val publishing = target.extensions.getByType(PublishingExtension::class.java)

if (sisyphus.isRelease) {
publishing.repositories.applyFromRepositoryKeys(sisyphus.repositories, sisyphus.releaseRepositories)
if (target.isRelease()) {
publishing.repositories.applyFromRepositoryKeys(sisyphus.repositories.get(), sisyphus.releaseRepositories.get())
}
if (sisyphus.isSnapshot) {
publishing.repositories.applyFromRepositoryKeys(sisyphus.repositories, sisyphus.snapshotRepositories)
if (target.isSnapshot()) {
publishing.repositories.applyFromRepositoryKeys(sisyphus.repositories.get(), sisyphus.snapshotRepositories.get())
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class ProjectSigningPlugin : Plugin<Project> {
val sisyphus = target.extensions.getByType(SisyphusExtension::class.java)
val publishing = target.extensions.getByType(PublishingExtension::class.java)

if (!sisyphus.signKeyName.isNullOrEmpty()) {
if (target.hasProperty("signing.gnupg.keyName")) {
target.pluginManager.apply(SigningPlugin::class.java)
val signing = target.extensions.getByType(SigningExtension::class.java)
signing.useGpgCmd()
Expand Down
Loading

0 comments on commit 4f05f21

Please sign in to comment.