Skip to content

Commit

Permalink
Support autoconfig for docker plugin (#5)
Browse files Browse the repository at this point in the history
* Refactor sisyphus project plugin

* Make ktlint happy

* Fix build arguments not working

* Upgrade prepare plugin
  • Loading branch information
devkanro authored May 22, 2020
1 parent 7371a52 commit e4ce818
Show file tree
Hide file tree
Showing 17 changed files with 436 additions and 222 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ jobs:
uses: actions/setup-java@v1
with:
java-version: 1.11
- uses: ButterCam/prepare-sisyphus-build@bc33e0b
- uses: ButterCam/prepare-sisyphus-build@v1
- name: Build with Gradle
run: gradle build
2 changes: 1 addition & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
uses: crazy-max/ghaction-import-gpg@v2
env:
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
- uses: ButterCam/prepare-sisyphus-build@bc33e0b
- uses: ButterCam/prepare-sisyphus-build@v1
with:
snapshot-url: https://oss.sonatype.org/content/repositories/snapshots
snapshot-username: ${{ secrets.OSSRH_USERNAME }}
Expand Down
1 change: 1 addition & 0 deletions dependencies/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,6 @@ dependencies {
api("org.gradle.kotlin:plugins:1.2.11")
api("com.gradle.publish:plugin-publish-plugin:0.11.0")
api("org.eclipse.jgit:org.eclipse.jgit:5.7.0.202003110725-r")
api("com.palantir.gradle.docker:gradle-docker:0.25.0")
}
}
2 changes: 2 additions & 0 deletions tools/sisyphus-project-gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ 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("org.springframework.boot:spring-boot-gradle-plugin")
}

