From 41a7b6506f76a9ee43d461776bdf1207aa53d4a8 Mon Sep 17 00:00:00 2001 From: Peter Gafert Date: Tue, 30 Jul 2019 18:51:35 +0200 Subject: [PATCH] Automate release artifact checks: - POM correct? - Manifest correct? - Thirdparty repackaged? - Sources uploaded? - Javadoc uploaded? Signed-off-by: Peter Gafert --- build-steps/build-steps.gradle | 3 +- .../release/check-uploaded-artifacts.gradle | 111 ++++++++++++++++++ .../release/expected/archunit-junit4.pom | 48 ++++++++ .../release/expected/archunit-junit5-api.pom | 42 +++++++ .../expected/archunit-junit5-engine-api.pom | 43 +++++++ .../expected/archunit-junit5-engine.pom | 55 +++++++++ build-steps/release/expected/archunit.pom | 47 ++++++++ .../{publish => release}/publish.gradle | 0 8 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 build-steps/release/check-uploaded-artifacts.gradle create mode 100644 build-steps/release/expected/archunit-junit4.pom create mode 100644 build-steps/release/expected/archunit-junit5-api.pom create mode 100644 build-steps/release/expected/archunit-junit5-engine-api.pom create mode 100644 build-steps/release/expected/archunit-junit5-engine.pom create mode 100644 build-steps/release/expected/archunit.pom rename build-steps/{publish => release}/publish.gradle (100%) diff --git a/build-steps/build-steps.gradle b/build-steps/build-steps.gradle index b795743118..65b23703bc 100644 --- a/build-steps/build-steps.gradle +++ b/build-steps/build-steps.gradle @@ -2,9 +2,10 @@ def utilsPath = { "build-steps/${it}" } apply from: utilsPath('archiving/archiving.gradle') apply from: utilsPath('codequality/spotbugs.gradle') -apply from: utilsPath('publish/publish.gradle') +apply from: utilsPath('release/publish.gradle') apply from: utilsPath('license/license.gradle') apply from: utilsPath('maven-integration-test/maven-integration-test.gradle') apply from: utilsPath('build-scan/build-scan.gradle') apply from: utilsPath('ci/ci-config.gradle') +apply from: utilsPath('release/check-uploaded-artifacts.gradle') apply from: utilsPath('release/release.gradle') \ No newline at end of file diff --git a/build-steps/release/check-uploaded-artifacts.gradle b/build-steps/release/check-uploaded-artifacts.gradle new file mode 100644 index 0000000000..5dcca382a4 --- /dev/null +++ b/build-steps/release/check-uploaded-artifacts.gradle @@ -0,0 +1,111 @@ +import java.nio.file.Files +import java.time.LocalDateTime +import java.util.jar.JarFile +import java.util.jar.Manifest + +File scriptRoot = currentScriptRootOf this +def rootUrl = { + if (!project.hasProperty('tngRepoId')) { + throw new IllegalArgumentException( + 'You must pass the repo id (see Sonatype Repository Manager -> comtngtech-${repoId}) as parameter, e.g. -P tngRepoId=1162') + } + "https://oss.sonatype.org/service/local/repositories/comtngtech-${tngRepoId}/content/com/tngtech/archunit" +} + +def createArtifactUrl = { String artifactId -> + "${rootUrl()}/${artifactId}/${version}/${artifactId}-${version}" +} + +def getUploadedFile = { String artifactId, String ending, String suffix -> + def fullEnding = (!suffix.isEmpty() ? "-${suffix}" : '') + ".${ending}" + File result = Files.createTempFile(artifactId, fullEnding).toFile() + result.bytes = new URL("${createArtifactUrl(artifactId)}${fullEnding}").bytes + result +} + +def getUploadedFileText = { String artifactId, String ending -> + new URL("${createArtifactUrl(artifactId)}.${ending}").text.stripIndent() +} + +def getExpectedFile = { String artifactId, String ending -> + new File(scriptRoot, "expected/${artifactId}.${ending}").text.replace('${archunit.version}', version).stripIndent() +} + +def checkPom = { String artifactId -> + println "Verifying correct POM of ${artifactId}" + + String actual = getUploadedFileText(artifactId, 'pom') + String expected = getExpectedFile(artifactId, 'pom') + if (actual.replaceAll("\\s", "") != expected.replaceAll("\\s", "")) { + throw new AssertionError("""POM of artifact '${artifactId}' does not match: +-------- +Actual: +${actual} +-------- +Expected: +${expected} +-------- +""") + } +} + +def checkManifest = { String artifactId, Manifest manifest -> + println "Verifying correct Manifest of ${artifactId}" + + def checkAttributes = { expected -> + expected.each { key, value -> + assert manifest.mainAttributes.getValue(key) == value + } + } + checkAttributes([ + 'Specification-Title' : "ArchUnit - Module '${artifactId}'", + 'Specification-Version' : version, + 'Specification-Vendor' : 'TNG Technology Consulting GmbH', + 'Implementation-Title' : "com.tngtech.${artifactId.replace('-', '.')}", + 'Implementation-Version': version, + 'Implementation-Vendor' : 'TNG Technology Consulting GmbH', + 'Issue-Tracker' : 'https://github.com/TNG/ArchUnit/issues', + 'Documentation-URL' : 'https://github.com/TNG/ArchUnit', + 'Copyright' : "${LocalDateTime.now().year} TNG Technology Consulting GmbH", + 'License' : 'The Apache Software License, Version 2.0', + 'Automatic-Module-Name' : "com.tngtech.${artifactId.replaceFirst('-', '.').replaceFirst('-', '.').replace('-', '')}" + ]) +} + +def checkThirdParty = { JarFile jarFile -> + assert jarFile.getEntry('com/tngtech/archunit/thirdparty/org/objectweb/asm/ClassVisitor.class') != null: 'ASM is missing from 3rd party' + assert jarFile.getEntry('com/tngtech/archunit/thirdparty/org/objectweb/asm/asm.license') != null: 'ASM license is missing from 3rd party' + assert jarFile.getEntry('com/tngtech/archunit/thirdparty/com/google/common/collect/ImmutableSet.class') != null: 'Guava is missing from 3rd party' +} + +def checkNoThirdParty = { JarFile jarFile -> + assert jarFile.getEntry('com/tngtech/archunit/thirdparty') == null: 'There exists a third party folder' +} + +def checkSourcesExist = { String artifactId -> + assert getUploadedFile(artifactId, 'jar', 'sources') != null +} + +def checkJavadocExists = { String artifactId -> + assert getUploadedFile(artifactId, 'jar', 'javadoc') != null +} + +task checkUploadedArtifacts { + doLast { + releaseProjects.each { Project project -> + checkPom(project.name) + checkSourcesExist(project.name) + checkJavadocExists(project.name) + + JarFile jarFile = new JarFile(getUploadedFile(project.name, 'jar', '')) + checkManifest(project.name, jarFile.manifest) + if (project.repackagesAsm) { + println "Artifact ${project.name} is configured to repackage 3rd party libs -> checking existence of 3rd party package..." + checkThirdParty(jarFile) + } else { + println "Artifact ${project.name} is configured to not repackage 3rd party libs -> checking absense of 3rd party package..." + checkNoThirdParty(jarFile) + } + } + } +} \ No newline at end of file diff --git a/build-steps/release/expected/archunit-junit4.pom b/build-steps/release/expected/archunit-junit4.pom new file mode 100644 index 0000000000..ff7373dfac --- /dev/null +++ b/build-steps/release/expected/archunit-junit4.pom @@ -0,0 +1,48 @@ + + + 4.0.0 + com.tngtech.archunit + archunit-junit4 + ${archunit.version} + ArchUnit + A Java architecture test library, to specify and assert architecture rules in plain Java - Module 'archunit-junit4' + https://github.com/TNG/ArchUnit + + TNG Technology Consulting GmbH + https://www.tngtech.com/ + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + codecholeric + Peter Gafert + peter.gafert@tngtech.com + + + + scm:git@github.com:TNG/ArchUnit.git + scm:git@github.com:TNG/ArchUnit.git + https://github.com/TNG/ArchUnit + + + + com.tngtech.archunit + archunit + ${archunit.version} + compile + + + junit + junit + 4.12 + compile + + + \ No newline at end of file diff --git a/build-steps/release/expected/archunit-junit5-api.pom b/build-steps/release/expected/archunit-junit5-api.pom new file mode 100644 index 0000000000..273c6a8aec --- /dev/null +++ b/build-steps/release/expected/archunit-junit5-api.pom @@ -0,0 +1,42 @@ + + + 4.0.0 + com.tngtech.archunit + archunit-junit5-api + ${archunit.version} + ArchUnit + A Java architecture test library, to specify and assert architecture rules in plain Java - Module 'archunit-junit5-api' + https://github.com/TNG/ArchUnit + + TNG Technology Consulting GmbH + https://www.tngtech.com/ + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + codecholeric + Peter Gafert + peter.gafert@tngtech.com + + + + scm:git@github.com:TNG/ArchUnit.git + scm:git@github.com:TNG/ArchUnit.git + https://github.com/TNG/ArchUnit + + + + com.tngtech.archunit + archunit + ${archunit.version} + compile + + + \ No newline at end of file diff --git a/build-steps/release/expected/archunit-junit5-engine-api.pom b/build-steps/release/expected/archunit-junit5-engine-api.pom new file mode 100644 index 0000000000..6e425b7662 --- /dev/null +++ b/build-steps/release/expected/archunit-junit5-engine-api.pom @@ -0,0 +1,43 @@ + + + 4.0.0 + com.tngtech.archunit + archunit-junit5-engine-api + ${archunit.version} + ArchUnit + A Java architecture test library, to specify and assert architecture rules in plain Java - Module 'archunit-junit5-engine-api' + + https://github.com/TNG/ArchUnit + + TNG Technology Consulting GmbH + https://www.tngtech.com/ + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + codecholeric + Peter Gafert + peter.gafert@tngtech.com + + + + scm:git@github.com:TNG/ArchUnit.git + scm:git@github.com:TNG/ArchUnit.git + https://github.com/TNG/ArchUnit + + + + org.junit.platform + junit-platform-engine + 1.5.1 + compile + + + \ No newline at end of file diff --git a/build-steps/release/expected/archunit-junit5-engine.pom b/build-steps/release/expected/archunit-junit5-engine.pom new file mode 100644 index 0000000000..df4c41b2af --- /dev/null +++ b/build-steps/release/expected/archunit-junit5-engine.pom @@ -0,0 +1,55 @@ + + + 4.0.0 + com.tngtech.archunit + archunit-junit5-engine + ${archunit.version} + ArchUnit + A Java architecture test library, to specify and assert architecture rules in plain Java - Module 'archunit-junit5-engine' + + https://github.com/TNG/ArchUnit + + TNG Technology Consulting GmbH + https://www.tngtech.com/ + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + codecholeric + Peter Gafert + peter.gafert@tngtech.com + + + + scm:git@github.com:TNG/ArchUnit.git + scm:git@github.com:TNG/ArchUnit.git + https://github.com/TNG/ArchUnit + + + + com.tngtech.archunit + archunit + ${archunit.version} + compile + + + com.tngtech.archunit + archunit-junit5-api + ${archunit.version} + compile + + + com.tngtech.archunit + archunit-junit5-engine-api + ${archunit.version} + compile + + + \ No newline at end of file diff --git a/build-steps/release/expected/archunit.pom b/build-steps/release/expected/archunit.pom new file mode 100644 index 0000000000..8a7d177449 --- /dev/null +++ b/build-steps/release/expected/archunit.pom @@ -0,0 +1,47 @@ + + + 4.0.0 + com.tngtech.archunit + archunit + ${archunit.version} + ArchUnit + A Java architecture test library, to specify and assert architecture rules in plain Java - Module 'archunit' + https://github.com/TNG/ArchUnit + + TNG Technology Consulting GmbH + https://www.tngtech.com/ + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + BSD + http://asm.ow2.io/license.html + repo + + + + + codecholeric + Peter Gafert + peter.gafert@tngtech.com + + + + scm:git@github.com:TNG/ArchUnit.git + scm:git@github.com:TNG/ArchUnit.git + https://github.com/TNG/ArchUnit + + + + org.slf4j + slf4j-api + 1.7.25 + compile + + + \ No newline at end of file diff --git a/build-steps/publish/publish.gradle b/build-steps/release/publish.gradle similarity index 100% rename from build-steps/publish/publish.gradle rename to build-steps/release/publish.gradle