From e427828fcb9b09117cd0e59a471314218f8331d5 Mon Sep 17 00:00:00 2001 From: Manfred Hanke Date: Sun, 2 Aug 2026 21:39:07 +0200 Subject: [PATCH 1/6] consolidate POM checks during CI and release Replace the narrow `ensureReleaseCheckUpToDate` task (which only verified that the dependency entries in the committed `release_check/*.pom` files had matching entries in the `libs` version catalog) with a `checkPom` task that compares the full locally generated POM against the committed expected POM. The comparison logic is extracted into `ext.comparePom` and now shared between the CI-time `checkPom` task and the release-time `checkUploadedArtifacts` task, so both stages enforce the same contract against the same expected POM source. Signed-off-by: Manfred Hanke --- ...unit.java-release-check-conventions.gradle | 67 +++++++------------ 1 file changed, 24 insertions(+), 43 deletions(-) diff --git a/buildSrc/src/main/groovy/archunit.java-release-check-conventions.gradle b/buildSrc/src/main/groovy/archunit.java-release-check-conventions.gradle index 4a97f4b27..dfc3e7659 100644 --- a/buildSrc/src/main/groovy/archunit.java-release-check-conventions.gradle +++ b/buildSrc/src/main/groovy/archunit.java-release-check-conventions.gradle @@ -1,5 +1,3 @@ -import groovy.xml.XmlSlurper - import java.nio.file.Files import java.util.jar.JarFile @@ -7,33 +5,34 @@ plugins { id 'archunit.java-artifact-check-conventions' } -task ensureReleaseCheckUpToDate { - doFirst { - def mavenProject = new XmlSlurper().parseText(getExpectedPomFileContent()) - def releaseCheckDependencies = mavenProject.dependencies.dependency - .findAll { it.groupId != 'com.tngtech.archunit' } - .collect { - [groupId: it.groupId.toString(), artifactId: it.artifactId.toString(), version: it.version.toString()] - } +ext.getExpectedPomFileContent = { + getClass().getResourceAsStream("release_check/${project.name}.pom").text.replace('${archunit.version}', version).stripIndent() +} + +ext.comparePom = { String actual -> + println "Verifying correct POM of ${project.name}" - releaseCheckDependencies.each { releaseCheckDependency -> - VersionCatalog versionCatalog = versionCatalogs.named("libs") - def dependencies = versionCatalog.libraryAliases.collect { versionCatalog.findLibrary(it).get().get() } - def matchingProjectDependency = dependencies.find { - it.group == releaseCheckDependency.groupId && - it.name == releaseCheckDependency.artifactId && - it.version == releaseCheckDependency.version - } - assert matchingProjectDependency != null: - "No project dependency was found for expected release dependency ${releaseCheckDependency}" - } + String expected = getExpectedPomFileContent() + if (actual.replaceAll("\\s", "") != expected.replaceAll("\\s", "")) { + throw new AssertionError("""POM of artifact '${project.name}' does not match: +-------- +Actual: +${actual} +-------- +Expected: +${expected} +-------- +""") } } -check.dependsOn(ensureReleaseCheckUpToDate) -ext.getExpectedPomFileContent = { - getClass().getResourceAsStream("release_check/${project.name}.pom").text.replace('${archunit.version}', version).stripIndent() +task checkPom { + dependsOn 'generatePomFileForMavenJavaPublication' + doLast { + comparePom(new File(buildDir, 'publications/mavenJava/pom-default.xml').text) + } } +check.dependsOn(checkPom) task checkUploadedArtifacts { doLast { @@ -58,24 +57,6 @@ task checkUploadedArtifacts { getArtifact(project.name, ".pom").text.stripIndent() } - def checkPom = { - println "Verifying correct POM of ${project.name}" - - String actual = getUploadedPomFileContent() - String expected = getExpectedPomFileContent() - if (actual.replaceAll("\\s", "") != expected.replaceAll("\\s", "")) { - throw new AssertionError("""POM of artifact '${project.name}' does not match: --------- -Actual: -${actual} --------- -Expected: -${expected} --------- -""") - } - } - def checkSourcesExist = { assert getUploadedFile(project.name, 'jar', 'sources') != null } @@ -84,7 +65,7 @@ ${expected} assert getUploadedFile(project.name, 'jar', 'javadoc') != null } - checkPom() + comparePom(getUploadedPomFileContent()) checkSourcesExist() checkJavadocExists() From 96af98457c924289ecff834737eebd8a55bddda6 Mon Sep 17 00:00:00 2001 From: Manfred Hanke Date: Sat, 1 Aug 2026 19:51:22 +0200 Subject: [PATCH 2/6] add new developers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit based on `git shortlog -s v1.4.2.. | sort -nr`: ``` 53 Manfred Hanke 34 dependabot[bot] 11 Dr. Jonathan Schulz 6 Stefan Gräber 6 Andreas Zöller 2 schulzjo-tng 2 gradle-update-robot 1 Thanos Tsiamis 1 Niklas Keller 1 junya koyama 1 John Burns 1 Jens Bannmann 1 hankem 1 DragonFSKY 1 Develop-KIM ``` Signed-off-by: Manfred Hanke --- ...nit.java-release-publishing-conventions.gradle | 15 +++++++++++++++ .../resources/release_check/archunit-junit4.pom | 15 +++++++++++++++ .../release_check/archunit-junit5-api.pom | 15 +++++++++++++++ .../release_check/archunit-junit5-engine-api.pom | 15 +++++++++++++++ .../release_check/archunit-junit5-engine.pom | 15 +++++++++++++++ .../resources/release_check/archunit-junit5.pom | 15 +++++++++++++++ .../release_check/archunit-junit6-api.pom | 15 +++++++++++++++ .../release_check/archunit-junit6-engine-api.pom | 15 +++++++++++++++ .../release_check/archunit-junit6-engine.pom | 15 +++++++++++++++ .../resources/release_check/archunit-junit6.pom | 15 +++++++++++++++ .../src/main/resources/release_check/archunit.pom | 15 +++++++++++++++ 11 files changed, 165 insertions(+) diff --git a/buildSrc/src/main/groovy/archunit.java-release-publishing-conventions.gradle b/buildSrc/src/main/groovy/archunit.java-release-publishing-conventions.gradle index 9b3cadf2d..ba66c67c5 100644 --- a/buildSrc/src/main/groovy/archunit.java-release-publishing-conventions.gradle +++ b/buildSrc/src/main/groovy/archunit.java-release-publishing-conventions.gradle @@ -52,6 +52,21 @@ publishing { name = 'Manfred Hanke' email = 'manfred.hanke@tngtech.com' } + developer { + id = 'schulzjo-tng' + name = 'Jonathan Schulz' + email = 'jonathan.schulz@tngtech.com' + } + developer { + id = 'StefanGraeber' + name = 'Stefan Gräber' + email = 'stefan.graeber@tngtech.com' + } + developer { + id = 'TheManWhoStaresAtCode' + name = 'Andreas Zöller' + email = 'andreas.zoeller@tngtech.com' + } } organization { diff --git a/buildSrc/src/main/resources/release_check/archunit-junit4.pom b/buildSrc/src/main/resources/release_check/archunit-junit4.pom index f0203a069..8487f1456 100644 --- a/buildSrc/src/main/resources/release_check/archunit-junit4.pom +++ b/buildSrc/src/main/resources/release_check/archunit-junit4.pom @@ -35,6 +35,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git diff --git a/buildSrc/src/main/resources/release_check/archunit-junit5-api.pom b/buildSrc/src/main/resources/release_check/archunit-junit5-api.pom index 4d2f1a6d7..5a692e4a1 100644 --- a/buildSrc/src/main/resources/release_check/archunit-junit5-api.pom +++ b/buildSrc/src/main/resources/release_check/archunit-junit5-api.pom @@ -35,6 +35,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git diff --git a/buildSrc/src/main/resources/release_check/archunit-junit5-engine-api.pom b/buildSrc/src/main/resources/release_check/archunit-junit5-engine-api.pom index cafef39ea..58247b70f 100644 --- a/buildSrc/src/main/resources/release_check/archunit-junit5-engine-api.pom +++ b/buildSrc/src/main/resources/release_check/archunit-junit5-engine-api.pom @@ -36,6 +36,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git diff --git a/buildSrc/src/main/resources/release_check/archunit-junit5-engine.pom b/buildSrc/src/main/resources/release_check/archunit-junit5-engine.pom index 4d4b7967d..2347dfe38 100644 --- a/buildSrc/src/main/resources/release_check/archunit-junit5-engine.pom +++ b/buildSrc/src/main/resources/release_check/archunit-junit5-engine.pom @@ -36,6 +36,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git diff --git a/buildSrc/src/main/resources/release_check/archunit-junit5.pom b/buildSrc/src/main/resources/release_check/archunit-junit5.pom index 89848b754..d66b7bf94 100644 --- a/buildSrc/src/main/resources/release_check/archunit-junit5.pom +++ b/buildSrc/src/main/resources/release_check/archunit-junit5.pom @@ -36,6 +36,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git diff --git a/buildSrc/src/main/resources/release_check/archunit-junit6-api.pom b/buildSrc/src/main/resources/release_check/archunit-junit6-api.pom index b5122a70c..bf4768808 100644 --- a/buildSrc/src/main/resources/release_check/archunit-junit6-api.pom +++ b/buildSrc/src/main/resources/release_check/archunit-junit6-api.pom @@ -35,6 +35,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git diff --git a/buildSrc/src/main/resources/release_check/archunit-junit6-engine-api.pom b/buildSrc/src/main/resources/release_check/archunit-junit6-engine-api.pom index cc971a3b9..2b972e079 100644 --- a/buildSrc/src/main/resources/release_check/archunit-junit6-engine-api.pom +++ b/buildSrc/src/main/resources/release_check/archunit-junit6-engine-api.pom @@ -36,6 +36,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git diff --git a/buildSrc/src/main/resources/release_check/archunit-junit6-engine.pom b/buildSrc/src/main/resources/release_check/archunit-junit6-engine.pom index 4e18fa3a8..fda40bd91 100644 --- a/buildSrc/src/main/resources/release_check/archunit-junit6-engine.pom +++ b/buildSrc/src/main/resources/release_check/archunit-junit6-engine.pom @@ -36,6 +36,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git diff --git a/buildSrc/src/main/resources/release_check/archunit-junit6.pom b/buildSrc/src/main/resources/release_check/archunit-junit6.pom index 915db4b38..57cc86420 100644 --- a/buildSrc/src/main/resources/release_check/archunit-junit6.pom +++ b/buildSrc/src/main/resources/release_check/archunit-junit6.pom @@ -36,6 +36,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git diff --git a/buildSrc/src/main/resources/release_check/archunit.pom b/buildSrc/src/main/resources/release_check/archunit.pom index 9b9cd46d3..307ccd327 100644 --- a/buildSrc/src/main/resources/release_check/archunit.pom +++ b/buildSrc/src/main/resources/release_check/archunit.pom @@ -40,6 +40,21 @@ Manfred Hanke manfred.hanke@tngtech.com + + schulzjo-tng + Jonathan Schulz + jonathan.schulz@tngtech.com + + + StefanGraeber + Stefan Gräber + stefan.graeber@tngtech.com + + + TheManWhoStaresAtCode + Andreas Zöller + andreas.zoeller@tngtech.com + scm:git@github.com:TNG/ArchUnit.git From 4f26fccd784d37f469e743950f8e0a3ff686d64b Mon Sep 17 00:00:00 2001 From: Manfred Hanke Date: Tue, 4 Aug 2026 02:01:02 +0200 Subject: [PATCH 3/6] fix testRelease exec() and task registration for Gradle 9 `Project.exec()` was removed in Gradle 9, which caused: ``` > Task :testRelease FAILED FAILURE: Build failed with an exception. * Where: Script '/home/runner/work/ArchUnit-Release/ArchUnit-Release/ArchUnit/build-steps/release/test-release.gradle' line: 34 * What went wrong: Execution failed for task ':testRelease' (registered in script 'build-steps/release/test-release.gradle'). > Could not find method exec() for arguments [test_release_4w64ubz8pbuym3ipvd2mfmsx8$_run_closure1$_closure4$_closure9@57b2cda] on task ':testRelease' of type org.gradle.api.DefaultTask. ``` Signed-off-by: Manfred Hanke --- build-steps/release/test-release.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-steps/release/test-release.gradle b/build-steps/release/test-release.gradle index 7024ad9a4..4d33041ec 100644 --- a/build-steps/release/test-release.gradle +++ b/build-steps/release/test-release.gradle @@ -1,7 +1,7 @@ apply from: scriptRelativePath(this, 'vcs-utils.gradle') apply from: scriptRelativePath(this, 'archunit-examples-utils.gradle') -task testRelease() { +tasks.register('testRelease') { File testReleaseDir = new File(project.buildDir, 'test-release') def configureStagingRepository = { @@ -31,7 +31,7 @@ task testRelease() { }.getFiles().collect { it.name.replaceAll(/\.java$/, '') } def outputStream = new ByteArrayOutputStream() - exec { + project.services.get(org.gradle.process.ExecOperations).exec { workingDir testReleaseDir commandLine './gradlew', ":${exampleProjectName}:build", '-P', "sonatypeUsername=${project.getProperty('sonatypeUsername')}", '-P', "sonatypePassword=${project.getProperty('sonatypePassword')}" ignoreExitValue true From 502d782bfbf2632a2c9f943a502ddd8cc3e3c46d Mon Sep 17 00:00:00 2001 From: hankem Date: Tue, 4 Aug 2026 00:06:03 +0000 Subject: [PATCH 4/6] prepare release 1.5.0 Signed-off-by: hankem --- README.md | 4 +- docs/_data/navigation.yml | 2 +- docs/_pages/getting-started.md | 4 +- .../_posts/2026-08-04-release-v1.5.0.markdown | 8 + docs/userguide/html/000_Index.html | 420 ++++++++++++++---- gradle.properties | 2 +- 6 files changed, 348 insertions(+), 92 deletions(-) create mode 100644 docs/_posts/2026-08-04-release-v1.5.0.markdown diff --git a/README.md b/README.md index 8461cc7a8..43b15c837 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ framework. ###### Gradle ``` -testImplementation 'com.tngtech.archunit:archunit:1.4.2' +testImplementation 'com.tngtech.archunit:archunit:1.5.0' ``` ###### Maven @@ -26,7 +26,7 @@ testImplementation 'com.tngtech.archunit:archunit:1.4.2' com.tngtech.archunit archunit - 1.4.2 + 1.5.0 test ``` diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index bb58289cf..25abf9db5 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -10,6 +10,6 @@ main: - title: "User Guide" url: /userguide/html/000_Index.html - title: "API" - url: https://javadoc.io/doc/com.tngtech.archunit/archunit/1.4.2 + url: https://javadoc.io/doc/com.tngtech.archunit/archunit/1.5.0 - title: "About" url: /about diff --git a/docs/_pages/getting-started.md b/docs/_pages/getting-started.md index 9b27a2f6c..dfbcf884b 100644 --- a/docs/_pages/getting-started.md +++ b/docs/_pages/getting-started.md @@ -15,7 +15,7 @@ ArchUnit can be obtained from Maven Central. com.tngtech.archunit archunit - 1.4.2 + 1.5.0 test ``` @@ -23,7 +23,7 @@ ArchUnit can be obtained from Maven Central. #### Gradle ```groovy dependencies { - testImplementation 'com.tngtech.archunit:archunit:1.4.2' + testImplementation 'com.tngtech.archunit:archunit:1.5.0' } ``` diff --git a/docs/_posts/2026-08-04-release-v1.5.0.markdown b/docs/_posts/2026-08-04-release-v1.5.0.markdown new file mode 100644 index 000000000..501a6f392 --- /dev/null +++ b/docs/_posts/2026-08-04-release-v1.5.0.markdown @@ -0,0 +1,8 @@ +--- +layout: splash +title: "New release of ArchUnit (v1.5.0)" +date: 2026-08-04 12:00:00 +categories: news release +--- + +A new release of ArchUnit (v1.5.0) is out. For details see [the release on GitHub](https://github.com/TNG/ArchUnit/releases/tag/v1.5.0 "ArchUnit v1.5.0 on GitHub"). diff --git a/docs/userguide/html/000_Index.html b/docs/userguide/html/000_Index.html index 249b9bd18..9a207a63d 100644 --- a/docs/userguide/html/000_Index.html +++ b/docs/userguide/html/000_Index.html @@ -442,6 +442,13 @@ margin-top: 1.2em !important; margin-bottom: 0.55em !important; } +/* Restore code box for single inline-code inside table cells */ +p.tableblock > code:only-child { + background-color: #f7f7f8 !important; + padding: .1em .5ex !important; + border-radius: 4px !important; + border: 1px solid #e0e0e0; /* makes a lone dot's box clearly visible */ +} @@ -450,7 +457,7 @@