gradlePlugin {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ open class SisyphusExtension(val project: Project) {

var snapshotRepositories: MutableList<String> = mutableListOf("snapshot")

var dockerPublishRegistries: MutableList<String> = mutableListOf()

val signKeyName: String?

init {
Expand All @@ -45,8 +47,8 @@ open class SisyphusExtension(val project: Project) {
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 ?: continue
val password = project.findProperty("sisyphus.repositories.$repositoryName.password") 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)
}
Expand All @@ -57,6 +59,8 @@ open class SisyphusExtension(val project: Project) {
?: releaseRepositories
snapshotRepositories = (project.findProperty("sisyphus.snapshot.repositories") as? String)?.split(',')?.toMutableList()
?: snapshotRepositories
dockerPublishRegistries = (project.findProperty("sisyphus.docker.repositories") as? String)?.split(',')?.toMutableList()
?: dockerPublishRegistries

signKeyName = project.findProperty("signing.gnupg.keyName") as? String
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,233 +1,36 @@
package com.bybutter.sisyphus.project.gradle

import java.io.File
import java.net.URI
import nebula.plugin.contacts.ContactsExtension
import nebula.plugin.publishing.maven.MavenPublishPlugin
import nebula.plugin.publishing.publications.JavadocJarPlugin
import nebula.plugin.publishing.publications.SourceJarPlugin
import org.gradle.api.Action
import com.bybutter.sisyphus.project.gradle.java.JavaBaseProjectPlugin
import com.bybutter.sisyphus.project.gradle.java.JavaLibraryProjectPlugin
import com.bybutter.sisyphus.project.gradle.java.JavaPlatformProjectPlugin
import com.bybutter.sisyphus.project.gradle.publishing.ProjectContactsPlugin
import com.bybutter.sisyphus.project.gradle.publishing.ProjectLicensePlugin
import com.bybutter.sisyphus.project.gradle.publishing.ProjectPublishingPlugin
import com.bybutter.sisyphus.project.gradle.publishing.ProjectSigningPlugin
import com.bybutter.sisyphus.project.gradle.threepart.SisyphusAntlrKotlinPlugin
import com.bybutter.sisyphus.project.gradle.threepart.SisyphusDockerPlugin
import com.bybutter.sisyphus.project.gradle.threepart.SisyphusKtlintPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.dsl.RepositoryHandler
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.plugins.signing.SigningExtension
import org.gradle.plugins.signing.SigningPlugin
import org.jlleitschuh.gradle.ktlint.KtlintExtension
import org.jlleitschuh.gradle.ktlint.reporter.ReporterType

class SisyphusProjectPlugin : Plugin<Project> {
override fun apply(target: Project) {
applyBase(target)
tryApplyJavaBase(target)
tryApplyLibrary(target)
tryApplyPlatform(target)
tryApplyPublish(target)
tryApplyKtlint(target)
tryApplyAntlr(target)

target.pluginManager.apply(JavaBaseProjectPlugin::class.java)
target.pluginManager.apply(JavaLibraryProjectPlugin::class.java)
target.pluginManager.apply(JavaPlatformProjectPlugin::class.java)
target.pluginManager.apply(ProjectContactsPlugin::class.java)
target.pluginManager.apply(ProjectLicensePlugin::class.java)
target.pluginManager.apply(ProjectPublishingPlugin::class.java)
target.pluginManager.apply(ProjectSigningPlugin::class.java)
target.pluginManager.apply(SisyphusAntlrKotlinPlugin::class.java)
target.pluginManager.apply(SisyphusDockerPlugin::class.java)
target.pluginManager.apply(SisyphusKtlintPlugin::class.java)
}

private fun applyBase(target: Project) {
val extension = target.extensions.create("sisyphus", SisyphusExtension::class.java, target)
target.version = extension.version
}

private fun tryApplyJavaBase(target: Project) {
if (!target.pluginManager.hasPlugin("java-base")) {
target.pluginManager.withPlugin("java-base") {
tryApplyJavaBase(target)
}
return
}

val extension = target.extensions.getByType(SisyphusExtension::class.java)
target.repositories.applyFromRepositoryKeys(extension.repositories, extension.dependencyRepositories)
}

private fun tryApplyLibrary(target: Project) {
if (!target.pluginManager.hasPlugin("java-library")) {
target.pluginManager.withPlugin("java-library") {
tryApplyLibrary(target)
}
return
}

try {
target.pluginManager.apply(MavenPublishPlugin::class.java)
target.pluginManager.apply(SourceJarPlugin::class.java)
target.pluginManager.apply(JavadocJarPlugin::class.java)
} catch (exception: NoClassDefFoundError) {
target.logger.debug("Skip apply library plugin due to java library plugins not existed.")
return
}
}

private fun tryApplyPlatform(target: Project) {
if (!target.pluginManager.hasPlugin("java-platform")) {
target.pluginManager.withPlugin("java-platform") {
tryApplyPlatform(target)
}
return
}

try {
target.pluginManager.apply(MavenPublishPlugin::class.java)
} catch (exception: NoClassDefFoundError) {
target.logger.debug("Skip apply platform plugin due to java platform plugins not existed.")
return
}

target.afterEvaluate {
val publishing = it.extensions.getByType(PublishingExtension::class.java)
publishing.publications.withType(MavenPublication::class.java) {
it.from(target.components.getByName("javaPlatform"))
}
}
}

private fun tryApplyPublish(target: Project) {
if (!target.pluginManager.hasPlugin("nebula.maven-base-publish")) {
target.pluginManager.withPlugin("nebula.maven-base-publish") {
tryApplyPublish(target)
}
return
}

target.tryApplyPluginClass("nebula.plugin.info.InfoPlugin")
if (target.tryApplyPluginClass("nebula.plugin.contacts.ContactsPlugin")) {
if (target != target.rootProject) {
val rootContacts = target.rootProject.extensions.findByType(ContactsExtension::class.java)
if (rootContacts != null) {
val currentContacts = target.extensions.getByType(ContactsExtension::class.java)

for ((email, person) in rootContacts.people) {
if (!currentContacts.people.containsKey(email)) {
currentContacts.people[email] = person
}
}
}
}
}

val extension = target.extensions.getByType(SisyphusExtension::class.java)
val publishingExtension = target.extensions.getByType(PublishingExtension::class.java)

publishingExtension.publications.withType(MavenPublication::class.java) {
it.pom {
it.licenses {
it.license {
it.name.set("MIT License")
it.url.set("https://github.com/ButterCam/sisyphus/blob/master/LICENSE")
it.distribution.set("repo")
}
}
}
}

if (!extension.signKeyName.isNullOrEmpty()) {
target.pluginManager.apply(SigningPlugin::class.java)
val signing = target.extensions.getByType(SigningExtension::class.java)
signing.useGpgCmd()
target.afterEvaluate {
publishingExtension.publications.all {
signing.sign(it)
}
}
}

if (extension.isRelease) {
publishingExtension.repositories.applyFromRepositoryKeys(extension.repositories, extension.releaseRepositories)
}
if (extension.isSnapshot) {
publishingExtension.repositories.applyFromRepositoryKeys(extension.repositories, extension.snapshotRepositories)
}
}

private fun tryApplyKtlint(target: Project) {
if (!target.pluginManager.hasPlugin("org.jlleitschuh.gradle.ktlint")) {
target.pluginManager.withPlugin("org.jlleitschuh.gradle.ktlint") {
tryApplyKtlint(target)
}
return
}

val extension = target.extensions.getByType(KtlintExtension::class.java)
extension.filter(Action {
val pattern = "${File.separatorChar}generated${File.separatorChar}"
it.exclude {
it.file.path.contains(pattern)
}
})
extension.reporters(Action<KtlintExtension.ReporterExtension> {
it.reporter(ReporterType.CHECKSTYLE)
})
}

private fun tryApplyAntlr(target: Project) {
if (!target.pluginManager.hasPlugin("org.gradle.antlr")) {
target.pluginManager.withPlugin("org.gradle.antlr") {
tryApplyAntlr(target)
}
return
}

if (!target.pluginManager.hasPlugin("kotlin")) {
target.pluginManager.withPlugin("kotlin") {
tryApplyAntlr(target)
}
return
}

val sourceSets = target.extensions.getByType(SourceSetContainer::class.java)
for (sourceSet in sourceSets) {
val kotlinTask = target.tasks.findByName(sourceSet.getCompileTaskName("kotlin")) ?: continue
val antlrTask = target.tasks.findByName(sourceSet.getTaskName("generate", "GrammarSource")) ?: continue
kotlinTask.dependsOn(antlrTask)
}
}

private fun RepositoryHandler.applyFromRepositoryKeys(repositories: Map<String, Repository>, repositoryKeys: Collection<String>) {
for (repositoryKey in repositoryKeys) {
val repository = when (repositoryKey) {
"local" -> repositories[repositoryKey] ?: run {
this.mavenLocal()
null
}
"central" -> repositories[repositoryKey] ?: run {
this.mavenCentral()
null
}
"jcenter" -> repositories[repositoryKey] ?: run {
this.jcenter()
null
}
"portal" -> repositories[repositoryKey] ?: run {
this.gradlePluginPortal()
null
}
else -> repositories[repositoryKey]
}

repository ?: continue

this.maven {
it.name = repositoryKey
it.url = URI.create(repository.url)
it.credentials.username = repository.username ?: ""
it.credentials.password = repository.password ?: ""
}
}
}

private fun Project.tryApplyPluginClass(className: String): Boolean {
return try {
val plugin = Class.forName(className)
this.pluginManager.apply(plugin)
true
} catch (ex: ClassNotFoundException) {
false
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.bybutter.sisyphus.project.gradle

import java.net.URI
import org.gradle.api.Project
import org.gradle.api.artifacts.dsl.RepositoryHandler

internal inline fun Project.ensurePlugin(id: String, noinline block: (Project) -> Unit, returnBlock: () -> Unit) {
if (!pluginManager.hasPlugin(id)) {
pluginManager.withPlugin(id) {
block(this)
}
returnBlock()
}
}

internal fun Project.tryApplyPluginClass(className: String, action: () -> Unit = {}): Boolean {
return try {
val plugin = Class.forName(className)
action()
this.pluginManager.apply(plugin)
true
} catch (ex: ClassNotFoundException) {
false
}
}

internal fun RepositoryHandler.applyFromRepositoryKeys(repositories: Map<String, Repository>, repositoryKeys: Collection<String>) {
for (repositoryKey in repositoryKeys) {
val repository = when (repositoryKey) {
"local" -> repositories[repositoryKey] ?: run {
this.mavenLocal()
null
}
"central" -> repositories[repositoryKey] ?: run {
this.mavenCentral()
null
}
"jcenter" -> repositories[repositoryKey] ?: run {
this.jcenter()
null
}
"portal" -> repositories[repositoryKey] ?: run {
this.gradlePluginPortal()
null
}
else -> repositories[repositoryKey]
}

repository ?: continue

this.maven {
it.name = repositoryKey
it.url = URI.create(repository.url)
it.credentials.username = repository.username
it.credentials.password = repository.password
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.bybutter.sisyphus.project.gradle.java

import com.bybutter.sisyphus.project.gradle.SisyphusExtension
import com.bybutter.sisyphus.project.gradle.applyFromRepositoryKeys
import com.bybutter.sisyphus.project.gradle.ensurePlugin
import org.gradle.api.Plugin
import org.gradle.api.Project

class JavaBaseProjectPlugin : Plugin<Project> {
override fun apply(target: Project) {
target.ensurePlugin("java-base", ::apply) {
return
}

val extension = target.extensions.getByType(SisyphusExtension::class.java)
target.repositories.applyFromRepositoryKeys(extension.repositories, extension.dependencyRepositories)
}
}
Loading

0 comments on commit e4ce818

Please sign in to comment.