-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
225 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
plugins { | ||
id("org.example.application") | ||
} | ||
|
||
application { | ||
mainClass.set("org.example.product.app.Application") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,12 @@ | ||
plugins { | ||
`kotlin-dsl` | ||
} | ||
|
||
dependencies { | ||
implementation(platform(project(":plugins-platform"))) | ||
|
||
implementation(project(":java-base-plugins")) | ||
implementation("org.example:build-parameters-plugins") | ||
implementation("org.owasp:dependency-check-gradle") | ||
implementation("io.fuchs.gradle.classpath-collision-detector:classpath-collision-detector") | ||
} |
47 changes: 47 additions & 0 deletions
47
gradle/plugins/java-application-plugins/src/main/kotlin/org.example.application.gradle.kts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
import org.example.application.tasks.MD5DirectoryChecksum | ||
import org.example.application.tasks.VersionXml | ||
|
||
plugins { | ||
id("org.example.java") | ||
id("application") // For stand-alone application packaging | ||
id("jacoco-report-aggregation") // get and aggregated coverage report for all tests | ||
id("test-report-aggregation") // get and aggregated result report for all tests | ||
id("org.example.war") // For web application packaging/deployment | ||
id("org.example.end2end-testing") | ||
id("io.fuchs.gradle.classpath-collision-detector") | ||
id("org.owasp.dependencycheck") | ||
} | ||
|
||
configurations.aggregateTestReportResults { | ||
shouldResolveConsistentlyWith(configurations.appRuntimeClasspath.get()) | ||
} | ||
configurations.aggregateCodeCoverageReportResults { | ||
shouldResolveConsistentlyWith(configurations.appRuntimeClasspath.get()) | ||
} | ||
|
||
// Generate additional resources required at application runtime | ||
val generateVersionXml = tasks.register<VersionXml>("generateVersionXml") { | ||
mainVersion.set(providers.fileContents( | ||
rootProject.layout.projectDirectory.file("gradle/version.txt")).asText) | ||
xmlFile.set(layout.buildDirectory.file("generated-resources/xml/version.xml")) | ||
} | ||
val resourcesChecksum = tasks.register<MD5DirectoryChecksum>("resourcesChecksum") { | ||
inputDirectory.set(layout.projectDirectory.dir("src/main/resources")) | ||
checksumFile.set(layout.buildDirectory.file("generated-resources/md5/resources.MD5")) | ||
} | ||
|
||
tasks.processResources { | ||
from(generateVersionXml) | ||
from(resourcesChecksum) | ||
} | ||
|
||
dependencyCheck { | ||
scanConfigurations = listOf(configurations.runtimeClasspath.get().name) | ||
autoUpdate = false | ||
} | ||
|
||
tasks.check { | ||
dependsOn(tasks.testAggregateTestReport) | ||
dependsOn(tasks.testCodeCoverageReport) | ||
dependsOn(tasks.detectCollisions) | ||
} |
33 changes: 33 additions & 0 deletions
33
...e/plugins/java-application-plugins/src/main/kotlin/org.example.end2end-testing.gradle.kts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
plugins { | ||
id("org.example.java") | ||
} | ||
|
||
// Specific API fixtures used for testing without live service | ||
val mockApi = sourceSets.create("mockApi") | ||
java.registerFeature(mockApi.name) { | ||
usingSourceSet(mockApi) | ||
} | ||
|
||
// end-to-end tests located in the :app project | ||
testing.suites.create<JvmTestSuite>("endToEndTest") { | ||
useJUnitJupiter("") | ||
targets.all { | ||
testTask { | ||
options { | ||
this as JUnitPlatformOptions | ||
excludeTags("slow") | ||
} | ||
} | ||
tasks.check { | ||
dependsOn(testTask) | ||
} | ||
} | ||
} | ||
|
||
// Add a second task for the endToEndTest suite (not yet supported by suites directly) | ||
tasks.register<Test>("endToEndTestSlow") { | ||
testClassesDirs = sourceSets["endToEndTest"].output.classesDirs | ||
classpath = sourceSets["endToEndTest"].runtimeClasspath | ||
group = LifecycleBasePlugin.VERIFICATION_GROUP | ||
useJUnitPlatform { includeTags("slow") } | ||
} |
22 changes: 22 additions & 0 deletions
22
gradle/plugins/java-application-plugins/src/main/kotlin/org.example.war.gradle.kts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
plugins { | ||
id("war") | ||
id("org.example.java") | ||
id("org.example.build-parameters") | ||
} | ||
|
||
// The war plugin used 'providedRuntime' / 'providedCompile' to resolve dependencies for packaging the WAR file | ||
configurations.providedCompile { | ||
shouldResolveConsistentlyWith(configurations.appRuntimeClasspath.get()) | ||
} | ||
configurations.providedRuntime { | ||
shouldResolveConsistentlyWith(configurations.appRuntimeClasspath.get()) | ||
} | ||
|
||
tasks.register<Copy>("deployWebApp") { | ||
group = "distribution" | ||
description = "Deploy web app into local Tomcat found via CATALINA_HOME" | ||
from(tasks.war) { | ||
into("webapps") | ||
} | ||
into(buildParameters.catalina.home) | ||
} |
77 changes: 77 additions & 0 deletions
77
...application-plugins/src/main/kotlin/org/example/application/tasks/MD5DirectoryChecksum.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
package org.example.application.tasks | ||
|
||
import org.gradle.api.DefaultTask | ||
import org.gradle.api.file.DirectoryProperty | ||
import org.gradle.api.file.RegularFileProperty | ||
import org.gradle.api.tasks.InputDirectory | ||
import org.gradle.api.tasks.OutputFile | ||
import org.gradle.api.tasks.TaskAction | ||
import java.io.File | ||
import java.nio.file.Files | ||
import java.security.DigestInputStream | ||
import java.security.MessageDigest | ||
|
||
/** | ||
* Gradle task based on 'Checksum' Ant Task but stripped down to what we need in this build. | ||
* | ||
* See: https://github.com/apache/ant/blob/master/src/main/org/apache/tools/ant/taskdefs/Checksum.java | ||
*/ | ||
abstract class MD5DirectoryChecksum : DefaultTask() { | ||
|
||
@get:InputDirectory | ||
abstract val inputDirectory: DirectoryProperty | ||
|
||
@get:OutputFile | ||
abstract val checksumFile: RegularFileProperty | ||
|
||
@TaskAction | ||
fun generateChecksum() { | ||
val messageDigest = MessageDigest.getInstance("MD5") | ||
|
||
val allDigests = mutableMapOf<File, ByteArray>() | ||
val bufSize = 8 * 1024 | ||
val buf = ByteArray(bufSize) | ||
|
||
val folder = inputDirectory.get().asFile | ||
folder.walkTopDown().filter { it.isFile }.forEach { | ||
messageDigest.reset() | ||
val fis = Files.newInputStream(it.toPath()) | ||
val dis = DigestInputStream( | ||
fis, | ||
messageDigest | ||
) | ||
while (dis.read(buf, 0, bufSize) != -1) { | ||
// Empty statement | ||
} | ||
dis.close() | ||
fis.close() | ||
val fileDigest = messageDigest.digest() | ||
allDigests[it] = fileDigest | ||
} | ||
// Calculate the total checksum | ||
// Convert the keys (source files) into a sorted array. | ||
val keyArray = allDigests.keys.sortedBy { it.relativeTo(folder).path } | ||
|
||
// Loop over the checksums and generate a total hash. | ||
messageDigest.reset() | ||
keyArray.forEach { | ||
// Add the digest for the file content | ||
val digest = allDigests.getValue(it) | ||
messageDigest.update(digest) | ||
|
||
// Add the file path | ||
val fileName = it.relativeTo(folder).path.replace(File.separatorChar, '/') | ||
messageDigest.update(fileName.toByteArray()) | ||
} | ||
checksumFile.get().asFile.writeText(createDigestString(messageDigest.digest())) | ||
} | ||
|
||
private fun createDigestString(fileDigest: ByteArray): String { | ||
val byteMask = 0xFF | ||
val checksumSb = StringBuilder() | ||
for (digestByte in fileDigest) { | ||
checksumSb.append(String.format("%02x", byteMask and digestByte.toInt())) | ||
} | ||
return checksumSb.toString() | ||
} | ||
} |
27 changes: 27 additions & 0 deletions
27
...gins/java-application-plugins/src/main/kotlin/org/example/application/tasks/VersionXml.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package org.example.application.tasks | ||
|
||
import org.gradle.api.DefaultTask | ||
import org.gradle.api.file.RegularFileProperty | ||
import org.gradle.api.provider.Property | ||
import org.gradle.api.tasks.Input | ||
import org.gradle.api.tasks.OutputFile | ||
import org.gradle.api.tasks.TaskAction | ||
|
||
/** | ||
* Encodes the current product version in an XML format used at application runtime. | ||
*/ | ||
abstract class VersionXml : DefaultTask() { | ||
|
||
@get:Input | ||
abstract val mainVersion: Property<String> | ||
|
||
@get:OutputFile | ||
abstract val xmlFile: RegularFileProperty | ||
|
||
@TaskAction | ||
fun generate() { | ||
xmlFile.get().asFile.writeText( | ||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><exampleApp version=\"${mainVersion.get()}\"></exampleApp>" | ||
) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
1.2 |