Files
claude-code a6c4df1ea9
werkator build succeeded after 04:26
werkator/mutation build succeeded after 00:29
werkprobe builds with Temurin 25 (#15)
Co-authored-by: claude-code <claude-code@javagil.de>
2026-10-11 13:42:48 +02:00

123 lines
4.9 KiB
Groovy

plugins {
id 'application'
// 3.5 is the last line that still targets Java 17, which is what the
// managed webspaces run (see options.release below).
id 'org.springframework.boot' version '3.5.16'
// the demo of werkcrappit's charts: PIT over werkprobe.shop, Mutation-CRAP, the code city
id 'info.solidsoft.pitest' version '1.19.0'
id 'de.javagil.werkcrappit' version '0.26.0'
}
repositories {
mavenLocal()
mavenCentral()
// werkcrappit-pit, and nothing else from there
maven {
url = 'https://git.javagil.de/api/packages/mi/maven'
content { includeGroup 'de.javagil.werkcrappit' }
}
}
// Compiled with Temurin 25, the JDK of all werk repositories (werkregie ADR 0001),
// but emitting Java 17 bytecode: 17 is what the Hostsharing managed webspaces
// run, and tools/deploy.sh sends the result to one of them.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
vendor = JvmVendorSpec.ADOPTIUM
}
}
tasks.withType(JavaCompile).configureEach {
options.release = 17
}
dependencies {
// The BOM that belongs to the Spring Boot plugin applied above.
implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
// No version: the BOM above decides it. Werkdock's API subset was
// measured against Testcontainers 1.19.3 (werkdock
// docs/testcontainers-api.md) and is exercised here with whatever
// Spring Boot manages — 1.21.4 at the time of writing. That the two
// agree is part of what this repository reports.
implementation 'org.testcontainers:postgresql'
implementation 'org.postgresql:postgresql'
// The other two databases werkdock's quirk table claims to know. They
// are here because it was wrong about both, and a claim nothing
// exercises is how it stayed wrong.
implementation 'org.testcontainers:mariadb'
implementation 'org.mariadb.jdbc:mariadb-java-client'
implementation 'org.testcontainers:mysql'
implementation 'com.mysql:mysql-connector-j'
// Messaging, because a queue server asks werkdock the same question
// a database does and the answers turned out to differ.
implementation 'org.testcontainers:rabbitmq'
implementation 'com.rabbitmq:amqp-client'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
implementation 'org.slf4j:slf4j-simple'
modules {
// slf4j-simple and Spring Boot's logback starter are two bindings
// for one API; keep the one the standalone Probe prints through.
module('ch.qos.logback:logback-classic') { replacedBy('org.slf4j:slf4j-simple', 'one slf4j binding is enough') }
}
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation 'org.junit.jupiter:junit-jupiter'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'ch.qos.logback'
}
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
// Two programs, one source set: the plain Probe that a host without a
// build tool runs (tools/run-probe.sh), and the Spring Boot application
// that reads its jdbc:tc URL from application.yml.
application {
mainClass = 'werkprobe.Probe'
}
springBoot {
mainClass = 'werkprobe.WerkprobeApplication'
}
tasks.named('test') {
useJUnitPlatform()
testLogging { showStandardStreams = true; events 'passed', 'failed' }
// Testcontainers reads these; a run against werkdock needs both.
environment 'DOCKER_HOST', System.getenv('DOCKER_HOST') ?: ''
environment 'TESTCONTAINERS_RYUK_DISABLED', 'true'
}
// dist collects the program and every jar it needs into one directory,
// so it can be copied to a host that has a JVM and no build tool —
// which is the case on a managed webspace (tools/deploy.sh). It takes
// the plain jar (werkprobe-plain.jar, as the Spring Boot plugin names
// it) and not the boot jar: on a flat classpath either main class runs,
// and the libraries are there but once.
tasks.register('dist', Copy) {
from configurations.runtimeClasspath
from tasks.jar
into layout.buildDirectory.dir('dist')
}
// The demo of werkcrappit's charts (src/main/java/werkprobe/shop): PIT mutates the shop only and
// runs its unit tests only, never the container tests; the nightly build `mutation` in .werkator.yml
// writes the code city with its structure page and matrix.
pitest {
pitestVersion = '1.30.0'
junit5PluginVersion = '1.2.3'
targetClasses = ['werkprobe.shop.*']
targetTests = ['werkprobe.shop.*']
timestampedReports = false
}
werkcrappit {
// sets the colours: red from 90 % of it, 9, yellow from half of that, 4.5;
// the demo is red on purpose, so no build runs the gate mutationCrapCheck
maxMutationCrap = 10
codeCharta {
sourceLinkTemplate = 'https://git.javagil.de/mi/werkprobe/src/commit/{commit}/{path}#L{line}'
}
}