├── ci ├── .gitignore ├── scripts │ ├── common.sh │ ├── build-project.sh │ ├── promote.sh │ └── stage.sh ├── tasks │ ├── promote.yml │ ├── build-project.yml │ ├── stage.yml │ └── build-ci-image.yml ├── parameters.yml ├── images │ └── ci-image │ │ └── Dockerfile ├── README.adoc └── pipeline.yml ├── .springjavaformatconfig ├── gradle.properties ├── settings.gradle ├── .sdkmanrc ├── gradle ├── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties └── publications.gradle ├── src ├── main │ ├── resources │ │ └── application.properties │ └── java │ │ └── io │ │ └── spring │ │ └── concourse │ │ └── releasescripts │ │ ├── Application.java │ │ ├── command │ │ ├── ArgumentValidator.java │ │ ├── Command.java │ │ ├── CommandProcessor.java │ │ ├── PublishToSdkmanCommand.java │ │ ├── PromoteCommand.java │ │ └── PublishToCentralCommand.java │ │ ├── sonatype │ │ ├── DeployableArtifact.java │ │ ├── ArtifactCollector.java │ │ └── SonatypeProperties.java │ │ ├── ReleaseType.java │ │ ├── artifactory │ │ ├── payload │ │ │ ├── PromotionRequest.java │ │ │ └── BuildInfoResponse.java │ │ ├── ArtifactoryProperties.java │ │ └── ArtifactoryService.java │ │ ├── ReleaseProperties.java │ │ ├── sdkman │ │ ├── SdkmanProperties.java │ │ └── SdkmanService.java │ │ └── ReleaseInfo.java └── test │ ├── resources │ ├── io │ │ └── spring │ │ │ └── concourse │ │ │ └── releasescripts │ │ │ ├── sonatype │ │ │ ├── artifactory-repo │ │ │ │ ├── org │ │ │ │ │ └── springframework │ │ │ │ │ │ └── example │ │ │ │ │ │ ├── module-one │ │ │ │ │ │ └── 1.0.0 │ │ │ │ │ │ │ ├── module-one-1.0.0.jar.md5 │ │ │ │ │ │ │ ├── module-one-1.0.0.pom.md5 │ │ │ │ │ │ │ ├── module-one-1.0.0.module.md5 │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar.md5 │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar.md5 │ │ │ │ │ │ │ ├── module-one-1.0.0.jar.sha1 │ │ │ │ │ │ │ ├── module-one-1.0.0.module.sha1 │ │ │ │ │ │ │ ├── module-one-1.0.0.pom.sha1 │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar.sha1 │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar.sha1 │ │ │ │ │ │ │ ├── module-one-1.0.0.jar.sha256 │ │ │ │ │ │ │ ├── module-one-1.0.0.pom.sha256 │ │ │ │ │ │ │ ├── module-one-1.0.0.module.sha256 │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar.sha256 │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar.sha256 │ │ │ │ │ │ │ ├── module-one-1.0.0.jar.sha512 │ │ │ │ │ │ │ ├── module-one-1.0.0.module.sha512 │ │ │ │ │ │ │ ├── module-one-1.0.0.pom.sha512 │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar.sha512 │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar.sha512 │ │ │ │ │ │ │ ├── module-one-1.0.0.jar │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar │ │ │ │ │ │ │ ├── module-one-1.0.0.jar.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.pom.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.jar.md5.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.jar.sha1.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.module.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.pom.md5.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.pom.sha1.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.jar.sha256.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.jar.sha512.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.module.md5.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.module.sha1.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.module.sha256.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.module.sha512.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.pom.sha256.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.pom.sha512.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar.md5.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar.sha1.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar.sha256.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-javadoc.jar.sha512.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar.md5.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar.sha1.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar.sha256.asc │ │ │ │ │ │ │ ├── module-one-1.0.0-sources.jar.sha512.asc │ │ │ │ │ │ │ ├── module-one-1.0.0.pom │ │ │ │ │ │ │ └── module-one-1.0.0.module │ │ │ │ │ │ ├── module-two │ │ │ │ │ │ └── 1.0.0 │ │ │ │ │ │ │ ├── module-two-1.0.0.jar.md5 │ │ │ │ │ │ │ ├── module-two-1.0.0.pom.md5 │ │ │ │ │ │ │ ├── module-two-1.0.0.module.md5 │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar.md5 │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar.md5 │ │ │ │ │ │ │ ├── module-two-1.0.0.jar.sha1 │ │ │ │ │ │ │ ├── module-two-1.0.0.module.sha1 │ │ │ │ │ │ │ ├── module-two-1.0.0.pom.sha1 │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar.sha1 │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar.sha1 │ │ │ │ │ │ │ ├── module-two-1.0.0.jar.sha256 │ │ │ │ │ │ │ ├── module-two-1.0.0.pom.sha256 │ │ │ │ │ │ │ ├── module-two-1.0.0.module.sha256 │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar.sha256 │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar.sha256 │ │ │ │ │ │ │ ├── module-two-1.0.0.jar.sha512 │ │ │ │ │ │ │ ├── module-two-1.0.0.module.sha512 │ │ │ │ │ │ │ ├── module-two-1.0.0.pom.sha512 │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar.sha512 │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar.sha512 │ │ │ │ │ │ │ ├── module-two-1.0.0.jar │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar │ │ │ │ │ │ │ ├── module-two-1.0.0.jar.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.pom.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.jar.md5.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.jar.sha1.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.module.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.pom.md5.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.pom.sha1.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.jar.sha256.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.jar.sha512.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.module.md5.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.module.sha1.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.module.sha256.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.module.sha512.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.pom.sha256.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.pom.sha512.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar.md5.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar.sha1.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar.sha256.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-javadoc.jar.sha512.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar.md5.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar.sha1.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar.sha256.asc │ │ │ │ │ │ │ ├── module-two-1.0.0-sources.jar.sha512.asc │ │ │ │ │ │ │ ├── module-two-1.0.0.pom │ │ │ │ │ │ │ └── module-two-1.0.0.module │ │ │ │ │ │ └── module-three │ │ │ │ │ │ └── 1.0.0 │ │ │ │ │ │ ├── module-three-1.0.0.jar.md5 │ │ │ │ │ │ ├── module-three-1.0.0.module.md5 │ │ │ │ │ │ ├── module-three-1.0.0.pom.md5 │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar.md5 │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar.md5 │ │ │ │ │ │ ├── module-three-1.0.0.jar.sha1 │ │ │ │ │ │ ├── module-three-1.0.0.module.sha1 │ │ │ │ │ │ ├── module-three-1.0.0.pom.sha1 │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar.sha1 │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar.sha1 │ │ │ │ │ │ ├── module-three-1.0.0.jar.sha256 │ │ │ │ │ │ ├── module-three-1.0.0.module.sha256 │ │ │ │ │ │ ├── module-three-1.0.0.pom.sha256 │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar.sha256 │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar.sha256 │ │ │ │ │ │ ├── module-three-1.0.0.jar.sha512 │ │ │ │ │ │ ├── module-three-1.0.0.module.sha512 │ │ │ │ │ │ ├── module-three-1.0.0.pom.sha512 │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar.sha512 │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar.sha512 │ │ │ │ │ │ ├── module-three-1.0.0.jar │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar │ │ │ │ │ │ ├── module-three-1.0.0.jar.asc │ │ │ │ │ │ ├── module-three-1.0.0.pom.asc │ │ │ │ │ │ ├── module-three-1.0.0.jar.md5.asc │ │ │ │ │ │ ├── module-three-1.0.0.jar.sha1.asc │ │ │ │ │ │ ├── module-three-1.0.0.module.asc │ │ │ │ │ │ ├── module-three-1.0.0.pom.md5.asc │ │ │ │ │ │ ├── module-three-1.0.0.pom.sha1.asc │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar.asc │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar.asc │ │ │ │ │ │ ├── module-three-1.0.0.jar.sha256.asc │ │ │ │ │ │ ├── module-three-1.0.0.jar.sha512.asc │ │ │ │ │ │ ├── module-three-1.0.0.module.md5.asc │ │ │ │ │ │ ├── module-three-1.0.0.module.sha1.asc │ │ │ │ │ │ ├── module-three-1.0.0.module.sha256.asc │ │ │ │ │ │ ├── module-three-1.0.0.module.sha512.asc │ │ │ │ │ │ ├── module-three-1.0.0.pom.sha256.asc │ │ │ │ │ │ ├── module-three-1.0.0.pom.sha512.asc │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar.md5.asc │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar.sha1.asc │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar.sha256.asc │ │ │ │ │ │ ├── module-three-1.0.0-javadoc.jar.sha512.asc │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar.md5.asc │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar.sha1.asc │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar.sha256.asc │ │ │ │ │ │ ├── module-three-1.0.0-sources.jar.sha512.asc │ │ │ │ │ │ ├── module-three-1.0.0.pom │ │ │ │ │ │ └── module-three-1.0.0.module │ │ │ │ └── build-info.json │ │ │ └── profiles.json │ │ │ └── artifactory │ │ │ ├── not-staged-build-info-response.json │ │ │ ├── build-info-response.json │ │ │ ├── staged-build-info-response.json │ │ │ └── filtered-build-info-response.json │ └── application.yml │ └── java │ └── io │ └── spring │ └── concourse │ └── releasescripts │ ├── command │ ├── CommandTests.java │ └── ArgumentValidatorTest.java │ ├── sonatype │ ├── AnyOfRequestMatcher.java │ ├── SonatypeServiceAutoReleaseDisabledTests.java │ ├── SonatypeServerUtils.java │ └── SonatypeServiceTests.java │ ├── artifactory │ ├── ArtifactoryServiceTests.java │ └── ArtifactoryServiceWithProjectTests.java │ └── sdkman │ └── SdkmanServiceTests.java ├── .gitignore ├── Dockerfile └── gradlew.bat /ci/.gitignore: -------------------------------------------------------------------------------- 1 | credentials.yml -------------------------------------------------------------------------------- /.springjavaformatconfig: -------------------------------------------------------------------------------- 1 | java-baseline=8 -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | version=0.4.2-SNAPSHOT 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'concourse-release-scripts' 2 | -------------------------------------------------------------------------------- /.sdkmanrc: -------------------------------------------------------------------------------- 1 | # Enable auto-env through the sdkman_auto_env config 2 | # Add key=value pairs of SDKs to use below 3 | java=8.0.322-librca 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.main.banner-mode=off 2 | logging.level.io.spring.concourse=DEBUG 3 | spring.jackson.default-property-inclusion=non_null -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar.md5: -------------------------------------------------------------------------------- 1 | e84da489be91de821c95d41b8f0e0a0a -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom.md5: -------------------------------------------------------------------------------- 1 | 48776112e8bc3ca36b6392b0e9d6d619 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar.md5: -------------------------------------------------------------------------------- 1 | e84da489be91de821c95d41b8f0e0a0a -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom.md5: -------------------------------------------------------------------------------- 1 | 057258909d16c0f9ed33c8a83e4ef165 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module.md5: -------------------------------------------------------------------------------- 1 | b5b2aedb082633674ef9308a2ac21934 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar.md5: -------------------------------------------------------------------------------- 1 | e84da489be91de821c95d41b8f0e0a0a -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module.md5: -------------------------------------------------------------------------------- 1 | 90fa60dcc829042dd1208c174752caeb -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom.md5: -------------------------------------------------------------------------------- 1 | a819cb79241de23f94f3626ae83be12f -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module.md5: -------------------------------------------------------------------------------- 1 | 9a7d415ecef034f2fd4a0b251055ec4b -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar.md5: -------------------------------------------------------------------------------- 1 | e84da489be91de821c95d41b8f0e0a0a -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar.md5: -------------------------------------------------------------------------------- 1 | e84da489be91de821c95d41b8f0e0a0a -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar.sha1: -------------------------------------------------------------------------------- 1 | 8992b17455ce660da9c5fe47226b7ded9e872637 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module.sha1: -------------------------------------------------------------------------------- 1 | b7cb6c2ce7fbb98b8eb502c3ef8fcab0dd4880fc -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom.sha1: -------------------------------------------------------------------------------- 1 | a5cc75e17f8eccfc4ac30bfbb09f42d5f34ecbb1 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar.md5: -------------------------------------------------------------------------------- 1 | e84da489be91de821c95d41b8f0e0a0a -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar.md5: -------------------------------------------------------------------------------- 1 | e84da489be91de821c95d41b8f0e0a0a -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar.md5: -------------------------------------------------------------------------------- 1 | e84da489be91de821c95d41b8f0e0a0a -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar.md5: -------------------------------------------------------------------------------- 1 | e84da489be91de821c95d41b8f0e0a0a -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar.sha1: -------------------------------------------------------------------------------- 1 | 8992b17455ce660da9c5fe47226b7ded9e872637 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module.sha1: -------------------------------------------------------------------------------- 1 | 9df95def633421b7415f807b0b5848c6975de806 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom.sha1: -------------------------------------------------------------------------------- 1 | 1a742c42aef877b6a2808a1b5c35fbe3189ce274 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar.sha1: -------------------------------------------------------------------------------- 1 | 8992b17455ce660da9c5fe47226b7ded9e872637 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar.sha1: -------------------------------------------------------------------------------- 1 | 8992b17455ce660da9c5fe47226b7ded9e872637 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar.sha1: -------------------------------------------------------------------------------- 1 | 8992b17455ce660da9c5fe47226b7ded9e872637 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module.sha1: -------------------------------------------------------------------------------- 1 | 9090f5fcb4c79a89b3a46f2cb8071381e0787a03 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom.sha1: -------------------------------------------------------------------------------- 1 | e562eacb5f9cf14ccbb80c8be0396710fc6a546c -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar.sha1: -------------------------------------------------------------------------------- 1 | 8992b17455ce660da9c5fe47226b7ded9e872637 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar.sha1: -------------------------------------------------------------------------------- 1 | 8992b17455ce660da9c5fe47226b7ded9e872637 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar.sha1: -------------------------------------------------------------------------------- 1 | 8992b17455ce660da9c5fe47226b7ded9e872637 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar.sha1: -------------------------------------------------------------------------------- 1 | 8992b17455ce660da9c5fe47226b7ded9e872637 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar.sha256: -------------------------------------------------------------------------------- 1 | 10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom.sha256: -------------------------------------------------------------------------------- 1 | 3b31f2abf79368001e2fab02997446ac62db714b9db9cb78c4c542aa962485dc -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar.sha256: -------------------------------------------------------------------------------- 1 | 10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom.sha256: -------------------------------------------------------------------------------- 1 | 7e855e618d4aba3eb4e63bbfc9960e4da319d8bdef0cca213a11e9b2d1991635 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module.sha256: -------------------------------------------------------------------------------- 1 | 4ef7e1ba5fda72b0168c9aab4746ec6ee57fb73020c49fe2f49251187aaab074 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar.sha256: -------------------------------------------------------------------------------- 1 | 10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module.sha256: -------------------------------------------------------------------------------- 1 | 2e8d3db6ece5719d7be27bcfdefa1f890da9a19f73390c7122797db1081d245b -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom.sha256: -------------------------------------------------------------------------------- 1 | f043a098eee190d59e2b4b450c2de21dcb3b7fce224abefd89e0e5b44b939fa7 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module.sha256: -------------------------------------------------------------------------------- 1 | 773b2d6350eb671af0b79328bd5334fba565f9041ca823fe7b55097dadf3dcf5 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar.sha256: -------------------------------------------------------------------------------- 1 | 10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar.sha256: -------------------------------------------------------------------------------- 1 | 10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar.sha256: -------------------------------------------------------------------------------- 1 | 10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar.sha256: -------------------------------------------------------------------------------- 1 | 10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar.sha256: -------------------------------------------------------------------------------- 1 | 10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar.sha256: -------------------------------------------------------------------------------- 1 | 10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385 -------------------------------------------------------------------------------- /ci/scripts/common.sh: -------------------------------------------------------------------------------- 1 | source /opt/concourse-java.sh 2 | 3 | # Get the revision from a build-info.json file 4 | get_revision_from_buildinfo() { 5 | cat build-info.json | jq -r '.buildInfo.modules[0].id' | sed 's/.*:.*:\(.*\)/\1/' 6 | } 7 | 8 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar.sha512: -------------------------------------------------------------------------------- 1 | 2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module.sha512: -------------------------------------------------------------------------------- 1 | 29b1bc06a150e4764826e35e2d2541933b0583ce823f5b00c02effad9f37f02f0d2eef1c81214d69eaf74220e1f77332c5e6a91eb413a3022b5a8a1d7914c4c3 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom.sha512: -------------------------------------------------------------------------------- 1 | 05bd8fd394a15b9dcc1bfaece0a63b0fdc2c3625a7e0aa5230fd3b5b75a8f8934a0af550b44437aa1486909058e84703e63fdec6f637d639d565b55bdaf1fa6c -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar.sha512: -------------------------------------------------------------------------------- 1 | 2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module.sha512: -------------------------------------------------------------------------------- 1 | 6294828fb9ce277d60e92c607d00b739e9266c3ebdca173fb32881c04f2d365d43bf9d77c0a07cf1dbcd09ad302f7458e938197f59ff5614a5d1d4e4146a0cf6 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom.sha512: -------------------------------------------------------------------------------- 1 | 5b06587734aa146b452e78e34abffb38b8c820abf623975409ae003b5d90aded345fa8f92ed9d7a505a16db324c0649d2e16c7597bad8dc63f0a5c00123789e1 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar.sha512: -------------------------------------------------------------------------------- 1 | 2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar.sha512: -------------------------------------------------------------------------------- 1 | 2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar.sha512: -------------------------------------------------------------------------------- 1 | 2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module.sha512: -------------------------------------------------------------------------------- 1 | ac3e2a0dfb3b8ddaa79468f85698ff97e9b88e401849e2e733073b711a1673ba2e37be61d224fd69ec2e1c59ed0342e6b3757bc3931c2e297d24bcae9370fa3b -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom.sha512: -------------------------------------------------------------------------------- 1 | 67549e36f07c9f4b83cfa9f00fa647705128eabd03dec3df0066177e89940652fc7e13b8c0b60652c811e167c3ffaba0ab95a4f315a10f69572c12e4e944b6e6 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar.sha512: -------------------------------------------------------------------------------- 1 | 2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar.sha512: -------------------------------------------------------------------------------- 1 | 2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar.sha512: -------------------------------------------------------------------------------- 1 | 2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00 -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar.sha512: -------------------------------------------------------------------------------- 1 | 2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00 -------------------------------------------------------------------------------- /src/test/resources/application.yml: -------------------------------------------------------------------------------- 1 | artifactory: 2 | username: user 3 | password: password 4 | sonatype: 5 | polling-interval: 1s 6 | sdkman: 7 | consumer-key: sdkman-consumer-key 8 | consumer-token: sdkman-consumer-token 9 | candidate: springboot 10 | artifact: "org.springframework.boot:spring-boot-cli:*:zip:bin" 11 | -------------------------------------------------------------------------------- /ci/tasks/promote.yml: -------------------------------------------------------------------------------- 1 | --- 2 | platform: linux 3 | inputs: 4 | - name: git-repo 5 | - name: artifactory-repo 6 | outputs: 7 | - name: version 8 | - name: built-artifact 9 | params: 10 | RELEASE_TYPE: 11 | ARTIFACTORY_SERVER: 12 | ARTIFACTORY_USERNAME: 13 | ARTIFACTORY_PASSWORD: 14 | run: 15 | path: git-repo/ci/scripts/promote.sh 16 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar -------------------------------------------------------------------------------- /ci/tasks/build-project.yml: -------------------------------------------------------------------------------- 1 | --- 2 | platform: linux 3 | inputs: 4 | - name: git-repo 5 | outputs: 6 | - name: built-artifact 7 | - name: distribution-repository 8 | - name: git-repo 9 | caches: 10 | - path: gradle 11 | params: 12 | BRANCH: 13 | run: 14 | path: bash 15 | args: 16 | - -ec 17 | - | 18 | ${PWD}/git-repo/ci/scripts/build-project.sh 19 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spring-attic/concourse-release-scripts/main/src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar -------------------------------------------------------------------------------- /ci/parameters.yml: -------------------------------------------------------------------------------- 1 | github-repo: "https://github.com/spring-io/concourse-release-scripts.git" 2 | github-repo-name: "spring-io/concourse-release-scripts" 3 | docker-hub-organization: "springci" 4 | artifactory-server: "https://repo.spring.io" 5 | branch: "main" 6 | build-name: "concourse-release-scripts" 7 | pipeline-name: "concourse-release-scripts" 8 | concourse-url: "https://ci.spring.io" 9 | task-timeout: 45m 10 | -------------------------------------------------------------------------------- /ci/tasks/stage.yml: -------------------------------------------------------------------------------- 1 | --- 2 | platform: linux 3 | inputs: 4 | - name: git-repo 5 | outputs: 6 | - name: stage-git-repo 7 | - name: distribution-repository 8 | params: 9 | RELEASE_TYPE: 10 | CI: true 11 | GRADLE_ENTERPRISE_CACHE_USERNAME: 12 | GRADLE_ENTERPRISE_CACHE_PASSWORD: 13 | GRADLE_ENTERPRISE_URL: https://ge.spring.io 14 | caches: 15 | - path: gradle 16 | run: 17 | path: git-repo/ci/scripts/stage.sh 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/** 6 | !**/src/test/** 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | /bin/ 17 | 18 | ### IntelliJ IDEA ### 19 | out/ 20 | .idea 21 | *.iws 22 | *.iml 23 | *.ipr 24 | 25 | ### NetBeans ### 26 | /nbproject/private/ 27 | /nbbuild/ 28 | /dist/ 29 | /nbdist/ 30 | /.nb-gradle/ 31 | build/ 32 | 33 | ### VS Code ### 34 | .vscode/ 35 | 36 | -------------------------------------------------------------------------------- /ci/images/ci-image/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:jammy-20230916 2 | 3 | RUN apt-get update 4 | RUN apt-get install --no-install-recommends -y ca-certificates net-tools git curl jq 5 | RUN rm -rf /var/lib/apt/lists/* 6 | 7 | ENV JAVA_HOME /opt/jdk 8 | ENV PATH $JAVA_HOME/bin:$PATH 9 | RUN mkdir -p /opt/jdk && \ 10 | cd /opt/jdk && \ 11 | curl -L https://download.bell-sw.com/java/17.0.8.1+1/bellsoft-jdk17.0.8.1+1-linux-amd64.tar.gz | tar xz --strip-components=1 12 | 13 | ADD https://raw.githubusercontent.com/spring-io/concourse-java-scripts/v0.0.4/concourse-java.sh /opt/ -------------------------------------------------------------------------------- /ci/scripts/build-project.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | source $(dirname $0)/common.sh 5 | repository=$(pwd)/distribution-repository 6 | 7 | pushd git-repo > /dev/null 8 | ./gradlew -Dorg.gradle.internal.launcher.welcomeMessageEnabled=false --no-daemon --max-workers=4 -PdeploymentRepository=${repository} build publishAllPublicationsToDeploymentRepository 9 | version=$( awk -F '=' '$1 == "version" { print $2 }' gradle.properties ) 10 | popd > /dev/null 11 | 12 | cp git-repo/build/libs/concourse-release-scripts.jar built-artifact/ 13 | echo $version > built-artifact/version 14 | 15 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3qtgf8CeDvxzi7lPghlrZtmYTTjaic4FZsGRWTPky3H24i4wSRDhG0L5sj4uPK 5 | eLLlITr5a9j26UCas9HRSthiC8+EgIMAhSN0X482SQhUZHAW67ErIvaHlwL+ixMD 6 | 0T5pmsW8PKN3lV1TFMhNYSEC2GRG/4GF+3yQA8LR+BgeEu/E5nmysIH8vuQMkOD6 7 | 3pKA8VKNBml591j6UTqxoHtPX+rThaziz3Hy3+ekf5iWslllTTGPd2SWqTvnj2Ae 8 | GvRzsbli+FEM0Aj/v8jUQnQzOz891QSvWR+fMfCqZimiJMc+GBzJ9umbcyQsB5tY 9 | e26mAoYd9KEpGXMKN4biHbJZNp1GGw== 10 | =x/MY 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT04rwgAwJHic8GGHFZ+UAJYLW/OxJOVyd0ebx4yT5zAyTjyvxnrlKmKZ6GP/NhZ 5 | htJQnZez85lUKA0TsMvl/6H2iEhKOns6HgqY3PLFkKNRKOq601phtD9HCkxDibWB 6 | UDT01I0q2xNOljD03lhfytefnSnZ96AaySol2v5DBIZsOKWGir0/8KJCpEQJHjCF 7 | TwNk8lNF3moGlO4zUfoBbkSZ+J0J8Bq5QI3nIAWFYxHcrZ2YGsAZd48kux8x2V3C 8 | c6QsYEonmztqxop76a7K8Gv+MDmo/u/vqM8z5C63/WpOoDtRG+F5vtPkhCrR6M5f 9 | ygubQUy5TL+dWdHE8zgA2O9hZuoHEg== 10 | =bkxG 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT1IkAf+N8ts9K88PC/dISZMWSrgRbSugd6VRG6pto6jsp9cJBzTzQ6C8psMkXcN 5 | qX0fnLBn4Zn1dovxRIrA8QeT/vxHMl1X0Foe6SUTMjK34Ofq4V1FVlhuJIi0YZrP 6 | L7B4cKTkv1ndwSVgE23zkynfaIPiPl1uZOwDmlpArokqnjSiUq9NndtKf87NwekW 7 | hbf7brgfZddeDj9xhAn5hz2pHUhx/uH9tOX3JlZgE+yATZsGm6Z9BSf4Lur0W85P 8 | hrJ+MfuYPzZ3n7okuaQdMT3QIqe3FO+dfGZKwakw2NWfgWP3LZsQ5rbyxBlyH7CG 9 | JA/VAIIqe99ftHcBFRGB6C9hMn4FcA== 10 | =prNt 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2kvAgAoc2k0ljj7L3Pj4rPz73K1SO3pDHdf+6S6pU7E4ao9FEFZBcB7YJjEmmQ 5 | U724HqU15PIkaJKI/v4Z612E1gMSMIQ8A0LnsFR9yQdvrsK1Ijv+CdPCdyvZsBfP 6 | 3MgmWaRUOToK3BAAVV5y0dfUNFUyeKKxHNclJd6H0HUK02of8I7LBn/5ULK4QRaQ 7 | Lm3bUIT3PtjUfND+DK3QlczZ+YgOkIwTkLywYCYxblm9XJjWCRXaZI1MdUlA6SMs 8 | uEqtglQ9zEJgyue/JtWsIkAlzUbdyjo34Cg5HEZJ6RNzboXlRNFm83fcKyPhSy7V 9 | 0xikP1INbKuZSU1ZE7/rRYIQ7ChK0g== 10 | =96NH 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1PSwf+InTdlh+BVVy3RFszEL5vN7waSPYMImXhgd5EZ1d4Lxd6EeOwtNgWNKpG 5 | E+Ps/Kw0jZDvoD49WJlcUjzDHBNHcE7C/L3GAWHV6WwklhtQaJ4EegsynWdSXz6k 6 | fqJY6r58aGKGjpKPutRWAjvfcdC170+ZRsc2oi9xrAgHCpvXzTjq4+O9Ah0t5jwW 7 | jcZ/Xubcw4vjsw774OucHbtwGsvRN5SDJ3IONOH8WCwhUP5vEEKvA6MYX0KGoTdS 8 | 3wTCyZTzU3qtTWxcbTCpiJIWbYwRR7TzLB/uydWHlAMzuz6coIiBpYsGiO6wkmfg 9 | W+QvcE7wyW2jtb22pCImLyObyZ21VA== 10 | =VjDv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2HQgf+MTUEnwzXK4zi76VI7C5cchGan26lIA2Ebq4vtYGKDqNSISOAAdWs9+nT 5 | U6ZA6OIFo5qdeD6F/45s91IoDbxbhMDMFEsSijKASqiuZN5TZM1U2h2kWFAl/sEl 6 | EI1RTygn+xDw/ah4V3/duuMFC+jRgvJ/LgemIF4KBvECWaTQKNu0fu5d4dPXMpp+ 7 | jrxMEZPQZsivpOvklzV8O7wAkf/ZQhJdcB2m8uOfSPlJ91a4EEtXF9/GzzkXUi1P 8 | bzt4NsmOag3227B3mO1Bc6yZdDBNu8wQ9apiJVCpqsxB9Dz0PCL4dHNa1u9g6Xo6 9 | ElRgneV4HZp+LB125VoNabKuNH00bw== 10 | =2yDl 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1HBQf/fCBHR+fpZjkcgonkAVWcGvRx5kRHlsCISs64XMw90++DTawoKxr9/TvY 5 | fltQlq/xaf+2O2Xzh9HIymtZBeKp7a4fWQ2AHf/ygkGyIKvy8h+mu3MGDdmHZeA4 6 | fn9FGjaE0a/wYJmCEHJ1qJ4GaNq47gzRTu76jzZNafnNRlq1rlyVu2txnlks6xDr 7 | oE8EnRT86Y67Ku8YArjkhZSHhf/tzSSwdTAgBinh6eba5tW5ueRXfsheqgtpJMov 8 | hiDIVxuAlJoHy2cQ8L9+8geg0OSXLwQ9BXrBsDCLvrDauU735/Hv/NGrWE95kemw 9 | Ay9jCXhXFWKkzCw2ps3QHTTpTK4aVw== 10 | =1QME 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0XEAf+O9a/29MIWBtj1oLxIT1LLdzTU68qt5+qW+58SNQmMxu0MaESW4GZOc3p 5 | mTV0EJyxUkCLJyoqOY4/GhqBAm33mMZSY8BQtvUZPYxpbJwBo+pE8YfnH3n1v20P 6 | 4pS4oJKekXAhTqShpx5oFjCK4J3chaz+Xc8Ldm1DXakCRc1bc/YYZ+87sy2z+PXk 7 | PmN3KPcc/XjH4GPjmVUR8vR1TGUjUMQGvbAdrgkjFyaCGNvyreuHLsAFWrFFbIOn 8 | /mB++enkXhmjWbiyvmvWQvtU0QFA4sRGYww0Lup1GRQ+00IqHF1QRMskqujAwmok 9 | +TuB3Zc9WuAERPre+Qr1DEevClNwAQ== 10 | =3beu 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2aVAf+MQhSBr1jzcQE5mo1bMOXa4owaRr+dRir5Q4Gr7Fz4NuGoQEIzoL7XP5r 5 | 0zIjebzworxCaw+JNyaIxniHNBeK3sPHTLeW8bCrdJLkhE9RtGdEHLyPYXwPuFin 6 | xVw3VQHWiA0uPM+JaekgdPDtK5wGFQ/AK3pc6vR108oT0kV4zQEqgRnvLqV9Q5zZ 7 | UPHBi5kypu1BmCW4upYL1dmjASWPn9Q8cNpHcX/NJPNJ9zW0yxAAtq4wLfh7PQml 8 | 3EaHEYllsf8v1vMv00+zZNhc6O4BBP1qrRiaYHDAJhJjn6ctV9GFhJ2Ttxh/NmSy 9 | H679tlC2PeRjGMi8bOHBshcikn5KUw== 10 | =4aJI 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3qtgf8CeDvxzi7lPghlrZtmYTTjaic4FZsGRWTPky3H24i4wSRDhG0L5sj4uPK 5 | eLLlITr5a9j26UCas9HRSthiC8+EgIMAhSN0X482SQhUZHAW67ErIvaHlwL+ixMD 6 | 0T5pmsW8PKN3lV1TFMhNYSEC2GRG/4GF+3yQA8LR+BgeEu/E5nmysIH8vuQMkOD6 7 | 3pKA8VKNBml591j6UTqxoHtPX+rThaziz3Hy3+ekf5iWslllTTGPd2SWqTvnj2Ae 8 | GvRzsbli+FEM0Aj/v8jUQnQzOz891QSvWR+fMfCqZimiJMc+GBzJ9umbcyQsB5tY 9 | e26mAoYd9KEpGXMKN4biHbJZNp1GGw== 10 | =x/MY 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0T5QgAgXfcX/6hkGNWRp4xIbpC0P9wi21WBmlWeM1l1vPjlogcPB5fIQ15tnxL 5 | dyXVJjhdBXG70m5UkOtR5LbO+6Y7soEsocfuN/wdjNP/JUk2xW4HTj87F16r3EhV 6 | s1nrydd/nZxsIemTY1irOrCk4yEOWlAO91VOGFI4UoGGE6oeMiTFje6vbNidGT3Y 7 | RD1VrxbVasI38HHggQ+odrdp+rk8AwAUJq8g96KyRO5d+O6NQCf4cTe6S5+kJKG1 8 | ETQ0yASHiD5pzcpQiEQu+wclgAunVAzr5Ql/SnOcZEjUoVOLix7Ttcv5KcXjZhY9 9 | 9VQyULZ1MzcrSEoRoOv8k8fT7swvLg== 10 | =KgwJ 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT3jzQf8DUis2+v7616JWRpUziEnpnvms7+PkgovWttcpbO0RlLr1s0Uno0D0jAt 5 | 7KUGNN4//n8hKsojZ6ZI+7pzsk/0NathOQRNYcdb+AFf71T3yJhef1d5GmXHA7iV 6 | wA6AfrFTEQ7SaimZXEGGpFXzb3rPsVnryOEbTOXno3B7nNjZTUpjkW/APkvJueUk 7 | BIFCWH9rL1txRKWhKg8f6YT+l6HQFn+qu1Z3/MoqxCn6HvUxExA1mwNbzfvNaDTt 8 | l04jNVG6NqZyGhivuDnpyonnmwKySryKVvGrWn6b5SfgPPQYQJTWK3c7npSPjKpO 9 | ydzWOvISS55vBKLbB7g69g8ah3FHEw== 10 | =fcEr 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT0ovgf/aejEen2MEvJTF1Tjg24rK1jZAYqmgGi8H2b26h7ZEd/le2jWs6VpPmvv 5 | DX3pyaKFyOZXpU8SOkoPgi021VIt9LLWPlxMgcWlb6EWg8xw70PXISbUFy3IcxRi 6 | I14uAUXoFgIOT6jPt659kdXLNtYRsS3nQcBgJTIz6axHk2t5tD3TRf4xcLCyuVGv 7 | /obkTwpLr2jdPBxgTe+oDPjCnOyI6YeN0dKq4aiGBI/xECNpitbzmYQA2FQ+WvsG 8 | qq+1n/eAZAzAUWumxLna9ov1O0f6cY9d9hxWMTe2L4/a7B6KezF0CPnShFaC6pCV 9 | 98aamE5QxBmSeQtmRdI75WFHJ1h0Vg== 10 | =0M4U 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT2SwAf/SDu2XlOfyL+oTidHItm3DmLsRY0xU2d5siCuasxxpzIPG+O5f3o7VeNS 5 | pKUctb+Vbx7Za+tPYts4ztG+bqVUVZbtn9ERWCXAvuuAnbJMxIl4D7HXahZPJKtl 6 | UrpKgA+45p2NLB9MK5B9QkmZInxF0ex3IUkc6e3MN8pmcefcjjDpoEvWKlc+ocEA 7 | /ySwMcH38FRYB6XbwsAjdXm7jiLpA9ZA5MdfZzjmm3nRBDzujBjU/Pv1+PFPH4Lh 8 | rfAS5+HOvWLQwt5kKyr8w3GzfbWT7FF7z024x0rT6mo0chOMe33Ng/AOYSGFzisJ 9 | OrJieiEosNjdcFbfuvspQFsI0cRU/A== 10 | =dgpO 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT1eXQgAhIYkhiSoV4lFMPT9GuN4OjkoQC+v9ev8HkmIdq8lpoB+StIYzI35hKLU 5 | kfm5d2aeVo7ifDdXh642p9oEXRfuDPfaLd9u8SZZBAdo4rolQZr4bl+JaUFzR79i 6 | nRozXQeJF1UrDUKMi0+YGQxlosTbdx7Romj2UdfEmL2ACetxxR3rQExgZl4O/OUm 7 | PHJtIrzO1xdbVxtKelILJ4D/PauqEqcqzC2gI5vObZJcRgxDU/wc2CVN9jruv07h 8 | UW+8IEFV8vexoHo+Kq/F9xaTW2b7oXnvfOJgWRbh3zGpxSluJwVINDyX39/ym/Dr 9 | FIO6BPWFKQPEUW2cY6C69jj7S+v8Ig== 10 | =PYoG 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEyBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT0bmAf4+WOg0xkoyRDXf/1hFOXlimKqyF1K7I6PXx1dFokRr+tvOtfFZucCOf+f 5 | 1hCvnBiPTQwwMPCgll0reTsH2nHfDVUcbugpxVDC3Yza0x3gHudBhPC7yv+osNIu 6 | sVlnMRYbG1RQGjE6BxHoBk9pdOcwgN7zk2Y4LfAbOKMTo7dhAjZavRx3aShEUwHy 7 | P9/kfxcWCL0tOSzWg5XpZuxFEdVMWNJvshFvP0j2/Nlr6ZL5o/AwtyZKMiZ8QcUb 8 | 0satLj501JYI6pM2cm8N17T94+jCsQXZic/hUCNteXA4XbRcDBR2wQLd08/Ht0U4 9 | rHzZQNr5Ft5R5ScshTEVBwjcd/Kx 10 | =drUj 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3qtgf8CeDvxzi7lPghlrZtmYTTjaic4FZsGRWTPky3H24i4wSRDhG0L5sj4uPK 5 | eLLlITr5a9j26UCas9HRSthiC8+EgIMAhSN0X482SQhUZHAW67ErIvaHlwL+ixMD 6 | 0T5pmsW8PKN3lV1TFMhNYSEC2GRG/4GF+3yQA8LR+BgeEu/E5nmysIH8vuQMkOD6 7 | 3pKA8VKNBml591j6UTqxoHtPX+rThaziz3Hy3+ekf5iWslllTTGPd2SWqTvnj2Ae 8 | GvRzsbli+FEM0Aj/v8jUQnQzOz891QSvWR+fMfCqZimiJMc+GBzJ9umbcyQsB5tY 9 | e26mAoYd9KEpGXMKN4biHbJZNp1GGw== 10 | =x/MY 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3qtgf8CeDvxzi7lPghlrZtmYTTjaic4FZsGRWTPky3H24i4wSRDhG0L5sj4uPK 5 | eLLlITr5a9j26UCas9HRSthiC8+EgIMAhSN0X482SQhUZHAW67ErIvaHlwL+ixMD 6 | 0T5pmsW8PKN3lV1TFMhNYSEC2GRG/4GF+3yQA8LR+BgeEu/E5nmysIH8vuQMkOD6 7 | 3pKA8VKNBml591j6UTqxoHtPX+rThaziz3Hy3+ekf5iWslllTTGPd2SWqTvnj2Ae 8 | GvRzsbli+FEM0Aj/v8jUQnQzOz891QSvWR+fMfCqZimiJMc+GBzJ9umbcyQsB5tY 9 | e26mAoYd9KEpGXMKN4biHbJZNp1GGw== 10 | =x/MY 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0ScQf7Bip+quFq1CzDCTDxUhdTTOIpQcCfMKo1Jegpa2Hlm63XuK+6zVI9u6S+ 5 | dBXPdYeneMOqMPQUAaw3M06ZqohaDOt8Ti1EiQFGXCdOvbonTA52Lrd4EEZxwNnK 6 | BdPuIh/8qCfozm5KbZe1bFyGVRAdNyf27KvzHgfBTirLtI+3MiOdL4bvNZbWRPfh 7 | J84Ko+Ena8jPFgyz6nJv2Q2U/V3dCooLJAXs2vEG6owwk5J9zvSysWpHaJbXas5v 8 | KXO9TOBBjf3+vxb1WVQa8ZYUU3+FIFes0RFVgOWghJXIooOcWrwOV2Q8z9qWXwoK 9 | mMZ2oLS+z/7clXibK45KeRUeCX5DvQ== 10 | =5oO1 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.jar.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3d+AgAwQvlwnKQLLuiZADGL+I922/YG317N2Re1EjC6WlMRZUKXH54fckRTyPm 5 | 4ZLyxVHy8LlUD2Q10g69opb7HRd/tV0miBJhn5OU1wIM3hqTgxNp9EFckK4md45k 6 | osnhQJNDsFToxJL8zPP+KRs/aWPZs+FrRcH6k26lwLl2gTfyBDsaU11HFRVEN9yi 7 | X41obVyKiVNlc9efSSvlLtRBSVt0VhAFhck+3t61H6D9H09QxaDGAqmduDua3Tg3 8 | t5eqURuDfv3TfSztYgK3JBmG/6gVMsZodCgyC+8rhDDs6vSoDG30apx5Leg2rPbj 9 | xuk2wi/WNzc94IgY9tVS3tAfT2k6yQ== 10 | =6+Cv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1SLQgApB6OWW9cgtaofOu3HwgsVxaxLYPsDf057m2O5pI6uV5Ikyt97B1txjTB 5 | 9EXcy4gsfu7rxwgRHIEPCQkQKhhZioscT1SPFN0yopCwsJEvxrJE018ojyaIem/L 6 | KVcbtiBVMj3GZCbS0DHpwZNx2u7yblyBqUGhCMKLkYqVL7nUHJKtECECs5jbJnb9 7 | xXGFe0xlZ/IbkHv5QXyStgUYCah7ayWQDvjN7UJrpJL1lmTD0rjWLilkeKsVu3/k 8 | 11cZb5YdOmrL9a+8ql1jXPkma3HPjoIPRC5LB2BnloduwEPsiiLGG7Cs8UFEJNjQ 9 | m5w+l4dDd03y5ioaW8fI/meAKpBm4g== 10 | =gwLM 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2y5AgAlI4H5hwDIgVmXtRq/ri7kxEJnC9L9FOv8aE9YasHAruaU1YR5m17Jncl 5 | 4guJHc+gSd3BiSx1rsI6PNxLACabw4Vy56eCRpmiFWeIkoCETBUk8AN25Q/1tzgw 6 | hHmIRgOkF9PzSBWDTUNsyx/7E9P2QSiJOkMAGGuMKGDpYTR9zmaluzwfY+BI/VoW 7 | BbZpdzt02OGQosWmA7DlwkXUwip6iBjga79suUFIsyH0hmRW2q/nCeJ04ttzXUog 8 | NTNkpEwMYpZAzQXE7ks7WJJlAPkVYPWy/j5YCV7xTFb9I/56ux+/wRUaGU5fumSR 9 | lr3PNoYNToC/4GLX6Kc2OH0e1LXNTQ== 10 | =s02D 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1/vwgAhUTLKjxmry4W3cVdfX/D/vxDTLAp5OxwJy36CZmJwsVuN9TLjPo4tRqq 5 | woiopR2oSTaJqld2pe98WlIeDJJRe4ta1Uwvg7k4Sf6YaZXm01Wufk4a835sFUwY 6 | BTWmnFYX0+dp5mLyXZmZjrAr5Q2bowRuqZd2DAYiNY/E5MH2T7OAJE2hCOHUpCaB 7 | JVeP7HcbaGYR3NX/mLq0t8+xjTPXQk/OHijuusuLQxfLZvZiaikDoOHUD6l0dlRw 8 | xcLTghG5+jd1q7noKAbUVgoEOshstfomCHZpPMj11c7KIuG1+3wRMdm+F67lkcJ5 9 | eDW2fmF+6LYr+WlEi33rDIyTk3GhlQ== 10 | =mHUe 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0QLAf/ffTpTfH4IebklGJIKZC8ZjRt4CgwpR431qNeWkY25cHmWFj48x2u9dmS 5 | ZpxN572d3PPjcMigT/9wM05omiU+4DHxGgHq/Xj6GXN1DNaENcu7uoye96thjKPv 6 | jz98tPIRMC9hYr3m/K1CJ3+ZG0++7JorCZRpodH/MhklRWXOvNszs81VWtgvMnpd 7 | h9r0PuoaYBl6bIl19o7E3JJU6dKgwfre4b+a1RSYI+A8bmJOKMgHytAKi+804r0P 8 | 4R2WuQT4q+dSmkMtgp65vJ9giv/xuFrd1bT4n+qcDkwE8pTcWvsB4w1RkDOKs4fK 9 | /ta5xBQ1hiKAd6nJffke1b0MBrZOrA== 10 | =ZMpE 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0nDQgAlfchq7/W/wubx3IR3tQs0tKiix3nZIc97zuH6sR8+r+CJe78wbmSE9Oo 5 | /z96wfzeZYNIKh2v+dBLHF7OfcPGBE7tiX07jfCa6KzjjY3hFBhW+muMP/aBRb+4 6 | itSs6F3lkZOPW2+hpSdFQ6U8Rm81cAlZv7Zk2XswwTQkJo8GcNL1w/5wAVpNK0yG 7 | VinZr8YRMFs6OYQxLqGSypDLAmv9rOaJ7aCdaKnQwYES65kC7tbe0SRZGQoDe8n4 8 | XLzpvC8rM9MXZDEN4qI+ZAANOJNVsXUmDZLDSe4ak48u/cTOokY8I6bR2k/XOhbu 9 | L+D4W7oKAE9HmzlTMusosyjNOBQAmQ== 10 | =Wjji 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT19rwf/a6sZxSDNTxN72VvsrKsHq+wMes5UUcQ+L7e5QLjaCTx2ayW2FdHMBaNi 5 | IDBBE9kxnxa/S6G6nSRARUjXowsEYZGUNLLvUjNZ4Z3g2R9XyGPaz3Ky9yWpRm36 6 | E0lFqf8aaCLpzwV2z7cfeVNYsd2gnHakphK/UiZzXFz+GYzqby/0m5Kk8Zs7rK6V 7 | /ji0bYWUi8t1jli8MfTHQtM8EUHG0nXRfEKilyoYkO3UsTEh/UN1VRpJ5DgcRC8L 8 | Zbd2zPnV15MPUzZvz3kkycUulQdhOqTDjUod9P/WoASwjDuKCG2/kquwOvnoHXJ9 9 | 9Ju+ca0s9y0jbotIygYxJXZVev3EiA== 10 | =oWIp 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1PSwf+InTdlh+BVVy3RFszEL5vN7waSPYMImXhgd5EZ1d4Lxd6EeOwtNgWNKpG 5 | E+Ps/Kw0jZDvoD49WJlcUjzDHBNHcE7C/L3GAWHV6WwklhtQaJ4EegsynWdSXz6k 6 | fqJY6r58aGKGjpKPutRWAjvfcdC170+ZRsc2oi9xrAgHCpvXzTjq4+O9Ah0t5jwW 7 | jcZ/Xubcw4vjsw774OucHbtwGsvRN5SDJ3IONOH8WCwhUP5vEEKvA6MYX0KGoTdS 8 | 3wTCyZTzU3qtTWxcbTCpiJIWbYwRR7TzLB/uydWHlAMzuz6coIiBpYsGiO6wkmfg 9 | W+QvcE7wyW2jtb22pCImLyObyZ21VA== 10 | =VjDv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2HQgf+MTUEnwzXK4zi76VI7C5cchGan26lIA2Ebq4vtYGKDqNSISOAAdWs9+nT 5 | U6ZA6OIFo5qdeD6F/45s91IoDbxbhMDMFEsSijKASqiuZN5TZM1U2h2kWFAl/sEl 6 | EI1RTygn+xDw/ah4V3/duuMFC+jRgvJ/LgemIF4KBvECWaTQKNu0fu5d4dPXMpp+ 7 | jrxMEZPQZsivpOvklzV8O7wAkf/ZQhJdcB2m8uOfSPlJ91a4EEtXF9/GzzkXUi1P 8 | bzt4NsmOag3227B3mO1Bc6yZdDBNu8wQ9apiJVCpqsxB9Dz0PCL4dHNa1u9g6Xo6 9 | ElRgneV4HZp+LB125VoNabKuNH00bw== 10 | =2yDl 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3OcAf+OJv0t0rhNnJcF656mem5qv3fvcJKkPqyKF9I0TiP33W61/ntrGezdaDX 5 | tLde1MFRto3HS0/U0t6NqfMNTXYcQ5vH/qqnIRWP7Iv/t7f+mum6pOcYkxJhhXFT 6 | 1pH0l4iqVQOBUiAJhOpUh0utLNWdZcEv+DdxgtFbFyaEDmg46Cpy9YtAH6XKEh5d 7 | ZZeiX/+XC+Ufx1bReDLHvFjUyQa/Lv8rEthX2eBmAXkoPwJG0LA9xF6X8leB0DI/ 8 | 9a1KiNcmRSSUarLpqV/hE6oQggGeMLVoJ+51klunRAfiXw6h2m9gRlnWikLjC+23 9 | /E2m+7Gb0Kc4izXIdHTqS2fYPMHsyw== 10 | =h486 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2Umgf+K57ogLEAGx/40dFOV0yiGmvCXwywMCVbnMXCA85Ceti0TGFY6T0EaJXy 5 | wF7QQ0SW56svIxX/U58IVocWuaVRJA7tCZF1u9DCvafdYDJeM4iHHVu6GzM1Tng2 6 | JFYV4q5MtT712rCrcf7ZH3MntYawsGjBiF9IHWwvSNUyf53W7L4VSWcpv0tfPLra 7 | EeC7ztnnDXgi32FSpXvu27mDPbrQLibihUZBjoZ4uuRU2wB6HICJ90JjoYtK6JoC 8 | ToEZY4jFLkEmQ8dy0KUa5rhUDWJ+Bq+bYHhwMXl9HQUKZuqjvlmHCRHIsJgdU+Cl 9 | i5NPJkXhCZOs9tD3hf3NdeD9ef72kQ== 10 | =PraK 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2j8QgAiciViDfKLAv2rYMyBJbyQjK29fpG78NMsKw+j3zWwJEPlPuZhIT0/KWQ 5 | 3ipcYbtBoKYrKSG54uzPflGAQoostMYV+XtJ+0fjICsNDpKjfhuDWojaWkxnF1KD 6 | NcWSiapNO6iX0s62yaL/netVVsHsE5fVr//IG6WDTrJK2GEkOQAoca2W8ixI3G0s 7 | kTIJEmCMA9ZOUMKBwwtJ0NPEZPxe1N/R6SuGWGdkWlrqPRmA6lnY153zH3vJ6pqF 8 | RM1Phwpt46l3o20D5wOhqU8jvV7b5HUZ50sHV0sJOMUbwvFyrhIOzJLMixk1WJhR 9 | lnudbpWPssTJO3Fiv67b/iADaBaIbA== 10 | =4CYs 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT1IkAf+N8ts9K88PC/dISZMWSrgRbSugd6VRG6pto6jsp9cJBzTzQ6C8psMkXcN 5 | qX0fnLBn4Zn1dovxRIrA8QeT/vxHMl1X0Foe6SUTMjK34Ofq4V1FVlhuJIi0YZrP 6 | L7B4cKTkv1ndwSVgE23zkynfaIPiPl1uZOwDmlpArokqnjSiUq9NndtKf87NwekW 7 | hbf7brgfZddeDj9xhAn5hz2pHUhx/uH9tOX3JlZgE+yATZsGm6Z9BSf4Lur0W85P 8 | hrJ+MfuYPzZ3n7okuaQdMT3QIqe3FO+dfGZKwakw2NWfgWP3LZsQ5rbyxBlyH7CG 9 | JA/VAIIqe99ftHcBFRGB6C9hMn4FcA== 10 | =prNt 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT1IkAf+N8ts9K88PC/dISZMWSrgRbSugd6VRG6pto6jsp9cJBzTzQ6C8psMkXcN 5 | qX0fnLBn4Zn1dovxRIrA8QeT/vxHMl1X0Foe6SUTMjK34Ofq4V1FVlhuJIi0YZrP 6 | L7B4cKTkv1ndwSVgE23zkynfaIPiPl1uZOwDmlpArokqnjSiUq9NndtKf87NwekW 7 | hbf7brgfZddeDj9xhAn5hz2pHUhx/uH9tOX3JlZgE+yATZsGm6Z9BSf4Lur0W85P 8 | hrJ+MfuYPzZ3n7okuaQdMT3QIqe3FO+dfGZKwakw2NWfgWP3LZsQ5rbyxBlyH7CG 9 | JA/VAIIqe99ftHcBFRGB6C9hMn4FcA== 10 | =prNt 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT104Qf+NG6IUBLo7eTPtPzWyNs9bShrJR759atbY9kBOrRfyoBM/hWrcr6pG4e5 5 | BmBPULkuBWLVM+Ra52B2S96848oiaLLEuiWlMudWRsWCxyVknjm9EKlMHA3VdQtu 6 | 8grrPKS4mIwSvdzAEEeqR+mwtWXHlz+jc/R9NeQhNmmcNZv1nkyzCuoNCH/HMTl4 7 | /ei6enpYrYNnMrNz9TOMQ67sCtZEm6TaxlqS+9h/V9TEnq6+1qXEt4c+AsqQdMWH 8 | 3BZREzXHFocQciSEXfL6m07pnNlnvCcjsM2SAqTeTqQupEmqFGkhL2blE1VMdplW 9 | fDCC/ee5JYVyyUXpzydSjCYwFbO3NQ== 10 | =gSEv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.jar.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3d+AgAwQvlwnKQLLuiZADGL+I922/YG317N2Re1EjC6WlMRZUKXH54fckRTyPm 5 | 4ZLyxVHy8LlUD2Q10g69opb7HRd/tV0miBJhn5OU1wIM3hqTgxNp9EFckK4md45k 6 | osnhQJNDsFToxJL8zPP+KRs/aWPZs+FrRcH6k26lwLl2gTfyBDsaU11HFRVEN9yi 7 | X41obVyKiVNlc9efSSvlLtRBSVt0VhAFhck+3t61H6D9H09QxaDGAqmduDua3Tg3 8 | t5eqURuDfv3TfSztYgK3JBmG/6gVMsZodCgyC+8rhDDs6vSoDG30apx5Leg2rPbj 9 | xuk2wi/WNzc94IgY9tVS3tAfT2k6yQ== 10 | =6+Cv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT375Af+L1KawLLikLiiC6R2BCxufjcLHEzxh0RLjgDHpHXy8s/Bh5GgkTT4x/Hn 5 | gGJNT3Yz18rzpZaLnvNR/J9wOFEzLxRsgl1rumvTrrwhbIjac774oj3Z8Zv+W1T8 6 | KN1mtfUSLDZSRbmY0YByvPVtag1+FaIifxmIIFLny+xDzRVD1OZ38gOaxz91nqmd 7 | pgjR2eVmeYLX3oAIApVopYdKWXNwOMzdBQbNroPRKCOesmTqQi0sjuvgN7r5JoxN 8 | 9vVzF1SFnAKnw/LQqL0KMrRzCBd+ncUk7A6D6RB0MM0V+TB9am9CsatxflRgQY+c 9 | vzu/BHY8k6lh44TECvAuNuSr01CkPA== 10 | =awJx 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT1ubAgAtWXXzqRDIC+DhAaY3IfHyM/Dmlj58jLhTzta4xKQe9HykEjBlpkPSscp 5 | 9R+O2aL4xfBUmKtVLORKoGN3oUPhdU8a5vfgI2itdDPWLkOfFE64OJtIOZKp4ST4 6 | i00Jsqd4GFryS3r+i5FL5MCCv+zG/OkylMIfcH1XVxynvwrJVY49Do+TmW4MOIFf 7 | 4uDOd29XmEc8vCJBd3VZu0epHqcXhdiQy0ekdl3NdUimzRuXAckNhGNMoLWYhKaw 8 | voErlAtfDHMbYU1DebguEaiLi98N6IxX1aO0Lleg3JNveD7pLCjEEf7AW+7TYoz1 9 | QBvHABpVHzZ7Rg5VhZNIIrQ38zyZdg== 10 | =kz39 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT3njggAl61MfkbtByxMKX8fQo5Jqp+vtvyZoaDZj+6FKr0xust5Wr4Fi+4+7fkj 5 | KyXFCTZUTd0xokRNpC8bxeZhhVkeG0pq6DrTr5BTvJLMJwPWVvrtn+bzDN1FvMia 6 | iZqcOlWtbwTdcosmBxXtxwI1gavwFhHUGudBzrBs85qkMkDz9BH8Egb+z/owFfPh 7 | lB9NSzezj4axgr745Ov5gYCwZp44iDBTcLZDWSLGMTuC6VdrLTQVsNLxouGI/67E 8 | 0oqLmlaqfWZEJktTMk0LHG5ymy0g40Gm8r2kuxRnFEDVJwXSfJRiTvxifB+YoEHp 9 | RAcpReQe8+iSStuGEKYmfwmyXTdXAA== 10 | =759w 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT1H5wgAnmHJRXH+f1cZLlLKqMv7JMbuSFha3XsDPeL/XIEXmD9zj/R8IE7EKmpS 5 | uwkswZaOeIyc95J4FasxiZm5CExxzRSTQfXtK2lOl/7Gp84D+D6XXI28CUIRnOfo 6 | SeOyCFk2U3a6uTsRgi1FSnJRvLCs+0tB+bByKuVgGbfQdF0mtQ9rCxlqKKVa/dz6 7 | ertOXtz1A7fiLV44ovZG27GOciRJbogBmWfmNGPaQ+Ry8b8ICPf3SDdNSpp/nG2i 8 | YZxzIyX9xabzPGg7M1d4ClhrpJQRjJD1hJRIHCkwC8f8Y544iQ/MuAwd3hNIfjWP 9 | GJjgOl0iYjO8LPVaRdrHFkBUntVdHQ== 10 | =tlE4 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3w3QgAvHS75cBMEEZGWiCQ+lbwDMWY7rjQBwkpO1Sj6WxpKcWD2F4YmNni1z1k 5 | L71SDuLP0a+IbYcoDCkss7vxH6hx6Lm53e+2WwhaVGCO1A6N3a56rFyEFlATrn31 6 | mcRjLrN4wzysqqbeamzSt+R0UoWj7yiihtBuz7tkhjGP+df2qCrXNeuetrhukFOz 7 | P5RLd4PURYMMUMqqNZ8JNnRhdCVdSVUpfM+BDolNDaswDrvOI3jzjXD/6HCt0fcN 8 | Pt484kFDqGEx0iXvv+7shiExs31gex+fsn2ta9yOGYluF/8Rc4z+X0/59MewoCgC 9 | EelPT4oi4zirrIWzGp1bRF+jDi6feA== 10 | =stbf 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT3p3QgAp5doWrX6eMPD1I09NHMt29LI8wFa/xld7rof8OQLHDN55TLseqOvBU4V 5 | E82s5cm4Uk0ndnth/VUHqsJK6SsNX8/0N2bvOtWgUWBYdClcy6ZBWXjQIDFfCdqX 6 | LPqQN4nOT3ZZMrzTZhLsAJkbzvVaOzEtUYZWw1ZAIT8nPkud24stuuxKUtsAxfeD 7 | QqcgKng/sPx6DS2+NSmmzyCF9eSL70NBcBF6+RJ+4X0YtZRtX+wsic2MnKnVAnyX 8 | hPejxguJYhwWbn1yRdVWknCdffpiT09IC/7AS/yc8s1DdbS6XEae8uFl0OB5z5dx 9 | nnaHUvlFrAjDGsrYeW5h1ZkM8VwBxA== 10 | =2HWi 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1PSwf+InTdlh+BVVy3RFszEL5vN7waSPYMImXhgd5EZ1d4Lxd6EeOwtNgWNKpG 5 | E+Ps/Kw0jZDvoD49WJlcUjzDHBNHcE7C/L3GAWHV6WwklhtQaJ4EegsynWdSXz6k 6 | fqJY6r58aGKGjpKPutRWAjvfcdC170+ZRsc2oi9xrAgHCpvXzTjq4+O9Ah0t5jwW 7 | jcZ/Xubcw4vjsw774OucHbtwGsvRN5SDJ3IONOH8WCwhUP5vEEKvA6MYX0KGoTdS 8 | 3wTCyZTzU3qtTWxcbTCpiJIWbYwRR7TzLB/uydWHlAMzuz6coIiBpYsGiO6wkmfg 9 | W+QvcE7wyW2jtb22pCImLyObyZ21VA== 10 | =VjDv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2HQgf+MTUEnwzXK4zi76VI7C5cchGan26lIA2Ebq4vtYGKDqNSISOAAdWs9+nT 5 | U6ZA6OIFo5qdeD6F/45s91IoDbxbhMDMFEsSijKASqiuZN5TZM1U2h2kWFAl/sEl 6 | EI1RTygn+xDw/ah4V3/duuMFC+jRgvJ/LgemIF4KBvECWaTQKNu0fu5d4dPXMpp+ 7 | jrxMEZPQZsivpOvklzV8O7wAkf/ZQhJdcB2m8uOfSPlJ91a4EEtXF9/GzzkXUi1P 8 | bzt4NsmOag3227B3mO1Bc6yZdDBNu8wQ9apiJVCpqsxB9Dz0PCL4dHNa1u9g6Xo6 9 | ElRgneV4HZp+LB125VoNabKuNH00bw== 10 | =2yDl 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0ScQf7Bip+quFq1CzDCTDxUhdTTOIpQcCfMKo1Jegpa2Hlm63XuK+6zVI9u6S+ 5 | dBXPdYeneMOqMPQUAaw3M06ZqohaDOt8Ti1EiQFGXCdOvbonTA52Lrd4EEZxwNnK 6 | BdPuIh/8qCfozm5KbZe1bFyGVRAdNyf27KvzHgfBTirLtI+3MiOdL4bvNZbWRPfh 7 | J84Ko+Ena8jPFgyz6nJv2Q2U/V3dCooLJAXs2vEG6owwk5J9zvSysWpHaJbXas5v 8 | KXO9TOBBjf3+vxb1WVQa8ZYUU3+FIFes0RFVgOWghJXIooOcWrwOV2Q8z9qWXwoK 9 | mMZ2oLS+z/7clXibK45KeRUeCX5DvQ== 10 | =5oO1 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-javadoc.jar.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3d+AgAwQvlwnKQLLuiZADGL+I922/YG317N2Re1EjC6WlMRZUKXH54fckRTyPm 5 | 4ZLyxVHy8LlUD2Q10g69opb7HRd/tV0miBJhn5OU1wIM3hqTgxNp9EFckK4md45k 6 | osnhQJNDsFToxJL8zPP+KRs/aWPZs+FrRcH6k26lwLl2gTfyBDsaU11HFRVEN9yi 7 | X41obVyKiVNlc9efSSvlLtRBSVt0VhAFhck+3t61H6D9H09QxaDGAqmduDua3Tg3 8 | t5eqURuDfv3TfSztYgK3JBmG/6gVMsZodCgyC+8rhDDs6vSoDG30apx5Leg2rPbj 9 | xuk2wi/WNzc94IgY9tVS3tAfT2k6yQ== 10 | =6+Cv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1PSwf+InTdlh+BVVy3RFszEL5vN7waSPYMImXhgd5EZ1d4Lxd6EeOwtNgWNKpG 5 | E+Ps/Kw0jZDvoD49WJlcUjzDHBNHcE7C/L3GAWHV6WwklhtQaJ4EegsynWdSXz6k 6 | fqJY6r58aGKGjpKPutRWAjvfcdC170+ZRsc2oi9xrAgHCpvXzTjq4+O9Ah0t5jwW 7 | jcZ/Xubcw4vjsw774OucHbtwGsvRN5SDJ3IONOH8WCwhUP5vEEKvA6MYX0KGoTdS 8 | 3wTCyZTzU3qtTWxcbTCpiJIWbYwRR7TzLB/uydWHlAMzuz6coIiBpYsGiO6wkmfg 9 | W+QvcE7wyW2jtb22pCImLyObyZ21VA== 10 | =VjDv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2HQgf+MTUEnwzXK4zi76VI7C5cchGan26lIA2Ebq4vtYGKDqNSISOAAdWs9+nT 5 | U6ZA6OIFo5qdeD6F/45s91IoDbxbhMDMFEsSijKASqiuZN5TZM1U2h2kWFAl/sEl 6 | EI1RTygn+xDw/ah4V3/duuMFC+jRgvJ/LgemIF4KBvECWaTQKNu0fu5d4dPXMpp+ 7 | jrxMEZPQZsivpOvklzV8O7wAkf/ZQhJdcB2m8uOfSPlJ91a4EEtXF9/GzzkXUi1P 8 | bzt4NsmOag3227B3mO1Bc6yZdDBNu8wQ9apiJVCpqsxB9Dz0PCL4dHNa1u9g6Xo6 9 | ElRgneV4HZp+LB125VoNabKuNH00bw== 10 | =2yDl 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0ScQf7Bip+quFq1CzDCTDxUhdTTOIpQcCfMKo1Jegpa2Hlm63XuK+6zVI9u6S+ 5 | dBXPdYeneMOqMPQUAaw3M06ZqohaDOt8Ti1EiQFGXCdOvbonTA52Lrd4EEZxwNnK 6 | BdPuIh/8qCfozm5KbZe1bFyGVRAdNyf27KvzHgfBTirLtI+3MiOdL4bvNZbWRPfh 7 | J84Ko+Ena8jPFgyz6nJv2Q2U/V3dCooLJAXs2vEG6owwk5J9zvSysWpHaJbXas5v 8 | KXO9TOBBjf3+vxb1WVQa8ZYUU3+FIFes0RFVgOWghJXIooOcWrwOV2Q8z9qWXwoK 9 | mMZ2oLS+z/7clXibK45KeRUeCX5DvQ== 10 | =5oO1 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0-sources.jar.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3d+AgAwQvlwnKQLLuiZADGL+I922/YG317N2Re1EjC6WlMRZUKXH54fckRTyPm 5 | 4ZLyxVHy8LlUD2Q10g69opb7HRd/tV0miBJhn5OU1wIM3hqTgxNp9EFckK4md45k 6 | osnhQJNDsFToxJL8zPP+KRs/aWPZs+FrRcH6k26lwLl2gTfyBDsaU11HFRVEN9yi 7 | X41obVyKiVNlc9efSSvlLtRBSVt0VhAFhck+3t61H6D9H09QxaDGAqmduDua3Tg3 8 | t5eqURuDfv3TfSztYgK3JBmG/6gVMsZodCgyC+8rhDDs6vSoDG30apx5Leg2rPbj 9 | xuk2wi/WNzc94IgY9tVS3tAfT2k6yQ== 10 | =6+Cv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3qtgf8CeDvxzi7lPghlrZtmYTTjaic4FZsGRWTPky3H24i4wSRDhG0L5sj4uPK 5 | eLLlITr5a9j26UCas9HRSthiC8+EgIMAhSN0X482SQhUZHAW67ErIvaHlwL+ixMD 6 | 0T5pmsW8PKN3lV1TFMhNYSEC2GRG/4GF+3yQA8LR+BgeEu/E5nmysIH8vuQMkOD6 7 | 3pKA8VKNBml591j6UTqxoHtPX+rThaziz3Hy3+ekf5iWslllTTGPd2SWqTvnj2Ae 8 | GvRzsbli+FEM0Aj/v8jUQnQzOz891QSvWR+fMfCqZimiJMc+GBzJ9umbcyQsB5tY 9 | e26mAoYd9KEpGXMKN4biHbJZNp1GGw== 10 | =x/MY 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3qtgf8CeDvxzi7lPghlrZtmYTTjaic4FZsGRWTPky3H24i4wSRDhG0L5sj4uPK 5 | eLLlITr5a9j26UCas9HRSthiC8+EgIMAhSN0X482SQhUZHAW67ErIvaHlwL+ixMD 6 | 0T5pmsW8PKN3lV1TFMhNYSEC2GRG/4GF+3yQA8LR+BgeEu/E5nmysIH8vuQMkOD6 7 | 3pKA8VKNBml591j6UTqxoHtPX+rThaziz3Hy3+ekf5iWslllTTGPd2SWqTvnj2Ae 8 | GvRzsbli+FEM0Aj/v8jUQnQzOz891QSvWR+fMfCqZimiJMc+GBzJ9umbcyQsB5tY 9 | e26mAoYd9KEpGXMKN4biHbJZNp1GGw== 10 | =x/MY 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0ScQf7Bip+quFq1CzDCTDxUhdTTOIpQcCfMKo1Jegpa2Hlm63XuK+6zVI9u6S+ 5 | dBXPdYeneMOqMPQUAaw3M06ZqohaDOt8Ti1EiQFGXCdOvbonTA52Lrd4EEZxwNnK 6 | BdPuIh/8qCfozm5KbZe1bFyGVRAdNyf27KvzHgfBTirLtI+3MiOdL4bvNZbWRPfh 7 | J84Ko+Ena8jPFgyz6nJv2Q2U/V3dCooLJAXs2vEG6owwk5J9zvSysWpHaJbXas5v 8 | KXO9TOBBjf3+vxb1WVQa8ZYUU3+FIFes0RFVgOWghJXIooOcWrwOV2Q8z9qWXwoK 9 | mMZ2oLS+z/7clXibK45KeRUeCX5DvQ== 10 | =5oO1 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.jar.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3d+AgAwQvlwnKQLLuiZADGL+I922/YG317N2Re1EjC6WlMRZUKXH54fckRTyPm 5 | 4ZLyxVHy8LlUD2Q10g69opb7HRd/tV0miBJhn5OU1wIM3hqTgxNp9EFckK4md45k 6 | osnhQJNDsFToxJL8zPP+KRs/aWPZs+FrRcH6k26lwLl2gTfyBDsaU11HFRVEN9yi 7 | X41obVyKiVNlc9efSSvlLtRBSVt0VhAFhck+3t61H6D9H09QxaDGAqmduDua3Tg3 8 | t5eqURuDfv3TfSztYgK3JBmG/6gVMsZodCgyC+8rhDDs6vSoDG30apx5Leg2rPbj 9 | xuk2wi/WNzc94IgY9tVS3tAfT2k6yQ== 10 | =6+Cv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0xjQgAwJcUWVwcl3PI7FhRUoPaPfqaoG3bUPwLePYuf++qPCNUDOmnq0aXtqbr 5 | Ul9SxQRDy9D7ygCWVCTVXRjg0HHZQT/ZYB7lhaDLxMEpV25q9acJAZ4qzbn8vRAG 6 | FqlqYaSlIDducapPUGWAOF/xwhf5k8tIGO5p0hY4wdU3b+0YU1w5DavYOetTZ26Z 7 | jwVagOj/6WFIHnu6PwXGkynqxui8dnsld23eamOZYsfR19weTNh0GT3ncl8y03eP 8 | Wy6CkFxzN0kvSdze0nAfO9dygpRxh7nNbz/uJhTFP4pDwz5iE8FBiUXZLkxTZ8YJ 9 | lvIKuS+JnUTEQcd00/nAL4cncMiJIQ== 10 | =lQP9 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3urQf/W31jKnVjCIckj7XFbeucazmVr0K73LNpg0eQwqqz877KKmBDV8qn8b3o 5 | MTBDgUn/9LMJzUSWRFV+CkM0cgAG0s8vmzeymtH6RWv+ikHh/3Ky4sYxd9Pa3Ipo 6 | zeeIqyJk1dysfcLLsP1ml6ayh8VM/DK+DDc4CU9wrEGAUDeVIFiTw7DrMIB7PcdG 7 | ru7z6J/jcIA55RiJMDvuqhS+Obx/JUrmqDrrK8Npp9stRP+RpZpF1AKGgg1dfLo1 8 | bKw+KYuMhK7Kq7nIg9GqZvhr46oOKko5NF2l+GfVR14Gdb330/88t/IxwJvsUiCC 9 | sWQTrGJb062N5oHGtdoZ3mXLo7bnuw== 10 | =+snH 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT14OggAlf9eyYFV3HRC7LoeM1Q9LrkYZUIDIUkukUxDxBTGPLf739qZtHgUl6lC 5 | yUCQqGswhuuwR8s7ht2MDMp8isjs1j7inpAQA3kYgHOCUMjYlIyhPdIxHtQ8WD+S 6 | CwW2nHtf7tXFrhKFecqolKyp+qZYWx1anMmbLggyaXWZmiIwhIHLxIogbyjVLdkD 7 | 9qUAKCUpEvyNqogyYYtAjJERRzw9RN4lwnpm/uEkKtFQVoxui2VQr/DEbzooXu8A 8 | mqKkUBbgf9uxH5s+pUuUgbl+XZnPLGzJV6NcFe/jpsvEzHkUQzAsVnNnCWAPreY8 9 | RTfj2eGleFWESIiMFUAp6U0an5GoOQ== 10 | =T+Cv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1HGQgAuINmQJ5vpFWWmXbIrEVf5+fTKq72R7gXdJ9XHYgQdSyKoeUUy3FElqfI 5 | 55gyiLk1OMMy6Pd1HKi0bczOUOlz8K34uMXcT+ctm41Lp6243FfLm4iy1x/DWlHb 6 | IWksIG1TRf7g0b//OiBbbaesjnc5QK1rft6T4KiEPD9NtOi/8ON7vVu0S9oERUGO 7 | 32Zwu/wGZeKztUoXVQ/zZk5UA9hYE/7C5bX3dRBS038luv7YZKe3313PfVj29vdx 8 | bsfRIcH/qIe//WL3OTTbaOvSgOs8qvJHPN8NmdH70GbZ2W9jTe7KrIlb8FBEaPEj 9 | BbLov9td9qxXlRxyBhLYRB7MN4rsKw== 10 | =qIiQ 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3Pwwf+IikjoDdjeMQfmERTN4Gjirx9+fler+Gr5JYC78OxLrB8uq0tn11wEJMQ 5 | ZDQe83OYjEkFQhPn6yQ5bc9edZTJztQJcGpVe7NkYffS4geo+ahuksaQWMF9opEc 6 | OqBB5fTWVt18qGFTI2F3CEDIo38muTgkzndFuzmcbVhAcknF5ybcVDIFpZNlnqe/ 7 | xflD6lupXWXQC4nE4n2EVhNnmkiF9nKRJWwEJ1hoy1gwTxSYmnO/BLn8ob4tswnc 8 | gHnj4Yp7qoV/SnRnfNDHMPQMfzAwq1jucjjPOt3xkw17UIGBnrP1zAxeZFmarCTO 9 | YjJt5PUNwtqOVHlHzwgn3b3FGRJe3A== 10 | =AU99 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0bBgf+Nm9vooXNKE/z4cNeFqiHwLb+gMxvqlKnl/+03KbuFvlDUwdqSxfnHQZ3 5 | qfCBtIe6MN/0I5FCNRCcFxiCjCPDqSMAcvRPU5UOG2M2W0uvcqMwKO6KRGBLd65J 6 | MulDxoe7LrEk6KwNYfecxCtXBvLwzwQd3A10tcQOVl66neF/g+9jEc+MHJPa1xi5 7 | 4pDOo3TQ4EpGfB8eF9Z+7YKc9hPYBFsm+n3P6SYcVAiRUiNBE8gCOvvZE9mOTQAo 8 | yC80AfDjXe/YBsd3a79hVW+ESQAKfK8S1RzO+c5GhIZCIJFdSJDOeww86O4U0n5g 9 | 6hIXRNWUFUEueAvQ2dYHZujQSBxNig== 10 | =t5De 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT3jzQf8DUis2+v7616JWRpUziEnpnvms7+PkgovWttcpbO0RlLr1s0Uno0D0jAt 5 | 7KUGNN4//n8hKsojZ6ZI+7pzsk/0NathOQRNYcdb+AFf71T3yJhef1d5GmXHA7iV 6 | wA6AfrFTEQ7SaimZXEGGpFXzb3rPsVnryOEbTOXno3B7nNjZTUpjkW/APkvJueUk 7 | BIFCWH9rL1txRKWhKg8f6YT+l6HQFn+qu1Z3/MoqxCn6HvUxExA1mwNbzfvNaDTt 8 | l04jNVG6NqZyGhivuDnpyonnmwKySryKVvGrWn6b5SfgPPQYQJTWK3c7npSPjKpO 9 | ydzWOvISS55vBKLbB7g69g8ah3FHEw== 10 | =fcEr 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT0ovgf/aejEen2MEvJTF1Tjg24rK1jZAYqmgGi8H2b26h7ZEd/le2jWs6VpPmvv 5 | DX3pyaKFyOZXpU8SOkoPgi021VIt9LLWPlxMgcWlb6EWg8xw70PXISbUFy3IcxRi 6 | I14uAUXoFgIOT6jPt659kdXLNtYRsS3nQcBgJTIz6axHk2t5tD3TRf4xcLCyuVGv 7 | /obkTwpLr2jdPBxgTe+oDPjCnOyI6YeN0dKq4aiGBI/xECNpitbzmYQA2FQ+WvsG 8 | qq+1n/eAZAzAUWumxLna9ov1O0f6cY9d9hxWMTe2L4/a7B6KezF0CPnShFaC6pCV 9 | 98aamE5QxBmSeQtmRdI75WFHJ1h0Vg== 10 | =0M4U 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT104Qf+NG6IUBLo7eTPtPzWyNs9bShrJR759atbY9kBOrRfyoBM/hWrcr6pG4e5 5 | BmBPULkuBWLVM+Ra52B2S96848oiaLLEuiWlMudWRsWCxyVknjm9EKlMHA3VdQtu 6 | 8grrPKS4mIwSvdzAEEeqR+mwtWXHlz+jc/R9NeQhNmmcNZv1nkyzCuoNCH/HMTl4 7 | /ei6enpYrYNnMrNz9TOMQ67sCtZEm6TaxlqS+9h/V9TEnq6+1qXEt4c+AsqQdMWH 8 | 3BZREzXHFocQciSEXfL6m07pnNlnvCcjsM2SAqTeTqQupEmqFGkhL2blE1VMdplW 9 | fDCC/ee5JYVyyUXpzydSjCYwFbO3NQ== 10 | =gSEv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-javadoc.jar.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT0XdAf/feMRtW2BUz84x43aYLaERIEPx2TsqMUwVcov6sp5MWaSAJEX2vrscCRB 5 | K/7x4N3dxnrckc3sBF1hs+zrRwySYU1FyGVIxQxdeURnUWxCva0uOWj91jcUOIkA 6 | gpmOZZj51b4SkB6GZjtvN/Z3B4xzEPmTPfKFiBZPhuYW4HiC8FHM1JnlW6h2xoj6 7 | Bja//qoj9ccfRjiMnnI0iPgZNiyR8n8+EJGi0ykizxkiT6cWI84kZ+JQYooDHbCf 8 | NgPt2NjcGzd6SGrQW8/0td0N+xDRfLpTrbfTmlC5hikXmS0e79BV6W0eYcWcgDni 9 | r8WjbDmomHHFDhT8p1R+tGtd8p2txg== 10 | =BHvx 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1PSwf+InTdlh+BVVy3RFszEL5vN7waSPYMImXhgd5EZ1d4Lxd6EeOwtNgWNKpG 5 | E+Ps/Kw0jZDvoD49WJlcUjzDHBNHcE7C/L3GAWHV6WwklhtQaJ4EegsynWdSXz6k 6 | fqJY6r58aGKGjpKPutRWAjvfcdC170+ZRsc2oi9xrAgHCpvXzTjq4+O9Ah0t5jwW 7 | jcZ/Xubcw4vjsw774OucHbtwGsvRN5SDJ3IONOH8WCwhUP5vEEKvA6MYX0KGoTdS 8 | 3wTCyZTzU3qtTWxcbTCpiJIWbYwRR7TzLB/uydWHlAMzuz6coIiBpYsGiO6wkmfg 9 | W+QvcE7wyW2jtb22pCImLyObyZ21VA== 10 | =VjDv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2HQgf+MTUEnwzXK4zi76VI7C5cchGan26lIA2Ebq4vtYGKDqNSISOAAdWs9+nT 5 | U6ZA6OIFo5qdeD6F/45s91IoDbxbhMDMFEsSijKASqiuZN5TZM1U2h2kWFAl/sEl 6 | EI1RTygn+xDw/ah4V3/duuMFC+jRgvJ/LgemIF4KBvECWaTQKNu0fu5d4dPXMpp+ 7 | jrxMEZPQZsivpOvklzV8O7wAkf/ZQhJdcB2m8uOfSPlJ91a4EEtXF9/GzzkXUi1P 8 | bzt4NsmOag3227B3mO1Bc6yZdDBNu8wQ9apiJVCpqsxB9Dz0PCL4dHNa1u9g6Xo6 9 | ElRgneV4HZp+LB125VoNabKuNH00bw== 10 | =2yDl 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1sACgkQmix6mORX 4 | xT104Qf+NG6IUBLo7eTPtPzWyNs9bShrJR759atbY9kBOrRfyoBM/hWrcr6pG4e5 5 | BmBPULkuBWLVM+Ra52B2S96848oiaLLEuiWlMudWRsWCxyVknjm9EKlMHA3VdQtu 6 | 8grrPKS4mIwSvdzAEEeqR+mwtWXHlz+jc/R9NeQhNmmcNZv1nkyzCuoNCH/HMTl4 7 | /ei6enpYrYNnMrNz9TOMQ67sCtZEm6TaxlqS+9h/V9TEnq6+1qXEt4c+AsqQdMWH 8 | 3BZREzXHFocQciSEXfL6m07pnNlnvCcjsM2SAqTeTqQupEmqFGkhL2blE1VMdplW 9 | fDCC/ee5JYVyyUXpzydSjCYwFbO3NQ== 10 | =gSEv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0-sources.jar.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3d+AgAwQvlwnKQLLuiZADGL+I922/YG317N2Re1EjC6WlMRZUKXH54fckRTyPm 5 | 4ZLyxVHy8LlUD2Q10g69opb7HRd/tV0miBJhn5OU1wIM3hqTgxNp9EFckK4md45k 6 | osnhQJNDsFToxJL8zPP+KRs/aWPZs+FrRcH6k26lwLl2gTfyBDsaU11HFRVEN9yi 7 | X41obVyKiVNlc9efSSvlLtRBSVt0VhAFhck+3t61H6D9H09QxaDGAqmduDua3Tg3 8 | t5eqURuDfv3TfSztYgK3JBmG/6gVMsZodCgyC+8rhDDs6vSoDG30apx5Leg2rPbj 9 | xuk2wi/WNzc94IgY9tVS3tAfT2k6yQ== 10 | =6+Cv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1PSwf+InTdlh+BVVy3RFszEL5vN7waSPYMImXhgd5EZ1d4Lxd6EeOwtNgWNKpG 5 | E+Ps/Kw0jZDvoD49WJlcUjzDHBNHcE7C/L3GAWHV6WwklhtQaJ4EegsynWdSXz6k 6 | fqJY6r58aGKGjpKPutRWAjvfcdC170+ZRsc2oi9xrAgHCpvXzTjq4+O9Ah0t5jwW 7 | jcZ/Xubcw4vjsw774OucHbtwGsvRN5SDJ3IONOH8WCwhUP5vEEKvA6MYX0KGoTdS 8 | 3wTCyZTzU3qtTWxcbTCpiJIWbYwRR7TzLB/uydWHlAMzuz6coIiBpYsGiO6wkmfg 9 | W+QvcE7wyW2jtb22pCImLyObyZ21VA== 10 | =VjDv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2HQgf+MTUEnwzXK4zi76VI7C5cchGan26lIA2Ebq4vtYGKDqNSISOAAdWs9+nT 5 | U6ZA6OIFo5qdeD6F/45s91IoDbxbhMDMFEsSijKASqiuZN5TZM1U2h2kWFAl/sEl 6 | EI1RTygn+xDw/ah4V3/duuMFC+jRgvJ/LgemIF4KBvECWaTQKNu0fu5d4dPXMpp+ 7 | jrxMEZPQZsivpOvklzV8O7wAkf/ZQhJdcB2m8uOfSPlJ91a4EEtXF9/GzzkXUi1P 8 | bzt4NsmOag3227B3mO1Bc6yZdDBNu8wQ9apiJVCpqsxB9Dz0PCL4dHNa1u9g6Xo6 9 | ElRgneV4HZp+LB125VoNabKuNH00bw== 10 | =2yDl 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0ScQf7Bip+quFq1CzDCTDxUhdTTOIpQcCfMKo1Jegpa2Hlm63XuK+6zVI9u6S+ 5 | dBXPdYeneMOqMPQUAaw3M06ZqohaDOt8Ti1EiQFGXCdOvbonTA52Lrd4EEZxwNnK 6 | BdPuIh/8qCfozm5KbZe1bFyGVRAdNyf27KvzHgfBTirLtI+3MiOdL4bvNZbWRPfh 7 | J84Ko+Ena8jPFgyz6nJv2Q2U/V3dCooLJAXs2vEG6owwk5J9zvSysWpHaJbXas5v 8 | KXO9TOBBjf3+vxb1WVQa8ZYUU3+FIFes0RFVgOWghJXIooOcWrwOV2Q8z9qWXwoK 9 | mMZ2oLS+z/7clXibK45KeRUeCX5DvQ== 10 | =5oO1 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-javadoc.jar.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3d+AgAwQvlwnKQLLuiZADGL+I922/YG317N2Re1EjC6WlMRZUKXH54fckRTyPm 5 | 4ZLyxVHy8LlUD2Q10g69opb7HRd/tV0miBJhn5OU1wIM3hqTgxNp9EFckK4md45k 6 | osnhQJNDsFToxJL8zPP+KRs/aWPZs+FrRcH6k26lwLl2gTfyBDsaU11HFRVEN9yi 7 | X41obVyKiVNlc9efSSvlLtRBSVt0VhAFhck+3t61H6D9H09QxaDGAqmduDua3Tg3 8 | t5eqURuDfv3TfSztYgK3JBmG/6gVMsZodCgyC+8rhDDs6vSoDG30apx5Leg2rPbj 9 | xuk2wi/WNzc94IgY9tVS3tAfT2k6yQ== 10 | =6+Cv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar.md5.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT1PSwf+InTdlh+BVVy3RFszEL5vN7waSPYMImXhgd5EZ1d4Lxd6EeOwtNgWNKpG 5 | E+Ps/Kw0jZDvoD49WJlcUjzDHBNHcE7C/L3GAWHV6WwklhtQaJ4EegsynWdSXz6k 6 | fqJY6r58aGKGjpKPutRWAjvfcdC170+ZRsc2oi9xrAgHCpvXzTjq4+O9Ah0t5jwW 7 | jcZ/Xubcw4vjsw774OucHbtwGsvRN5SDJ3IONOH8WCwhUP5vEEKvA6MYX0KGoTdS 8 | 3wTCyZTzU3qtTWxcbTCpiJIWbYwRR7TzLB/uydWHlAMzuz6coIiBpYsGiO6wkmfg 9 | W+QvcE7wyW2jtb22pCImLyObyZ21VA== 10 | =VjDv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar.sha1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT2HQgf+MTUEnwzXK4zi76VI7C5cchGan26lIA2Ebq4vtYGKDqNSISOAAdWs9+nT 5 | U6ZA6OIFo5qdeD6F/45s91IoDbxbhMDMFEsSijKASqiuZN5TZM1U2h2kWFAl/sEl 6 | EI1RTygn+xDw/ah4V3/duuMFC+jRgvJ/LgemIF4KBvECWaTQKNu0fu5d4dPXMpp+ 7 | jrxMEZPQZsivpOvklzV8O7wAkf/ZQhJdcB2m8uOfSPlJ91a4EEtXF9/GzzkXUi1P 8 | bzt4NsmOag3227B3mO1Bc6yZdDBNu8wQ9apiJVCpqsxB9Dz0PCL4dHNa1u9g6Xo6 9 | ElRgneV4HZp+LB125VoNabKuNH00bw== 10 | =2yDl 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar.sha256.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT0ScQf7Bip+quFq1CzDCTDxUhdTTOIpQcCfMKo1Jegpa2Hlm63XuK+6zVI9u6S+ 5 | dBXPdYeneMOqMPQUAaw3M06ZqohaDOt8Ti1EiQFGXCdOvbonTA52Lrd4EEZxwNnK 6 | BdPuIh/8qCfozm5KbZe1bFyGVRAdNyf27KvzHgfBTirLtI+3MiOdL4bvNZbWRPfh 7 | J84Ko+Ena8jPFgyz6nJv2Q2U/V3dCooLJAXs2vEG6owwk5J9zvSysWpHaJbXas5v 8 | KXO9TOBBjf3+vxb1WVQa8ZYUU3+FIFes0RFVgOWghJXIooOcWrwOV2Q8z9qWXwoK 9 | mMZ2oLS+z/7clXibK45KeRUeCX5DvQ== 10 | =5oO1 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0-sources.jar.sha512.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP SIGNATURE----- 2 | 3 | iQEzBAABCAAdFiEE4qywN5M83qq3v3fUmix6mORXxT0FAmAiY1oACgkQmix6mORX 4 | xT3d+AgAwQvlwnKQLLuiZADGL+I922/YG317N2Re1EjC6WlMRZUKXH54fckRTyPm 5 | 4ZLyxVHy8LlUD2Q10g69opb7HRd/tV0miBJhn5OU1wIM3hqTgxNp9EFckK4md45k 6 | osnhQJNDsFToxJL8zPP+KRs/aWPZs+FrRcH6k26lwLl2gTfyBDsaU11HFRVEN9yi 7 | X41obVyKiVNlc9efSSvlLtRBSVt0VhAFhck+3t61H6D9H09QxaDGAqmduDua3Tg3 8 | t5eqURuDfv3TfSztYgK3JBmG/6gVMsZodCgyC+8rhDDs6vSoDG30apx5Leg2rPbj 9 | xuk2wi/WNzc94IgY9tVS3tAfT2k6yQ== 10 | =6+Cv 11 | -----END PGP SIGNATURE----- 12 | -------------------------------------------------------------------------------- /ci/scripts/promote.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | source $(dirname $0)/common.sh 4 | 5 | pushd artifactory-repo > /dev/null 6 | version=$( get_revision_from_buildinfo ) 7 | popd > /dev/null 8 | 9 | export BUILD_INFO_LOCATION=$(pwd)/artifactory-repo/build-info.json 10 | 11 | released=$(find ./artifactory-repo -name "concourse-release-scripts-*.jar") 12 | cp $released /concourse-release-scripts.jar 13 | 14 | java -jar /concourse-release-scripts.jar promote $RELEASE_TYPE $BUILD_INFO_LOCATION > /dev/null || { exit 1; } 15 | 16 | echo "Promotion complete" 17 | echo $version > version/version 18 | 19 | cp $released built-artifact/concourse-release-scripts.jar 20 | echo $version > built-artifact/version 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:jammy-20230916 2 | 3 | ARG root=. 4 | ARG jar=build/concourse-release-scripts.jar 5 | 6 | COPY ${jar} /concourse-release-scripts.jar 7 | 8 | RUN export DEBIAN_FRONTEND=noninteractive 9 | RUN apt-get update 10 | RUN apt-get install --no-install-recommends -y tzdata ca-certificates curl jq 11 | RUN ln -fs /usr/share/zoneinfo/UTC /etc/localtime 12 | RUN dpkg-reconfigure --frontend noninteractive tzdata 13 | RUN rm -rf /var/lib/apt/lists/* 14 | 15 | ENV JAVA_HOME /opt/jdk 16 | ENV PATH $JAVA_HOME/bin:$PATH 17 | RUN mkdir -p /opt/jdk && \ 18 | cd /opt/jdk && \ 19 | curl -L https://download.bell-sw.com/java/17.0.8.1+1/bellsoft-jdk17.0.8.1+1-linux-amd64.tar.gz | tar xz --strip-components=1 20 | -------------------------------------------------------------------------------- /ci/README.adoc: -------------------------------------------------------------------------------- 1 | == Concourse pipeline 2 | 3 | You can first login with Concourse: 4 | 5 | [source] 6 | ---- 7 | $ fly -t release-scripts login -n concourse-release-scripts -c https://ci.spring.io 8 | ---- 9 | 10 | The pipeline can be deployed using the following command: 11 | 12 | [source] 13 | ---- 14 | $ fly -t release-scripts set-pipeline -p concourse-release-scripts -c ci/pipeline.yml -l ci/parameters.yml 15 | ---- 16 | 17 | NOTE: This assumes that you have credhub integration configured with the appropriate 18 | secrets. 19 | 20 | === Release 21 | 22 | To release a GA: 23 | 24 | [source] 25 | ---- 26 | $ fly -t release-scripts trigger-job -j concourse-release-scripts/stage-release 27 | $ fly -t release-scripts trigger-job -j concourse-release-scripts/promote-release 28 | ---- 29 | -------------------------------------------------------------------------------- /ci/tasks/build-ci-image.yml: -------------------------------------------------------------------------------- 1 | --- 2 | platform: linux 3 | image_resource: 4 | type: registry-image 5 | source: 6 | repository: concourse/oci-build-task 7 | tag: 0.11.1 8 | username: ((docker-hub-username)) 9 | password: ((docker-hub-password)) 10 | inputs: 11 | - name: ci-images-git-repo 12 | outputs: 13 | - name: image 14 | caches: 15 | - path: ci-image-cache 16 | params: 17 | CONTEXT: ci-images-git-repo/ci/images 18 | DOCKERFILE: ci-images-git-repo/ci/images/((ci-image-name))/Dockerfile 19 | DOCKER_HUB_AUTH: ((docker-hub-auth)) 20 | run: 21 | path: /bin/sh 22 | args: 23 | - "-c" 24 | - | 25 | mkdir -p /root/.docker 26 | cat > /root/.docker/config.json < expectedArguments; 17 | 18 | public ArgumentValidator(String... expectedArgumentsNames) { 19 | Assert.notEmpty(expectedArgumentsNames, "arguments must not be null or empty"); 20 | this.expectedArguments = Arrays.asList(expectedArgumentsNames); 21 | } 22 | 23 | public void validate(List args) { 24 | if (args.size() < expectedArguments.size() && args.size() != expectedArguments.size()) { 25 | throw new IllegalArgumentException("Missing argument(s): " + joinFrom(expectedArguments, args.size())); 26 | } 27 | } 28 | 29 | private String joinFrom(List expectedArguments, int from) { 30 | StringJoiner stringJoiner = new StringJoiner(", "); 31 | expectedArguments.subList(from, expectedArguments.size()).forEach(stringJoiner::add); 32 | return stringJoiner.toString(); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/test/java/io/spring/concourse/releasescripts/sonatype/AnyOfRequestMatcher.java: -------------------------------------------------------------------------------- 1 | package io.spring.concourse.releasescripts.sonatype; 2 | 3 | import java.io.IOException; 4 | import java.util.Iterator; 5 | import java.util.Set; 6 | 7 | import org.springframework.http.client.ClientHttpRequest; 8 | import org.springframework.test.web.client.RequestMatcher; 9 | 10 | class AnyOfRequestMatcher implements RequestMatcher { 11 | 12 | private final Object monitor = new Object(); 13 | 14 | private final Set candidates; 15 | 16 | AnyOfRequestMatcher(Set candidates) { 17 | this.candidates = candidates; 18 | } 19 | 20 | @Override 21 | public void match(ClientHttpRequest request) throws IOException, AssertionError { 22 | synchronized (this.monitor) { 23 | Iterator iterator = this.candidates.iterator(); 24 | while (iterator.hasNext()) { 25 | try { 26 | iterator.next().match(request); 27 | iterator.remove(); 28 | return; 29 | } 30 | catch (AssertionError ex) { 31 | // Continue 32 | } 33 | } 34 | throw new AssertionError("No matching request matcher was found for request to '" + request.getURI() + "'"); 35 | } 36 | } 37 | 38 | public Set getCandidates() { 39 | return this.candidates; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/sonatype/DeployableArtifact.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2021 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.sonatype; 18 | 19 | import org.springframework.core.io.Resource; 20 | 21 | /** 22 | * An artifact that can be deployed. 23 | * 24 | * @author Andy Wilkinson 25 | */ 26 | class DeployableArtifact { 27 | 28 | private final Resource resource; 29 | 30 | private final String path; 31 | 32 | DeployableArtifact(Resource resource, String path) { 33 | this.resource = resource; 34 | this.path = path; 35 | } 36 | 37 | Resource getResource() { 38 | return this.resource; 39 | } 40 | 41 | String getPath() { 42 | return this.path; 43 | } 44 | 45 | } -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/ReleaseType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts; 18 | 19 | /** 20 | * Release type. 21 | * 22 | * @author Madhura Bhave 23 | */ 24 | public enum ReleaseType { 25 | 26 | MILESTONE("M"), 27 | 28 | RELEASE_CANDIDATE("RC"), 29 | 30 | RELEASE("RELEASE"); 31 | 32 | private final String identifier; 33 | 34 | ReleaseType(String identifier) { 35 | this.identifier = identifier; 36 | } 37 | 38 | public static ReleaseType from(String releaseType) { 39 | for (ReleaseType type : ReleaseType.values()) { 40 | if (type.identifier.equals(releaseType)) { 41 | return type; 42 | } 43 | } 44 | throw new IllegalArgumentException("Invalid release type"); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/test/java/io/spring/concourse/releasescripts/artifactory/ArtifactoryServiceTests.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2024 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.artifactory; 18 | 19 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 20 | import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; 21 | 22 | /** 23 | * Tests for {@link ArtifactoryService}. 24 | * 25 | * @author Madhura Bhave 26 | * @author Brian Clozel 27 | */ 28 | @RestClientTest(value = ArtifactoryService.class, properties = "artifactory.url=https://repo.spring.io") 29 | @EnableConfigurationProperties(ArtifactoryProperties.class) 30 | class ArtifactoryServiceTests extends AbstractArtifactoryServiceTests { 31 | 32 | ArtifactoryServiceTests() { 33 | super(""); 34 | } 35 | 36 | } -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/command/Command.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2019 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.command; 18 | 19 | import org.springframework.boot.ApplicationArguments; 20 | import org.springframework.util.ClassUtils; 21 | 22 | /** 23 | * @author Madhura Bhave 24 | * @author Brian Clozel 25 | */ 26 | public interface Command { 27 | 28 | default String getName() { 29 | String name = ClassUtils.getShortName(getClass()); 30 | int lastDot = name.lastIndexOf("."); 31 | if (lastDot != -1) { 32 | name = name.substring(lastDot + 1); 33 | } 34 | if (name.endsWith("Command")) { 35 | name = name.substring(0, name.length() - "Command".length()); 36 | } 37 | return name.substring(0, 1).toLowerCase() + name.substring(1); 38 | } 39 | 40 | void run(ApplicationArguments args) throws Exception; 41 | 42 | } -------------------------------------------------------------------------------- /src/test/java/io/spring/concourse/releasescripts/artifactory/ArtifactoryServiceWithProjectTests.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2024 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.artifactory; 18 | 19 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 20 | import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; 21 | 22 | /** 23 | * Tests for {@link ArtifactoryService} with a project. 24 | * 25 | * @author Madhura Bhave 26 | * @author Brian Clozel 27 | */ 28 | @RestClientTest(value = ArtifactoryService.class, 29 | properties = { "artifactory.url=https://repo.spring.io", "artifactory.project=test" }) 30 | @EnableConfigurationProperties(ArtifactoryProperties.class) 31 | class ArtifactoryServiceWithProjectTests extends AbstractArtifactoryServiceTests { 32 | 33 | ArtifactoryServiceWithProjectTests() { 34 | super("?project=test"); 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/artifactory/payload/PromotionRequest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2019 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.artifactory.payload; 18 | 19 | /** 20 | * Represents a request to promote artifacts from a sourceRepo to a targetRepo. 21 | * 22 | * @author Madhura Bhave 23 | */ 24 | public class PromotionRequest { 25 | 26 | private final String status; 27 | 28 | private final String sourceRepo; 29 | 30 | private final String targetRepo; 31 | 32 | public PromotionRequest(String status, String sourceRepo, String targetRepo) { 33 | this.status = status; 34 | this.sourceRepo = sourceRepo; 35 | this.targetRepo = targetRepo; 36 | } 37 | 38 | public String getTargetRepo() { 39 | return this.targetRepo; 40 | } 41 | 42 | public String getSourceRepo() { 43 | return this.sourceRepo; 44 | } 45 | 46 | public String getStatus() { 47 | return this.status; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/test/java/io/spring/concourse/releasescripts/command/ArgumentValidatorTest.java: -------------------------------------------------------------------------------- 1 | package io.spring.concourse.releasescripts.command; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import java.util.Arrays; 6 | import java.util.Collections; 7 | 8 | import static org.assertj.core.api.Assertions.assertThat; 9 | import static org.assertj.core.api.Assertions.catchThrowable; 10 | 11 | /** 12 | * Tests for {@link ArgumentValidator}. 13 | * 14 | * @author Abel Salgado Romero 15 | */ 16 | public class ArgumentValidatorTest { 17 | 18 | @Test 19 | public void shouldFailWhenArgumentsAreLessThanRequired() { 20 | ArgumentValidator argumentValidator = new ArgumentValidator("$ONE", "$TWO", "$THREE"); 21 | 22 | Throwable failure = catchThrowable(() -> argumentValidator.validate(Arrays.asList("first", "second"))); 23 | 24 | assertThat(failure).isInstanceOf(IllegalArgumentException.class).hasMessage("Missing argument(s): $THREE"); 25 | } 26 | 27 | @Test 28 | public void shouldNotFailWhenArgumentsAreMoreThanRequired() { 29 | ArgumentValidator argumentValidator = new ArgumentValidator("one"); 30 | 31 | argumentValidator.validate(Arrays.asList("first", "second")); 32 | } 33 | 34 | @Test 35 | public void shouldFailAndReportAllMissingArguments() { 36 | ArgumentValidator argumentValidator = new ArgumentValidator("$ONE", "$TWO", "$THREE"); 37 | 38 | Throwable failure = catchThrowable(() -> argumentValidator.validate(Collections.emptyList())); 39 | 40 | assertThat(failure).isInstanceOf(IllegalArgumentException.class) 41 | .hasMessage("Missing argument(s): $ONE, $TWO, $THREE"); 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /gradle/publications.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "maven-publish" 2 | 3 | publishing { 4 | publications { 5 | mavenJava(MavenPublication) { 6 | artifact bootJar 7 | pom { 8 | afterEvaluate { 9 | name = project.description 10 | description = project.description 11 | } 12 | url = "https://github.com/spring-io/concourse-release-scripts" 13 | organization { 14 | name = "Spring IO" 15 | url = "https://github.com/spring-io/concourse-release-scripts" 16 | } 17 | licenses { 18 | license { 19 | name = "Apache License, Version 2.0" 20 | url = "https://www.apache.org/licenses/LICENSE-2.0" 21 | distribution = "repo" 22 | } 23 | } 24 | scm { 25 | url = "https://github.com/spring-io/concourse-release-scripts" 26 | connection = "scm:git:git://github.com/spring-io/concourse-release-scripts" 27 | developerConnection = "scm:git:git://github.com/spring-io/concourse-release-scripts" 28 | } 29 | developers { 30 | developer { 31 | id = "bclozel" 32 | name = "Brian Clozel" 33 | email = "bclozel@pivotal.io" 34 | } 35 | } 36 | issueManagement { 37 | system = "GitHub" 38 | url = "https://github.com/spring-io/concourse-release-scripts/issues" 39 | } 40 | } 41 | } 42 | } 43 | } 44 | 45 | configureDeploymentRepository(project) 46 | 47 | void configureDeploymentRepository(Project project) { 48 | project.plugins.withType(MavenPublishPlugin.class).all { 49 | PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class); 50 | if (project.hasProperty("deploymentRepository")) { 51 | publishing.repositories.maven { 52 | it.url = project.property("deploymentRepository") 53 | it.name = "deployment" 54 | } 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /ci/scripts/stage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | source $(dirname $0)/common.sh 5 | repository=$(pwd)/distribution-repository 6 | 7 | pushd git-repo > /dev/null 8 | git fetch --tags --all > /dev/null 9 | popd > /dev/null 10 | 11 | git clone git-repo stage-git-repo > /dev/null 12 | 13 | pushd stage-git-repo > /dev/null 14 | 15 | snapshotVersion=$( awk -F '=' '$1 == "version" { print $2 }' gradle.properties ) 16 | if [[ $RELEASE_TYPE = "M" ]]; then 17 | stageVersion=$( get_next_milestone_release $snapshotVersion) 18 | nextVersion=$snapshotVersion 19 | elif [[ $RELEASE_TYPE = "RC" ]]; then 20 | stageVersion=$( get_next_rc_release $snapshotVersion) 21 | nextVersion=$snapshotVersion 22 | elif [[ $RELEASE_TYPE = "RELEASE" ]]; then 23 | stageVersion=$( get_next_release $snapshotVersion) 24 | nextVersion=$( bump_version_number $snapshotVersion) 25 | else 26 | echo "Unknown release type $RELEASE_TYPE" >&2; exit 1; 27 | fi 28 | 29 | echo "Staging $stageVersion (next version will be $nextVersion)" 30 | sed -i "s/version=$snapshotVersion/version=$stageVersion/" gradle.properties 31 | 32 | git config user.name "Spring Builds" > /dev/null 33 | git config user.email "spring-builds@users.noreply.github.com" > /dev/null 34 | git add gradle.properties > /dev/null 35 | git commit -m"Release v$stageVersion" > /dev/null 36 | git tag -a "v$stageVersion" -m"Release v$stageVersion" > /dev/null 37 | 38 | ./gradlew --no-daemon --max-workers=4 -PdeploymentRepository=${repository} build publishAllPublicationsToDeploymentRepository 39 | 40 | git reset --hard HEAD^ > /dev/null 41 | if [[ $nextVersion != $snapshotVersion ]]; then 42 | echo "Setting next development version (v$nextVersion)" 43 | sed -i "s/version=$snapshotVersion/version=$nextVersion/" gradle.properties 44 | git add gradle.properties > /dev/null 45 | git commit -m"Next development version (v$nextVersion)" > /dev/null 46 | fi; 47 | 48 | echo "DONE" 49 | 50 | popd > /dev/null 51 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/ReleaseProperties.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2019 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts; 18 | 19 | import org.springframework.boot.context.properties.ConfigurationProperties; 20 | 21 | /** 22 | * {@link ConfigurationProperties @ConfigurationProperties} corresponding to the release. 23 | * 24 | * @author Madhura Bhave 25 | */ 26 | @ConfigurationProperties(prefix = "release") 27 | public class ReleaseProperties { 28 | 29 | private String buildName; 30 | 31 | private String buildNumber; 32 | 33 | private String groupId; 34 | 35 | private String version; 36 | 37 | public String getBuildName() { 38 | return this.buildName; 39 | } 40 | 41 | public void setBuildName(String buildName) { 42 | this.buildName = buildName; 43 | } 44 | 45 | public String getBuildNumber() { 46 | return this.buildNumber; 47 | } 48 | 49 | public void setBuildNumber(String buildNumber) { 50 | this.buildNumber = buildNumber; 51 | } 52 | 53 | public String getGroupId() { 54 | return this.groupId; 55 | } 56 | 57 | public void setGroupId(String groupId) { 58 | this.groupId = groupId; 59 | } 60 | 61 | public String getVersion() { 62 | return this.version; 63 | } 64 | 65 | public void setVersion(String version) { 66 | this.version = version; 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/artifactory/filtered-build-info-response.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildInfo": { 3 | "version": "1.0.1", 4 | "name": "example", 5 | "number": "example-build-1", 6 | "started": "2019-09-10T12:18:05.430+0000", 7 | "durationMillis": 0, 8 | "artifactoryPrincipal": "user", 9 | "url": "https://my-ci.com", 10 | "modules": [ 11 | { 12 | "id": "org.example.demo:demo:2.2.0", 13 | "artifacts": [ 14 | { 15 | "type": "jar", 16 | "sha1": "ayyyya9151a22cb3145538e523dbbaaaaaaaa", 17 | "sha256": "aaaaaaaaa85f5c5093721f3ed0edda8ff8290yyyyyyyyyy", 18 | "md5": "aaaaaacddea1724b0b69d8yyyyyyy", 19 | "name": "demo-2.2.0.jar" 20 | } 21 | ] 22 | }, 23 | { 24 | "id": "org.example.demo:demo:2.2.0:zip", 25 | "artifacts": [ 26 | { 27 | "type": "zip", 28 | "sha1": "ayyyya9151a22cb3145538e523dbbaaaaaaab", 29 | "sha256": "aaaaaaaaa85f5c5093721f3ed0edda8ff8290yyyyyyyyyz", 30 | "md5": "aaaaaacddea1724b0b69d8yyyyyyz", 31 | "name": "demo-2.2.0.zip" 32 | } 33 | ] 34 | }, 35 | { 36 | "id": "org.example.demo:demo:2.2.0:doc", 37 | "artifacts": [ 38 | { 39 | "type": "jar", 40 | "sha1": "ayyyya9151a22cb3145538e523dbbaaaaaaba", 41 | "sha256": "aaaaaaaaa85f5c5093721f3ed0edda8ff8290yyyyyyyyzy", 42 | "md5": "aaaaaacddea1724b0b69d8yyyyyzy", 43 | "name": "demo-2.2.0.doc" 44 | } 45 | ] 46 | } 47 | ], 48 | "statuses": [ 49 | { 50 | "status": "staged", 51 | "repository": "libs-release-local", 52 | "timestamp": "2019-09-10T12:42:24.716+0000", 53 | "user": "user", 54 | "timestampDate": 1568119344716 55 | } 56 | ] 57 | }, 58 | "uri": "https://my-artifactory-repo.com/api/build/example/example-build-1" 59 | } -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 4.0.0 10 | org.springframework.example 11 | module-one 12 | 1.0.0 13 | module-one 14 | Example module 15 | https://spring.io/projects/spring-boot 16 | 17 | Pivotal Software, Inc. 18 | https://spring.io 19 | 20 | 21 | 22 | Apache License, Version 2.0 23 | https://www.apache.org/licenses/LICENSE-2.0 24 | 25 | 26 | 27 | 28 | Pivotal 29 | info@pivotal.io 30 | Pivotal Software, Inc. 31 | https://www.spring.io 32 | 33 | 34 | 35 | 36 | scm:git:git://github.com/spring-projects/spring-boot.git 37 | 38 | 39 | scm:git:ssh://git@github.com/spring-projects/spring-boot.git 40 | 41 | https://github.com/spring-projects/spring-boot 42 | 43 | 44 | GitHub 45 | 46 | https://github.com/spring-projects/spring-boot/issues 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 4.0.0 10 | org.springframework.example 11 | module-two 12 | 1.0.0 13 | module-two 14 | Example module 15 | https://spring.io/projects/spring-boot 16 | 17 | Pivotal Software, Inc. 18 | https://spring.io 19 | 20 | 21 | 22 | Apache License, Version 2.0 23 | https://www.apache.org/licenses/LICENSE-2.0 24 | 25 | 26 | 27 | 28 | Pivotal 29 | info@pivotal.io 30 | Pivotal Software, Inc. 31 | https://www.spring.io 32 | 33 | 34 | 35 | 36 | scm:git:git://github.com/spring-projects/spring-boot.git 37 | 38 | 39 | scm:git:ssh://git@github.com/spring-projects/spring-boot.git 40 | 41 | https://github.com/spring-projects/spring-boot 42 | 43 | 44 | GitHub 45 | 46 | https://github.com/spring-projects/spring-boot/issues 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 4.0.0 10 | org.springframework.example 11 | module-three 12 | 1.0.0 13 | module-three 14 | Example module 15 | https://spring.io/projects/spring-boot 16 | 17 | Pivotal Software, Inc. 18 | https://spring.io 19 | 20 | 21 | 22 | Apache License, Version 2.0 23 | https://www.apache.org/licenses/LICENSE-2.0 24 | 25 | 26 | 27 | 28 | Pivotal 29 | info@pivotal.io 30 | Pivotal Software, Inc. 31 | https://www.spring.io 32 | 33 | 34 | 35 | 36 | scm:git:git://github.com/spring-projects/spring-boot.git 37 | 38 | 39 | scm:git:ssh://git@github.com/spring-projects/spring-boot.git 40 | 41 | https://github.com/spring-projects/spring-boot 42 | 43 | 44 | GitHub 45 | 46 | https://github.com/spring-projects/spring-boot/issues 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/command/CommandProcessor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.command; 18 | 19 | import java.util.Collections; 20 | import java.util.List; 21 | 22 | import org.slf4j.Logger; 23 | import org.slf4j.LoggerFactory; 24 | 25 | import org.springframework.boot.ApplicationArguments; 26 | import org.springframework.boot.ApplicationRunner; 27 | import org.springframework.stereotype.Component; 28 | import org.springframework.util.Assert; 29 | 30 | /** 31 | * {@link ApplicationRunner} to delegate incoming requests to commands. 32 | * 33 | * @author Madhura Bhave 34 | */ 35 | @Component 36 | public class CommandProcessor implements ApplicationRunner { 37 | 38 | private static final Logger logger = LoggerFactory.getLogger(CommandProcessor.class); 39 | 40 | private final List commands; 41 | 42 | public CommandProcessor(List commands) { 43 | this.commands = Collections.unmodifiableList(commands); 44 | } 45 | 46 | @Override 47 | public void run(ApplicationArguments args) throws Exception { 48 | logger.debug("Running command processor"); 49 | List nonOptionArgs = args.getNonOptionArgs(); 50 | Assert.state(!nonOptionArgs.isEmpty(), "No command argument specified"); 51 | String request = nonOptionArgs.get(0); 52 | Command command = this.commands.stream() 53 | .filter((candidate) -> candidate.getName().equals(request)) 54 | .findFirst() 55 | .orElseThrow(() -> new IllegalStateException("Unknown command '" + request + "'")); 56 | logger.debug("Found command " + command.getClass().getName()); 57 | command.run(args); 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/command/PublishToSdkmanCommand.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2020 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.command; 18 | 19 | import java.util.List; 20 | 21 | import io.spring.concourse.releasescripts.ReleaseType; 22 | import io.spring.concourse.releasescripts.sdkman.SdkmanService; 23 | import org.slf4j.Logger; 24 | import org.slf4j.LoggerFactory; 25 | 26 | import org.springframework.boot.ApplicationArguments; 27 | import org.springframework.stereotype.Component; 28 | import org.springframework.util.Assert; 29 | 30 | /** 31 | * Command used to publish to SDKMAN. 32 | * 33 | * @author Madhura Bhave 34 | */ 35 | @Component 36 | public class PublishToSdkmanCommand implements Command { 37 | 38 | private static final Logger logger = LoggerFactory.getLogger(PublishToSdkmanCommand.class); 39 | 40 | private final SdkmanService service; 41 | 42 | public PublishToSdkmanCommand(SdkmanService service) { 43 | this.service = service; 44 | } 45 | 46 | @Override 47 | public void run(ApplicationArguments args) throws Exception { 48 | logger.debug("Running 'push to SDKMAN' command"); 49 | List nonOptionArgs = args.getNonOptionArgs(); 50 | Assert.state(!nonOptionArgs.isEmpty(), "No command argument specified"); 51 | Assert.state(nonOptionArgs.size() >= 3, "Release type or version not specified"); 52 | String releaseType = nonOptionArgs.get(1); 53 | ReleaseType type = ReleaseType.from(releaseType); 54 | if (!ReleaseType.RELEASE.equals(type)) { 55 | return; 56 | } 57 | String version = nonOptionArgs.get(2); 58 | boolean makeDefault = false; 59 | if (nonOptionArgs.size() == 4) { 60 | makeDefault = Boolean.parseBoolean(nonOptionArgs.get(3)); 61 | } 62 | this.service.publish(version, makeDefault); 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/profiles.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "resourceURI": "https://example.org/service/local/staging/profiles/2e3ed47dc2510", 5 | "id": "2e3ed47dc2510", 6 | "name": "org.example", 7 | "repositoryTemplateId": "default_hosted_release", 8 | "repositoryType": "maven2", 9 | "repositoryTargetId": "f778541873040", 10 | "inProgress": false, 11 | "order": 57, 12 | "deployURI": "https://example.org/service/local/staging/deploy/maven2", 13 | "targetGroups": [ 14 | "staging" 15 | ], 16 | "finishNotifyRoles": [ 17 | "org.example-deployer" 18 | ], 19 | "promotionNotifyRoles": [], 20 | "dropNotifyRoles": [], 21 | "closeRuleSets": [ 22 | "1b3bf8878311" 23 | ], 24 | "promoteRuleSets": [ 25 | "1b3bf8878311" 26 | ], 27 | "promotionTargetRepository": "releases", 28 | "mode": "BOTH", 29 | "finishNotifyCreator": true, 30 | "promotionNotifyCreator": true, 31 | "dropNotifyCreator": true, 32 | "autoStagingDisabled": false, 33 | "repositoriesSearchable": true, 34 | "properties": { 35 | "@class": "linked-hash-map" 36 | } 37 | }, 38 | { 39 | "resourceURI": "https://example.org/service/local/staging/profiles/61d07ffeecc22", 40 | "id": "61d07ffeecc22", 41 | "name": "org.sample", 42 | "repositoryTemplateId": "default_hosted_release", 43 | "repositoryType": "maven2", 44 | "repositoryTargetId": "270bcd6a9b75a", 45 | "inProgress": false, 46 | "order": 57, 47 | "deployURI": "https://example.org/service/local/staging/deploy/maven2", 48 | "targetGroups": [ 49 | "staging" 50 | ], 51 | "finishNotifyRoles": [ 52 | "org.sample-deployer" 53 | ], 54 | "promotionNotifyRoles": [], 55 | "dropNotifyRoles": [], 56 | "closeRuleSets": [ 57 | "1b3bf8878311" 58 | ], 59 | "promoteRuleSets": [ 60 | "1b3bf8878311" 61 | ], 62 | "promotionTargetRepository": "releases", 63 | "mode": "BOTH", 64 | "finishNotifyCreator": true, 65 | "promotionNotifyCreator": true, 66 | "dropNotifyCreator": true, 67 | "autoStagingDisabled": false, 68 | "repositoriesSearchable": true, 69 | "properties": { 70 | "@class": "linked-hash-map" 71 | } 72 | } 73 | ] 74 | } -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/sonatype/ArtifactCollector.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.sonatype; 18 | 19 | import java.io.IOException; 20 | import java.nio.file.Files; 21 | import java.nio.file.Path; 22 | import java.util.Collection; 23 | import java.util.List; 24 | import java.util.function.Predicate; 25 | import java.util.regex.Pattern; 26 | import java.util.stream.Collectors; 27 | import java.util.stream.Stream; 28 | 29 | import org.springframework.core.io.PathResource; 30 | 31 | /** 32 | * Collects artifacts to be deployed. 33 | * 34 | * @author Andy Wilkinson 35 | */ 36 | class ArtifactCollector { 37 | 38 | private final Predicate excludeFilter; 39 | 40 | ArtifactCollector(List exclude) { 41 | this.excludeFilter = excludeFilter(exclude); 42 | } 43 | 44 | private Predicate excludeFilter(List exclude) { 45 | Predicate patternFilter = exclude.stream() 46 | .map(Pattern::compile) 47 | .map(Pattern::asPredicate) 48 | .reduce((path) -> false, Predicate::or) 49 | .negate(); 50 | return (path) -> patternFilter.test(path.toString()); 51 | } 52 | 53 | Collection collectArtifacts(Path root) { 54 | try (Stream artifacts = Files.walk(root)) { 55 | return artifacts.filter(Files::isRegularFile) 56 | .filter(this.excludeFilter) 57 | .map((artifact) -> deployableArtifact(artifact, root)) 58 | .collect(Collectors.toList()); 59 | } 60 | catch (IOException ex) { 61 | throw new RuntimeException("Could not read artifacts from '" + root + "'"); 62 | } 63 | } 64 | 65 | private DeployableArtifact deployableArtifact(Path artifact, Path root) { 66 | return new DeployableArtifact(new PathResource(artifact), root.relativize(artifact).toString()); 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/sdkman/SdkmanProperties.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.sdkman; 18 | 19 | import jakarta.validation.constraints.Pattern; 20 | 21 | import org.springframework.boot.context.properties.ConfigurationProperties; 22 | import org.springframework.validation.annotation.Validated; 23 | 24 | /** 25 | * {@link ConfigurationProperties @ConfigurationProperties} for SDKMAN. 26 | * 27 | * @author Madhura Bhave 28 | * @author Brian Clozel 29 | */ 30 | @ConfigurationProperties(prefix = "sdkman") 31 | @Validated 32 | public class SdkmanProperties { 33 | 34 | private String consumerKey; 35 | 36 | private String consumerToken; 37 | 38 | private String candidate; 39 | 40 | @Pattern(regexp = "[a-z.]+:[a-z\\-]+:[^:]+(:[a-z.]+(:[a-z]+)?)?") 41 | private String artifact; 42 | 43 | private String broadcastUrl; 44 | 45 | public String getConsumerKey() { 46 | return this.consumerKey; 47 | } 48 | 49 | public void setConsumerKey(String consumerKey) { 50 | this.consumerKey = consumerKey; 51 | } 52 | 53 | public String getConsumerToken() { 54 | return this.consumerToken; 55 | } 56 | 57 | public void setConsumerToken(String consumerToken) { 58 | this.consumerToken = consumerToken; 59 | } 60 | 61 | public String getCandidate() { 62 | return this.candidate; 63 | } 64 | 65 | public void setCandidate(String candidate) { 66 | this.candidate = candidate; 67 | } 68 | 69 | public String getArtifact() { 70 | return this.artifact; 71 | } 72 | 73 | public void setArtifact(String artifact) { 74 | this.artifact = artifact; 75 | } 76 | 77 | public String getBroadcastUrl() { 78 | return this.broadcastUrl; 79 | } 80 | 81 | public void setBroadcastUrl(String broadcastUrl) { 82 | this.broadcastUrl = broadcastUrl; 83 | } 84 | 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/command/PromoteCommand.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2020 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.command; 18 | 19 | import java.io.File; 20 | import java.nio.file.Files; 21 | import java.util.List; 22 | 23 | import com.fasterxml.jackson.databind.ObjectMapper; 24 | import io.spring.concourse.releasescripts.ReleaseInfo; 25 | import io.spring.concourse.releasescripts.ReleaseType; 26 | import io.spring.concourse.releasescripts.artifactory.ArtifactoryService; 27 | import io.spring.concourse.releasescripts.artifactory.payload.BuildInfoResponse; 28 | import org.slf4j.Logger; 29 | import org.slf4j.LoggerFactory; 30 | 31 | import org.springframework.boot.ApplicationArguments; 32 | import org.springframework.stereotype.Component; 33 | import org.springframework.util.Assert; 34 | 35 | /** 36 | * Command used to move the build artifacts to a target repository in Artifactory. 37 | * 38 | * @author Madhura Bhave 39 | */ 40 | @Component 41 | public class PromoteCommand implements Command { 42 | 43 | private static final Logger logger = LoggerFactory.getLogger(PromoteCommand.class); 44 | 45 | private final ArtifactoryService service; 46 | 47 | private final ObjectMapper objectMapper; 48 | 49 | public PromoteCommand(ArtifactoryService service, ObjectMapper objectMapper) { 50 | this.service = service; 51 | this.objectMapper = objectMapper; 52 | } 53 | 54 | @Override 55 | public void run(ApplicationArguments args) throws Exception { 56 | logger.debug("Running 'promote' command"); 57 | List nonOptionArgs = args.getNonOptionArgs(); 58 | Assert.state(!nonOptionArgs.isEmpty(), "No command argument specified"); 59 | Assert.state(nonOptionArgs.size() == 3, "Release type or build info location not specified"); 60 | String releaseType = nonOptionArgs.get(1); 61 | ReleaseType type = ReleaseType.from(releaseType); 62 | String buildInfoLocation = nonOptionArgs.get(2); 63 | byte[] content = Files.readAllBytes(new File(buildInfoLocation).toPath()); 64 | BuildInfoResponse buildInfoResponse = this.objectMapper.readValue(new String(content), BuildInfoResponse.class); 65 | ReleaseInfo releaseInfo = ReleaseInfo.from(buildInfoResponse.getBuildInfo()); 66 | this.service.promote(type, releaseInfo); 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/command/PublishToCentralCommand.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.command; 18 | 19 | import java.io.File; 20 | import java.nio.file.Files; 21 | import java.util.List; 22 | 23 | import com.fasterxml.jackson.databind.ObjectMapper; 24 | import io.spring.concourse.releasescripts.ReleaseInfo; 25 | import io.spring.concourse.releasescripts.ReleaseType; 26 | import io.spring.concourse.releasescripts.artifactory.payload.BuildInfoResponse; 27 | import io.spring.concourse.releasescripts.artifactory.payload.BuildInfoResponse.BuildInfo; 28 | import io.spring.concourse.releasescripts.sonatype.SonatypeService; 29 | import org.slf4j.Logger; 30 | import org.slf4j.LoggerFactory; 31 | 32 | import org.springframework.boot.ApplicationArguments; 33 | import org.springframework.stereotype.Component; 34 | 35 | /** 36 | * Command used to publish a release to Maven Central. 37 | * 38 | * @author Andy Wilkinson 39 | */ 40 | @Component 41 | public class PublishToCentralCommand implements Command { 42 | 43 | private static final Logger logger = LoggerFactory.getLogger(PublishToCentralCommand.class); 44 | 45 | private final SonatypeService sonatype; 46 | 47 | private final ObjectMapper objectMapper; 48 | 49 | public PublishToCentralCommand(SonatypeService sonatype, ObjectMapper objectMapper) { 50 | this.sonatype = sonatype; 51 | this.objectMapper = objectMapper; 52 | } 53 | 54 | @Override 55 | public void run(ApplicationArguments args) throws Exception { 56 | List nonOptionArgs = args.getNonOptionArgs(); 57 | new ArgumentValidator(getName(), "RELEASE_TYPE", "BUILD_INFO_LOCATION", "ARTIFACTS_LOCATION") 58 | .validate(nonOptionArgs); 59 | String releaseType = nonOptionArgs.get(1); 60 | ReleaseType type = ReleaseType.from(releaseType); 61 | if (!ReleaseType.RELEASE.equals(type)) { 62 | return; 63 | } 64 | String buildInfoLocation = nonOptionArgs.get(2); 65 | logger.debug("Loading build-info from " + buildInfoLocation); 66 | byte[] content = Files.readAllBytes(new File(buildInfoLocation).toPath()); 67 | BuildInfoResponse buildInfoResponse = this.objectMapper.readValue(content, BuildInfoResponse.class); 68 | BuildInfo buildInfo = buildInfoResponse.getBuildInfo(); 69 | String artifactsLocation = nonOptionArgs.get(3); 70 | this.sonatype.publish(ReleaseInfo.from(buildInfo), new File(artifactsLocation).toPath()); 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/artifactory/ArtifactoryProperties.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2024 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.artifactory; 18 | 19 | import org.springframework.boot.context.properties.ConfigurationProperties; 20 | 21 | /** 22 | * {@link ConfigurationProperties @ConfigurationProperties} for an Artifactory server. 23 | * 24 | * @author Madhura Bhave 25 | * @author Brian Clozel 26 | */ 27 | @ConfigurationProperties(prefix = "artifactory") 28 | public class ArtifactoryProperties { 29 | 30 | private String url = "https://repo.spring.io"; 31 | 32 | private String username; 33 | 34 | private String password; 35 | 36 | private String project; 37 | 38 | private final Repository repository = new Repository(); 39 | 40 | public String getUrl() { 41 | return this.url; 42 | } 43 | 44 | public void setUrl(String url) { 45 | this.url = url; 46 | } 47 | 48 | public String getUsername() { 49 | return this.username; 50 | } 51 | 52 | public void setUsername(String username) { 53 | this.username = username; 54 | } 55 | 56 | public String getPassword() { 57 | return this.password; 58 | } 59 | 60 | public void setPassword(String password) { 61 | this.password = password; 62 | } 63 | 64 | public String getProject() { 65 | return this.project; 66 | } 67 | 68 | public void setProject(String project) { 69 | this.project = project; 70 | } 71 | 72 | public Repository getRepository() { 73 | return this.repository; 74 | } 75 | 76 | public static class Repository { 77 | 78 | /** 79 | * Repository name for staging versions 80 | */ 81 | private String staging = "libs-staging-local"; 82 | 83 | /** 84 | * Repository name for milestone versions 85 | */ 86 | private String milestone = "libs-milestone-local"; 87 | 88 | /** 89 | * Repository name for release candidate versions 90 | */ 91 | private String releaseCandidate = "libs-milestone-local"; 92 | 93 | /** 94 | * Repository name for release versions 95 | */ 96 | private String release = "libs-release-local"; 97 | 98 | public String getStaging() { 99 | return this.staging; 100 | } 101 | 102 | public void setStaging(String staging) { 103 | this.staging = staging; 104 | } 105 | 106 | public String getMilestone() { 107 | return this.milestone; 108 | } 109 | 110 | public void setMilestone(String milestone) { 111 | this.milestone = milestone; 112 | } 113 | 114 | public String getReleaseCandidate() { 115 | return this.releaseCandidate; 116 | } 117 | 118 | public void setReleaseCandidate(String releaseCandidate) { 119 | this.releaseCandidate = releaseCandidate; 120 | } 121 | 122 | public String getRelease() { 123 | return this.release; 124 | } 125 | 126 | public void setRelease(String release) { 127 | this.release = release; 128 | } 129 | 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /src/test/java/io/spring/concourse/releasescripts/sonatype/SonatypeServiceAutoReleaseDisabledTests.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.sonatype; 18 | 19 | import java.io.File; 20 | import java.io.IOException; 21 | import java.nio.file.Path; 22 | import java.util.Set; 23 | 24 | import org.junit.jupiter.api.AfterEach; 25 | import org.junit.jupiter.api.Test; 26 | 27 | import org.springframework.beans.factory.annotation.Autowired; 28 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 29 | import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; 30 | import org.springframework.http.HttpMethod; 31 | import org.springframework.http.HttpStatus; 32 | import org.springframework.test.web.client.ExpectedCount; 33 | import org.springframework.test.web.client.MockRestServiceServer; 34 | import org.springframework.test.web.client.RequestMatcher; 35 | 36 | import static org.assertj.core.api.Assertions.assertThat; 37 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; 38 | import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; 39 | import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; 40 | 41 | /** 42 | * Tests for {@link SonatypeService}. 43 | * 44 | * @author Madhura Bhave 45 | * @author Brian Clozel 46 | */ 47 | @RestClientTest(components = SonatypeService.class, 48 | properties = { "sonatype.url=https://nexus.example.org", "sonatype.username=spring", 49 | "sonatype.stagingProfile=org.example", "sonatype.password=secret", "sonatype.auto-release=false" }) 50 | @EnableConfigurationProperties(SonatypeProperties.class) 51 | class SonatypeServiceAutoReleaseDisabledTests { 52 | 53 | @Autowired 54 | private SonatypeService service; 55 | 56 | @Autowired 57 | private MockRestServiceServer server; 58 | 59 | @AfterEach 60 | void tearDown() { 61 | this.server.reset(); 62 | } 63 | 64 | @Test 65 | void publishWithAutoPromoteDisabledShouldNotPromote() throws IOException { 66 | this.server.expect(SonatypeServerUtils.requestTestArtifact()) 67 | .andExpect(method(HttpMethod.GET)) 68 | .andRespond(withStatus(HttpStatus.NOT_FOUND)); 69 | String stagingProfileId = SonatypeServerUtils.setupStagingProfile(this.server); 70 | String stagingRepositoryId = SonatypeServerUtils.setupStagingRepositoryCreation(this.server, stagingProfileId); 71 | 72 | Path artifactsRoot = new File("src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo") 73 | .toPath(); 74 | 75 | Set uploads = SonatypeServerUtils.generateUploadRequests(artifactsRoot, stagingRepositoryId); 76 | 77 | AnyOfRequestMatcher uploadRequestsMatcher = anyOf(uploads); 78 | assertThat(uploadRequestsMatcher.getCandidates()).hasSize(150); 79 | this.server.expect(ExpectedCount.times(150), uploadRequestsMatcher) 80 | .andExpect(method(HttpMethod.PUT)) 81 | .andRespond(withSuccess()); 82 | 83 | SonatypeServerUtils.attemptFinishStagingRepository(server, stagingProfileId, stagingRepositoryId, true); 84 | 85 | this.service.publish(SonatypeServerUtils.getReleaseInfo(), artifactsRoot); 86 | this.server.verify(); 87 | assertThat(uploadRequestsMatcher.getCandidates()).hasSize(0); 88 | } 89 | 90 | private AnyOfRequestMatcher anyOf(Set candidates) { 91 | return new AnyOfRequestMatcher(candidates); 92 | } 93 | 94 | } 95 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-one/1.0.0/module-one-1.0.0.module: -------------------------------------------------------------------------------- 1 | { 2 | "formatVersion": "1.1", 3 | "component": { 4 | "group": "org.springframework.example", 5 | "module": "module-one", 6 | "version": "1.0.0", 7 | "attributes": { 8 | "org.gradle.status": "release" 9 | } 10 | }, 11 | "createdBy": { 12 | "gradle": { 13 | "version": "6.5.1", 14 | "buildId": "mvqepqsdqjcahjl7cii6b6ucoe" 15 | } 16 | }, 17 | "variants": [ 18 | { 19 | "name": "apiElements", 20 | "attributes": { 21 | "org.gradle.category": "library", 22 | "org.gradle.dependency.bundling": "external", 23 | "org.gradle.jvm.version": 8, 24 | "org.gradle.libraryelements": "jar", 25 | "org.gradle.usage": "java-api" 26 | }, 27 | "files": [ 28 | { 29 | "name": "module-one-1.0.0.jar", 30 | "url": "module-one-1.0.0.jar", 31 | "size": 261, 32 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 33 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 34 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 35 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 36 | } 37 | ] 38 | }, 39 | { 40 | "name": "runtimeElements", 41 | "attributes": { 42 | "org.gradle.category": "library", 43 | "org.gradle.dependency.bundling": "external", 44 | "org.gradle.jvm.version": 8, 45 | "org.gradle.libraryelements": "jar", 46 | "org.gradle.usage": "java-runtime" 47 | }, 48 | "files": [ 49 | { 50 | "name": "module-one-1.0.0.jar", 51 | "url": "module-one-1.0.0.jar", 52 | "size": 261, 53 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 54 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 55 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 56 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 57 | } 58 | ] 59 | }, 60 | { 61 | "name": "javadocElements", 62 | "attributes": { 63 | "org.gradle.category": "documentation", 64 | "org.gradle.dependency.bundling": "external", 65 | "org.gradle.docstype": "javadoc", 66 | "org.gradle.usage": "java-runtime" 67 | }, 68 | "files": [ 69 | { 70 | "name": "module-one-1.0.0-javadoc.jar", 71 | "url": "module-one-1.0.0-javadoc.jar", 72 | "size": 261, 73 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 74 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 75 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 76 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 77 | } 78 | ] 79 | }, 80 | { 81 | "name": "sourcesElements", 82 | "attributes": { 83 | "org.gradle.category": "documentation", 84 | "org.gradle.dependency.bundling": "external", 85 | "org.gradle.docstype": "sources", 86 | "org.gradle.usage": "java-runtime" 87 | }, 88 | "files": [ 89 | { 90 | "name": "module-one-1.0.0-sources.jar", 91 | "url": "module-one-1.0.0-sources.jar", 92 | "size": 261, 93 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 94 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 95 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 96 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 97 | } 98 | ] 99 | } 100 | ] 101 | } 102 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-two/1.0.0/module-two-1.0.0.module: -------------------------------------------------------------------------------- 1 | { 2 | "formatVersion": "1.1", 3 | "component": { 4 | "group": "org.springframework.example", 5 | "module": "module-two", 6 | "version": "1.0.0", 7 | "attributes": { 8 | "org.gradle.status": "release" 9 | } 10 | }, 11 | "createdBy": { 12 | "gradle": { 13 | "version": "6.5.1", 14 | "buildId": "mvqepqsdqjcahjl7cii6b6ucoe" 15 | } 16 | }, 17 | "variants": [ 18 | { 19 | "name": "apiElements", 20 | "attributes": { 21 | "org.gradle.category": "library", 22 | "org.gradle.dependency.bundling": "external", 23 | "org.gradle.jvm.version": 8, 24 | "org.gradle.libraryelements": "jar", 25 | "org.gradle.usage": "java-api" 26 | }, 27 | "files": [ 28 | { 29 | "name": "module-two-1.0.0.jar", 30 | "url": "module-two-1.0.0.jar", 31 | "size": 261, 32 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 33 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 34 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 35 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 36 | } 37 | ] 38 | }, 39 | { 40 | "name": "runtimeElements", 41 | "attributes": { 42 | "org.gradle.category": "library", 43 | "org.gradle.dependency.bundling": "external", 44 | "org.gradle.jvm.version": 8, 45 | "org.gradle.libraryelements": "jar", 46 | "org.gradle.usage": "java-runtime" 47 | }, 48 | "files": [ 49 | { 50 | "name": "module-two-1.0.0.jar", 51 | "url": "module-two-1.0.0.jar", 52 | "size": 261, 53 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 54 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 55 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 56 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 57 | } 58 | ] 59 | }, 60 | { 61 | "name": "javadocElements", 62 | "attributes": { 63 | "org.gradle.category": "documentation", 64 | "org.gradle.dependency.bundling": "external", 65 | "org.gradle.docstype": "javadoc", 66 | "org.gradle.usage": "java-runtime" 67 | }, 68 | "files": [ 69 | { 70 | "name": "module-two-1.0.0-javadoc.jar", 71 | "url": "module-two-1.0.0-javadoc.jar", 72 | "size": 261, 73 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 74 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 75 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 76 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 77 | } 78 | ] 79 | }, 80 | { 81 | "name": "sourcesElements", 82 | "attributes": { 83 | "org.gradle.category": "documentation", 84 | "org.gradle.dependency.bundling": "external", 85 | "org.gradle.docstype": "sources", 86 | "org.gradle.usage": "java-runtime" 87 | }, 88 | "files": [ 89 | { 90 | "name": "module-two-1.0.0-sources.jar", 91 | "url": "module-two-1.0.0-sources.jar", 92 | "size": 261, 93 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 94 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 95 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 96 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 97 | } 98 | ] 99 | } 100 | ] 101 | } 102 | -------------------------------------------------------------------------------- /src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo/org/springframework/example/module-three/1.0.0/module-three-1.0.0.module: -------------------------------------------------------------------------------- 1 | { 2 | "formatVersion": "1.1", 3 | "component": { 4 | "group": "org.springframework.example", 5 | "module": "module-three", 6 | "version": "1.0.0", 7 | "attributes": { 8 | "org.gradle.status": "release" 9 | } 10 | }, 11 | "createdBy": { 12 | "gradle": { 13 | "version": "6.5.1", 14 | "buildId": "mvqepqsdqjcahjl7cii6b6ucoe" 15 | } 16 | }, 17 | "variants": [ 18 | { 19 | "name": "apiElements", 20 | "attributes": { 21 | "org.gradle.category": "library", 22 | "org.gradle.dependency.bundling": "external", 23 | "org.gradle.jvm.version": 8, 24 | "org.gradle.libraryelements": "jar", 25 | "org.gradle.usage": "java-api" 26 | }, 27 | "files": [ 28 | { 29 | "name": "module-three-1.0.0.jar", 30 | "url": "module-three-1.0.0.jar", 31 | "size": 261, 32 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 33 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 34 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 35 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 36 | } 37 | ] 38 | }, 39 | { 40 | "name": "runtimeElements", 41 | "attributes": { 42 | "org.gradle.category": "library", 43 | "org.gradle.dependency.bundling": "external", 44 | "org.gradle.jvm.version": 8, 45 | "org.gradle.libraryelements": "jar", 46 | "org.gradle.usage": "java-runtime" 47 | }, 48 | "files": [ 49 | { 50 | "name": "module-three-1.0.0.jar", 51 | "url": "module-three-1.0.0.jar", 52 | "size": 261, 53 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 54 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 55 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 56 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 57 | } 58 | ] 59 | }, 60 | { 61 | "name": "javadocElements", 62 | "attributes": { 63 | "org.gradle.category": "documentation", 64 | "org.gradle.dependency.bundling": "external", 65 | "org.gradle.docstype": "javadoc", 66 | "org.gradle.usage": "java-runtime" 67 | }, 68 | "files": [ 69 | { 70 | "name": "module-three-1.0.0-javadoc.jar", 71 | "url": "module-three-1.0.0-javadoc.jar", 72 | "size": 261, 73 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 74 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 75 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 76 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 77 | } 78 | ] 79 | }, 80 | { 81 | "name": "sourcesElements", 82 | "attributes": { 83 | "org.gradle.category": "documentation", 84 | "org.gradle.dependency.bundling": "external", 85 | "org.gradle.docstype": "sources", 86 | "org.gradle.usage": "java-runtime" 87 | }, 88 | "files": [ 89 | { 90 | "name": "module-three-1.0.0-sources.jar", 91 | "url": "module-three-1.0.0-sources.jar", 92 | "size": 261, 93 | "sha512": "2730ac0859e1c2f450d54647c29ece43d095eb834e2130d4949dd1151317d013c072fa8f96f5f4b49836eff7c19a2eeeb5ca7483e5dac24c368bbcd522c27a00", 94 | "sha256": "10ce8a82f7e53c67f2af8d4dc4b8cdb4d0630d0e1d21818da4d5b3ca2de08385", 95 | "sha1": "8992b17455ce660da9c5fe47226b7ded9e872637", 96 | "md5": "e84da489be91de821c95d41b8f0e0a0a" 97 | } 98 | ] 99 | } 100 | ] 101 | } 102 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/sonatype/SonatypeProperties.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2021 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.sonatype; 18 | 19 | import java.time.Duration; 20 | import java.util.Arrays; 21 | import java.util.List; 22 | 23 | import org.springframework.boot.context.properties.ConfigurationProperties; 24 | import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; 25 | 26 | /** 27 | * {@link ConfigurationProperties @ConfigurationProperties} for Sonatype. 28 | * 29 | * @author Madhura Bhave 30 | */ 31 | @ConfigurationProperties(prefix = "sonatype") 32 | public class SonatypeProperties { 33 | 34 | private String username; 35 | 36 | private String password; 37 | 38 | /** 39 | * URL of the Nexus instance used to publish releases. 40 | */ 41 | private String url; 42 | 43 | /** 44 | * ID of the staging profile used to publish releases. 45 | */ 46 | private String stagingProfileId; 47 | 48 | /** 49 | * Name of the staging profile used to publish releases. 50 | */ 51 | private String stagingProfile; 52 | 53 | /** 54 | * Whether the repository should be released automatically after a successful close. 55 | */ 56 | private boolean autoRelease = true; 57 | 58 | /** 59 | * Time between requests made to determine if the closing of a staging repository has 60 | * completed. 61 | */ 62 | private Duration pollingInterval = Duration.ofSeconds(15); 63 | 64 | /** 65 | * Number of threads used to upload artifacts to the staging repository. 66 | */ 67 | private int uploadThreads = 8; 68 | 69 | /** 70 | * Regular expression patterns of artifacts to exclude. 71 | */ 72 | private List exclude = Arrays.asList("build-info\\.json"); 73 | 74 | public String getUsername() { 75 | return this.username; 76 | } 77 | 78 | public void setUsername(String username) { 79 | this.username = username; 80 | } 81 | 82 | public String getPassword() { 83 | return this.password; 84 | } 85 | 86 | public void setPassword(String password) { 87 | this.password = password; 88 | } 89 | 90 | public String getUrl() { 91 | return this.url; 92 | } 93 | 94 | public void setUrl(String url) { 95 | this.url = url; 96 | } 97 | 98 | @Deprecated 99 | @DeprecatedConfigurationProperty(replacement = "sonatype.staging-profile") 100 | public String getStagingProfileId() { 101 | return this.stagingProfileId; 102 | } 103 | 104 | public void setStagingProfileId(String stagingProfileId) { 105 | this.stagingProfileId = stagingProfileId; 106 | } 107 | 108 | public String getStagingProfile() { 109 | return this.stagingProfile; 110 | } 111 | 112 | public void setStagingProfile(String stagingProfile) { 113 | this.stagingProfile = stagingProfile; 114 | } 115 | 116 | public boolean isAutoRelease() { 117 | return this.autoRelease; 118 | } 119 | 120 | public void setAutoRelease(boolean autoRelease) { 121 | this.autoRelease = autoRelease; 122 | } 123 | 124 | public Duration getPollingInterval() { 125 | return this.pollingInterval; 126 | } 127 | 128 | public void setPollingInterval(Duration pollingInterval) { 129 | this.pollingInterval = pollingInterval; 130 | } 131 | 132 | public int getUploadThreads() { 133 | return this.uploadThreads; 134 | } 135 | 136 | public void setUploadThreads(int uploadThreads) { 137 | this.uploadThreads = uploadThreads; 138 | } 139 | 140 | public List getExclude() { 141 | return this.exclude; 142 | } 143 | 144 | public void setExclude(List exclude) { 145 | this.exclude = exclude; 146 | } 147 | 148 | } 149 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/artifactory/payload/BuildInfoResponse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2021 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.artifactory.payload; 18 | 19 | import java.util.Arrays; 20 | import java.util.Set; 21 | import java.util.function.Predicate; 22 | import java.util.stream.Collectors; 23 | import java.util.stream.Stream; 24 | 25 | /** 26 | * Represents the response from Artifactory's buildInfo endpoint. 27 | * 28 | * @author Madhura Bhave 29 | */ 30 | public class BuildInfoResponse { 31 | 32 | private BuildInfo buildInfo; 33 | 34 | public BuildInfo getBuildInfo() { 35 | return this.buildInfo; 36 | } 37 | 38 | public void setBuildInfo(BuildInfo buildInfo) { 39 | this.buildInfo = buildInfo; 40 | } 41 | 42 | public static class BuildInfo { 43 | 44 | private String name; 45 | 46 | private String number; 47 | 48 | private String version; 49 | 50 | private Status[] statuses; 51 | 52 | private Module[] modules; 53 | 54 | public Status[] getStatuses() { 55 | return this.statuses; 56 | } 57 | 58 | public void setStatuses(Status[] statuses) { 59 | this.statuses = statuses; 60 | } 61 | 62 | public String getName() { 63 | return this.name; 64 | } 65 | 66 | public void setName(String name) { 67 | this.name = name; 68 | } 69 | 70 | public String getNumber() { 71 | return this.number; 72 | } 73 | 74 | public void setNumber(String number) { 75 | this.number = number; 76 | } 77 | 78 | public Module[] getModules() { 79 | return this.modules; 80 | } 81 | 82 | public void setModules(Module[] modules) { 83 | this.modules = modules; 84 | } 85 | 86 | public String getVersion() { 87 | return this.version; 88 | } 89 | 90 | public void setVersion(String version) { 91 | this.version = version; 92 | 93 | } 94 | 95 | public Set getArtifactDigests(Predicate predicate) { 96 | return Arrays.stream(this.modules).flatMap((module) -> { 97 | Artifact[] artifacts = module.getArtifacts(); 98 | return (artifacts != null) ? Arrays.stream(artifacts) : Stream.empty(); 99 | }).filter(predicate).map(Artifact::getSha256).collect(Collectors.toSet()); 100 | } 101 | 102 | } 103 | 104 | public static class Status { 105 | 106 | private String repository; 107 | 108 | public String getRepository() { 109 | return this.repository; 110 | } 111 | 112 | public void setRepository(String repository) { 113 | this.repository = repository; 114 | } 115 | 116 | } 117 | 118 | public static class Module { 119 | 120 | private String id; 121 | 122 | private Artifact[] artifacts; 123 | 124 | public String getId() { 125 | return this.id; 126 | } 127 | 128 | public void setId(String id) { 129 | this.id = id; 130 | } 131 | 132 | public Artifact[] getArtifacts() { 133 | return this.artifacts; 134 | } 135 | 136 | public void setArtifacts(Artifact[] artifacts) { 137 | this.artifacts = artifacts; 138 | } 139 | 140 | } 141 | 142 | public static class Artifact { 143 | 144 | private String type; 145 | 146 | private String name; 147 | 148 | private String sha256; 149 | 150 | public String getType() { 151 | return this.type; 152 | } 153 | 154 | public void setType(String type) { 155 | this.type = type; 156 | } 157 | 158 | public String getName() { 159 | return this.name; 160 | } 161 | 162 | public void setName(String name) { 163 | this.name = name; 164 | } 165 | 166 | public String getSha256() { 167 | return this.sha256; 168 | } 169 | 170 | public void setSha256(String sha256) { 171 | this.sha256 = sha256; 172 | } 173 | 174 | } 175 | 176 | } 177 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/ReleaseInfo.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts; 18 | 19 | import java.util.Arrays; 20 | 21 | import io.spring.concourse.releasescripts.artifactory.payload.BuildInfoResponse; 22 | 23 | import org.springframework.boot.context.properties.PropertyMapper; 24 | import org.springframework.util.Assert; 25 | import org.springframework.util.StringUtils; 26 | 27 | /** 28 | * Properties corresponding to the release. 29 | * 30 | * @author Madhura Bhave 31 | * @author Brian Clozel 32 | */ 33 | public class ReleaseInfo { 34 | 35 | private String buildName; 36 | 37 | private String buildNumber; 38 | 39 | private String groupId; 40 | 41 | private String version; 42 | 43 | private MarkerArtifact markerArtifact; 44 | 45 | public static ReleaseInfo from(BuildInfoResponse.BuildInfo buildInfo) { 46 | ReleaseInfo info = new ReleaseInfo(); 47 | PropertyMapper propertyMapper = PropertyMapper.get(); 48 | propertyMapper.from(buildInfo.getName()).to(info::setBuildName); 49 | propertyMapper.from(buildInfo.getNumber()).to(info::setBuildNumber); 50 | String[] moduleInfo = StringUtils.delimitedListToStringArray(buildInfo.getModules()[0].getId(), ":"); 51 | propertyMapper.from(moduleInfo[0]).to(info::setGroupId); 52 | propertyMapper.from(moduleInfo[2]).to(info::setVersion); 53 | String markerArtifact = Arrays.stream(buildInfo.getModules()) 54 | .filter(module -> Arrays.stream(module.getArtifacts()) 55 | .anyMatch(artifact -> artifact.getType().equals("jar"))) 56 | .map(BuildInfoResponse.Module::getId) 57 | .findFirst() 58 | .orElseThrow(() -> new IllegalStateException( 59 | "Could not find Jar module in build info: " + buildInfo.getNumber())); 60 | info.setMarkerArtifact(MarkerArtifact.fromCoordinates(markerArtifact)); 61 | return info; 62 | } 63 | 64 | public String getBuildName() { 65 | return this.buildName; 66 | } 67 | 68 | public void setBuildName(String buildName) { 69 | this.buildName = buildName; 70 | } 71 | 72 | public String getBuildNumber() { 73 | return this.buildNumber; 74 | } 75 | 76 | public void setBuildNumber(String buildNumber) { 77 | this.buildNumber = buildNumber; 78 | } 79 | 80 | public String getGroupId() { 81 | return this.groupId; 82 | } 83 | 84 | public void setGroupId(String groupId) { 85 | this.groupId = groupId; 86 | } 87 | 88 | public String getVersion() { 89 | return this.version; 90 | } 91 | 92 | public void setVersion(String version) { 93 | this.version = version; 94 | } 95 | 96 | public MarkerArtifact getMarkerArtifact() { 97 | return markerArtifact; 98 | } 99 | 100 | public void setMarkerArtifact(MarkerArtifact markerArtifact) { 101 | this.markerArtifact = markerArtifact; 102 | } 103 | 104 | public static class MarkerArtifact { 105 | 106 | private final String groupId; 107 | 108 | private final String artifactId; 109 | 110 | private final String version; 111 | 112 | public static MarkerArtifact fromCoordinates(String coordinates) { 113 | String[] split = coordinates.split(":"); 114 | Assert.state(split.length == 3, "Invalid artifact coordinates: " + coordinates); 115 | String groupId = split[0]; 116 | String artifactId = split[1]; 117 | String version = split[2]; 118 | return new MarkerArtifact(groupId, artifactId, version); 119 | } 120 | 121 | MarkerArtifact(String groupId, String artifactId, String version) { 122 | this.groupId = groupId; 123 | this.artifactId = artifactId; 124 | this.version = version; 125 | } 126 | 127 | public String getGroupId() { 128 | return this.groupId; 129 | } 130 | 131 | public String getArtifactId() { 132 | return this.artifactId; 133 | } 134 | 135 | public String getVersion() { 136 | return this.version; 137 | } 138 | 139 | @Override 140 | public String toString() { 141 | return "MarkerArtifact{" + this.groupId + ':' + this.artifactId + ':' + this.version + "}"; 142 | } 143 | 144 | } 145 | 146 | } 147 | -------------------------------------------------------------------------------- /ci/pipeline.yml: -------------------------------------------------------------------------------- 1 | anchors: 2 | docker-resource-source: &docker-resource-source 3 | username: ((docker-hub-username)) 4 | password: ((docker-hub-password)) 5 | 6 | resource_types: 7 | - name: registry-image 8 | type: registry-image 9 | source: 10 | <<: *docker-resource-source 11 | repository: concourse/registry-image-resource 12 | tag: 1.9.0 13 | - name: artifactory-resource 14 | type: registry-image 15 | source: 16 | <<: *docker-resource-source 17 | repository: springio/artifactory-resource 18 | tag: 0.0.18 19 | resources: 20 | - name: git-repo 21 | type: git 22 | icon: github 23 | source: 24 | uri: ((github-repo)) 25 | username: ((github-username)) 26 | password: ((github-ci-release-token)) 27 | branch: ((branch)) 28 | - name: ci-images-git-repo 29 | type: git 30 | icon: github 31 | source: 32 | uri: ((github-repo)) 33 | branch: ((branch)) 34 | paths: ["ci/images/*"] 35 | - name: ci-image 36 | type: registry-image 37 | icon: docker 38 | source: 39 | <<: *docker-resource-source 40 | repository: ((docker-hub-organization))/concourse-release-scripts-ci-image 41 | tag: 0.4.x 42 | - name: concourse-release-scripts-image 43 | type: docker-image 44 | icon: docker 45 | source: 46 | <<: *docker-resource-source 47 | repository: springio/concourse-release-scripts 48 | - name: artifactory-repo 49 | type: artifactory-resource 50 | icon: package-variant 51 | source: 52 | uri: ((artifactory-server)) 53 | username: ((artifactory-username)) 54 | password: ((artifactory-password)) 55 | build_name: ((build-name)) 56 | jobs: 57 | - name: build-ci-image 58 | plan: 59 | - get: git-repo 60 | - get: ci-images-git-repo 61 | trigger: true 62 | - task: build-ci-image 63 | privileged: true 64 | file: git-repo/ci/tasks/build-ci-image.yml 65 | output_mapping: 66 | image: ci-image 67 | vars: 68 | ci-image-name: ci-image 69 | - put: ci-image 70 | params: 71 | image: ci-image/image.tar 72 | - name: build 73 | serial: true 74 | public: true 75 | plan: 76 | - get: ci-image 77 | - get: git-repo 78 | trigger: true 79 | - do: 80 | - task: build-project 81 | privileged: true 82 | timeout: ((task-timeout)) 83 | image: ci-image 84 | file: git-repo/ci/tasks/build-project.yml 85 | params: 86 | BRANCH: ((branch)) 87 | - put: artifactory-repo 88 | params: &artifactory-params 89 | repo: libs-snapshot-local 90 | folder: distribution-repository 91 | build_uri: "https://ci.spring.io/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}/jobs/${BUILD_JOB_NAME}/builds/${BUILD_NAME}" 92 | build_number: "${BUILD_PIPELINE_NAME}-${BUILD_JOB_NAME}-${BUILD_NAME}" 93 | disable_checksum_uploads: true 94 | threads: 8 95 | get_params: 96 | threads: 8 97 | - put: concourse-release-scripts-image 98 | params: 99 | build: . 100 | dockerfile: git-repo/Dockerfile 101 | tag: built-artifact/version 102 | build_args: 103 | root: git-repo 104 | jar: built-artifact/concourse-release-scripts.jar 105 | - name: stage-release 106 | serial: true 107 | plan: 108 | - get: ci-image 109 | - get: git-repo 110 | trigger: false 111 | - task: stage 112 | image: ci-image 113 | file: git-repo/ci/tasks/stage.yml 114 | params: 115 | RELEASE_TYPE: RELEASE 116 | - put: artifactory-repo 117 | params: 118 | <<: *artifactory-params 119 | repo: libs-staging-local 120 | - put: git-repo 121 | params: 122 | repository: stage-git-repo 123 | - name: promote-release 124 | serial: true 125 | plan: 126 | - get: ci-image 127 | - get: git-repo 128 | trigger: false 129 | - get: artifactory-repo 130 | trigger: false 131 | passed: [stage-release] 132 | params: 133 | download_artifacts: true 134 | save_build_info: true 135 | - do: 136 | - task: promote 137 | image: ci-image 138 | file: git-repo/ci/tasks/promote.yml 139 | params: 140 | RELEASE_TYPE: RELEASE 141 | ARTIFACTORY_SERVER: ((artifactory-server)) 142 | ARTIFACTORY_USERNAME: ((artifactory-username)) 143 | ARTIFACTORY_PASSWORD: ((artifactory-password)) 144 | - put: concourse-release-scripts-image 145 | params: 146 | build: . 147 | dockerfile: git-repo/Dockerfile 148 | tag: built-artifact/version 149 | build_args: 150 | root: git-repo 151 | jar: built-artifact/concourse-release-scripts.jar 152 | groups: 153 | - name: "build" 154 | jobs: ["build"] 155 | - name: "release" 156 | jobs: ["stage-release", "promote-release"] 157 | - name: "ci-images" 158 | jobs: ["build-ci-image"] 159 | -------------------------------------------------------------------------------- /src/test/java/io/spring/concourse/releasescripts/sdkman/SdkmanServiceTests.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.sdkman; 18 | 19 | import org.junit.jupiter.api.AfterEach; 20 | import org.junit.jupiter.api.Test; 21 | 22 | import org.springframework.beans.factory.annotation.Autowired; 23 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 24 | import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; 25 | import org.springframework.http.HttpMethod; 26 | import org.springframework.http.MediaType; 27 | import org.springframework.test.annotation.DirtiesContext; 28 | import org.springframework.test.web.client.MockRestServiceServer; 29 | 30 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.content; 31 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; 32 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; 33 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; 34 | import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; 35 | 36 | /** 37 | * Tests for {@link SdkmanService}. 38 | * 39 | * @author Madhura Bhave 40 | * @author Brian Clozel 41 | */ 42 | @EnableConfigurationProperties(SdkmanProperties.class) 43 | @RestClientTest(SdkmanService.class) 44 | class SdkmanServiceTests { 45 | 46 | @Autowired 47 | private SdkmanProperties properties; 48 | 49 | @Autowired 50 | private SdkmanService service; 51 | 52 | @Autowired 53 | private MockRestServiceServer server; 54 | 55 | @AfterEach 56 | void tearDown() { 57 | this.server.reset(); 58 | } 59 | 60 | @Test 61 | void publishWhenMakeDefaultTrue() { 62 | setupExpectation("https://vendors.sdkman.io/release", 63 | "{\"candidate\": \"springboot\", \"version\": \"1.2.3\", \"url\": \"https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-cli/1.2.3/spring-boot-cli-1.2.3-bin.zip\"}"); 64 | setupExpectation("https://vendors.sdkman.io/default", "{\"candidate\": \"springboot\", \"version\": \"1.2.3\"}", 65 | HttpMethod.PUT); 66 | setupExpectation("https://vendors.sdkman.io/announce/struct", 67 | "{\"candidate\": \"springboot\", \"version\": \"1.2.3\"}"); 68 | this.service.publish("1.2.3", true); 69 | this.server.verify(); 70 | } 71 | 72 | @Test 73 | void publishWhenMakeDefaultFalse() { 74 | setupExpectation("https://vendors.sdkman.io/release", 75 | "{\"candidate\": \"springboot\", \"version\": \"1.2.3\", \"url\": \"https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-cli/1.2.3/spring-boot-cli-1.2.3-bin.zip\"}"); 76 | setupExpectation("https://vendors.sdkman.io/announce/struct", 77 | "{\"candidate\": \"springboot\", \"version\": \"1.2.3\"}"); 78 | this.service.publish("1.2.3", false); 79 | this.server.verify(); 80 | } 81 | 82 | @Test 83 | @DirtiesContext 84 | void publishWithChangelog() { 85 | this.properties.setBroadcastUrl("https://github.com/spring-projects/spring-boot/releases/tag/v%s"); 86 | setupExpectation("https://vendors.sdkman.io/release", 87 | "{\"candidate\": \"springboot\", \"version\": \"1.2.3\", \"url\": \"https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-cli/1.2.3/spring-boot-cli-1.2.3-bin.zip\"}"); 88 | setupExpectation("https://vendors.sdkman.io/announce/struct", 89 | "{\"candidate\": \"springboot\", \"version\": \"1.2.3\", \"url\": \"https://github.com/spring-projects/spring-boot/releases/tag/v1.2.3\"}"); 90 | this.service.publish("1.2.3", false); 91 | this.server.verify(); 92 | } 93 | 94 | private void setupExpectation(String url, String body) { 95 | setupExpectation(url, body, HttpMethod.POST); 96 | } 97 | 98 | private void setupExpectation(String url, String body, HttpMethod method) { 99 | this.server.expect(requestTo(url)) 100 | .andExpect(method(method)) 101 | .andExpect(content().json(body, true)) 102 | .andExpect(header("Consumer-Key", "sdkman-consumer-key")) 103 | .andExpect(header("Consumer-Token", "sdkman-consumer-token")) 104 | .andExpect(header("Content-Type", MediaType.APPLICATION_JSON.toString())) 105 | .andRespond(withSuccess()); 106 | } 107 | 108 | } 109 | -------------------------------------------------------------------------------- /src/test/java/io/spring/concourse/releasescripts/sonatype/SonatypeServerUtils.java: -------------------------------------------------------------------------------- 1 | package io.spring.concourse.releasescripts.sonatype; 2 | 3 | import java.io.IOException; 4 | import java.nio.file.Files; 5 | import java.nio.file.Path; 6 | import java.util.Set; 7 | import java.util.stream.Collectors; 8 | 9 | import io.spring.concourse.releasescripts.ReleaseInfo; 10 | 11 | import org.springframework.core.io.ClassPathResource; 12 | import org.springframework.http.HttpMethod; 13 | import org.springframework.http.HttpStatus; 14 | import org.springframework.http.MediaType; 15 | import org.springframework.test.web.client.ExpectedCount; 16 | import org.springframework.test.web.client.MockRestServiceServer; 17 | import org.springframework.test.web.client.RequestMatcher; 18 | 19 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; 20 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.jsonPath; 21 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; 22 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; 23 | import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; 24 | import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; 25 | 26 | /** 27 | * Test utility for mocking Sonatype server behavior. 28 | * 29 | * @author Brian Clozel 30 | */ 31 | public class SonatypeServerUtils { 32 | 33 | public static RequestMatcher requestTestArtifact() { 34 | return requestTo(String.format( 35 | "/service/local/repositories/releases/content/org/example/test/test-artifact/%s/test-artifact-%s.jar.sha1", 36 | "1.1.0.RELEASE", "1.1.0.RELEASE")); 37 | } 38 | 39 | public static String setupStagingProfile(MockRestServiceServer server) { 40 | server.expect(requestTo("/service/local/staging/profiles")) 41 | .andExpect(header("Accept", "application/json, application/*+json")) 42 | .andRespond(withStatus(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON) 43 | .body(getResource("profiles.json"))); 44 | return "2e3ed47dc2510"; 45 | } 46 | 47 | public static Set generateUploadRequests(Path artifactsRoot, String stagingRepositoryId) 48 | throws IOException { 49 | return Files.walk(artifactsRoot) 50 | .filter(Files::isRegularFile) 51 | .map(artifactsRoot::relativize) 52 | .filter((artifact) -> !"build-info.json".equals(artifact.toString())) 53 | .map((artifact) -> requestTo( 54 | "/service/local/staging/deployByRepositoryId/" + stagingRepositoryId + "/" + artifact)) 55 | .collect(Collectors.toSet()); 56 | } 57 | 58 | public static String setupStagingRepositoryCreation(MockRestServiceServer server, String stagingProfileId) { 59 | String stagedRepositoryId = "example-6789"; 60 | server.expect(requestTo("/service/local/staging/profiles/" + stagingProfileId + "/start")) 61 | .andExpect(method(HttpMethod.POST)) 62 | .andExpect(header("Content-Type", "application/json")) 63 | .andExpect(header("Accept", "application/json, application/*+json")) 64 | .andExpect(jsonPath("$.data.description").value("example-build-1")) 65 | .andRespond(withStatus(HttpStatus.CREATED).contentType(MediaType.APPLICATION_JSON) 66 | .body("{\"data\":{\"stagedRepositoryId\":\"" + stagedRepositoryId 67 | + "\", \"description\":\"example-build\"}}")); 68 | return stagedRepositoryId; 69 | } 70 | 71 | public static void attemptFinishStagingRepository(MockRestServiceServer server, String stagingProfileId, 72 | String stagingRepositoryId, boolean closed) { 73 | String closeStatus = closed ? "closed" : "open"; 74 | server.expect(requestTo("/service/local/staging/profiles/" + stagingProfileId + "/finish")) 75 | .andExpect(method(HttpMethod.POST)) 76 | .andExpect(header("Content-Type", "application/json")) 77 | .andExpect(header("Accept", "application/json, application/*+json")) 78 | .andRespond(withStatus(HttpStatus.CREATED)); 79 | server.expect(ExpectedCount.times(2), requestTo("/service/local/staging/repository/" + stagingRepositoryId)) 80 | .andExpect(method(HttpMethod.GET)) 81 | .andExpect(header("Accept", "application/json, application/*+json")) 82 | .andRespond(withSuccess().contentType(MediaType.APPLICATION_JSON) 83 | .body("{\"type\":\"open\", \"transitioning\":true}")); 84 | server.expect(requestTo("/service/local/staging/repository/" + stagingRepositoryId)) 85 | .andExpect(method(HttpMethod.GET)) 86 | .andExpect(header("Accept", "application/json, application/*+json")) 87 | .andRespond(withSuccess().contentType(MediaType.APPLICATION_JSON) 88 | .body("{\"type\":\"" + closeStatus + "\", \"transitioning\":false}")); 89 | } 90 | 91 | private static ClassPathResource getResource(String path) { 92 | return new ClassPathResource(path, SonatypeServerUtils.class); 93 | } 94 | 95 | public static ReleaseInfo getReleaseInfo() { 96 | ReleaseInfo releaseInfo = new ReleaseInfo(); 97 | releaseInfo.setBuildName("example-build"); 98 | releaseInfo.setBuildNumber("example-build-1"); 99 | releaseInfo.setVersion("1.1.0.RELEASE"); 100 | releaseInfo.setGroupId("example"); 101 | releaseInfo.setMarkerArtifact( 102 | ReleaseInfo.MarkerArtifact.fromCoordinates("org.example.test:test-artifact:1.1.0.RELEASE")); 103 | return releaseInfo; 104 | } 105 | 106 | } 107 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/artifactory/ArtifactoryService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2024 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.artifactory; 18 | 19 | import io.spring.concourse.releasescripts.ReleaseInfo; 20 | import io.spring.concourse.releasescripts.ReleaseType; 21 | import io.spring.concourse.releasescripts.artifactory.payload.BuildInfoResponse; 22 | import io.spring.concourse.releasescripts.artifactory.payload.BuildInfoResponse.Status; 23 | import io.spring.concourse.releasescripts.artifactory.payload.PromotionRequest; 24 | import org.slf4j.Logger; 25 | import org.slf4j.LoggerFactory; 26 | 27 | import org.springframework.boot.web.client.RestTemplateBuilder; 28 | import org.springframework.http.MediaType; 29 | import org.springframework.http.RequestEntity; 30 | import org.springframework.http.ResponseEntity; 31 | import org.springframework.stereotype.Component; 32 | import org.springframework.util.StringUtils; 33 | import org.springframework.web.client.HttpClientErrorException; 34 | import org.springframework.web.client.RestTemplate; 35 | 36 | /** 37 | * Central class for interacting with Artifactory's REST API. 38 | * 39 | * @author Madhura Bhave 40 | * @author Brian Clozel 41 | */ 42 | @Component 43 | public class ArtifactoryService { 44 | 45 | private static final Logger logger = LoggerFactory.getLogger(ArtifactoryService.class); 46 | 47 | private static final String PROMOTION_URL = "/api/build/promote/"; 48 | 49 | private static final String BUILD_INFO_URL = "/api/build/"; 50 | 51 | private final String rootUri; 52 | 53 | private final Repositories repositories; 54 | 55 | private final RestTemplate restTemplate; 56 | 57 | private final String project; 58 | 59 | public ArtifactoryService(RestTemplateBuilder builder, ArtifactoryProperties artifactoryProperties) { 60 | String username = artifactoryProperties.getUsername(); 61 | String password = artifactoryProperties.getPassword(); 62 | if (StringUtils.hasLength(username)) { 63 | builder = builder.basicAuthentication(username, password); 64 | } 65 | this.rootUri = artifactoryProperties.getUrl(); 66 | this.project = artifactoryProperties.getProject(); 67 | ArtifactoryProperties.Repository repository = artifactoryProperties.getRepository(); 68 | this.repositories = new Repositories(repository.getStaging(), repository.getMilestone(), 69 | repository.getReleaseCandidate(), repository.getRelease()); 70 | this.restTemplate = builder.build(); 71 | } 72 | 73 | /** 74 | * Move artifacts to a target repository in Artifactory. 75 | * @param releaseType the release type 76 | * @param releaseInfo the release information 77 | */ 78 | public void promote(ReleaseType releaseType, ReleaseInfo releaseInfo) { 79 | PromotionRequest request = getPromotionRequest(this.repositories.forReleaseType(releaseType)); 80 | String buildName = releaseInfo.getBuildName(); 81 | String buildNumber = releaseInfo.getBuildNumber(); 82 | logger.info("Promoting " + buildName + "/" + buildNumber + " to " + request.getTargetRepo()); 83 | RequestEntity requestEntity = RequestEntity 84 | .post(this.rootUri + PROMOTION_URL + buildName + "/" + buildNumber 85 | + ((this.project != null) ? ("?project=" + this.project) : "")) 86 | .contentType(MediaType.APPLICATION_JSON) 87 | .body(request); 88 | try { 89 | this.restTemplate.exchange(requestEntity, String.class); 90 | logger.debug("Promotion complete"); 91 | } 92 | catch (HttpClientErrorException ex) { 93 | boolean isAlreadyPromoted = isAlreadyPromoted(buildName, buildNumber, request.getTargetRepo()); 94 | if (isAlreadyPromoted) { 95 | logger.info("Already promoted."); 96 | } 97 | else { 98 | logger.info("Promotion failed."); 99 | throw ex; 100 | } 101 | } 102 | } 103 | 104 | private boolean isAlreadyPromoted(String buildName, String buildNumber, String targetRepo) { 105 | try { 106 | logger.debug("Checking if already promoted"); 107 | ResponseEntity entity = this.restTemplate 108 | .getForEntity( 109 | this.rootUri + BUILD_INFO_URL + buildName + "/" + buildNumber 110 | + ((this.project != null) ? ("?project=" + this.project) : ""), 111 | BuildInfoResponse.class); 112 | Status[] statuses = entity.getBody().getBuildInfo().getStatuses(); 113 | Status status = (statuses != null) ? statuses[0] : null; 114 | if (status == null) { 115 | logger.debug("Returned no status object"); 116 | return false; 117 | } 118 | logger.debug("Returned repository " + status.getRepository() + " expecting " + targetRepo); 119 | return status.getRepository().equals(targetRepo); 120 | } 121 | catch (HttpClientErrorException ex) { 122 | logger.debug("Client error, assuming not promoted"); 123 | return false; 124 | } 125 | } 126 | 127 | private PromotionRequest getPromotionRequest(String targetRepo) { 128 | return new PromotionRequest("staged", this.repositories.staging(), targetRepo); 129 | } 130 | 131 | private record Repositories(String staging, String milestone, String releaseCandidate, String release) { 132 | 133 | String forReleaseType(ReleaseType releaseType) { 134 | return switch (releaseType) { 135 | case MILESTONE -> milestone; 136 | case RELEASE_CANDIDATE -> releaseCandidate; 137 | case RELEASE -> release; 138 | }; 139 | } 140 | } 141 | 142 | } 143 | -------------------------------------------------------------------------------- /src/main/java/io/spring/concourse/releasescripts/sdkman/SdkmanService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.sdkman; 18 | 19 | import java.net.URI; 20 | 21 | import org.slf4j.Logger; 22 | import org.slf4j.LoggerFactory; 23 | 24 | import org.springframework.boot.web.client.RestTemplateBuilder; 25 | import org.springframework.http.MediaType; 26 | import org.springframework.http.RequestEntity; 27 | import org.springframework.stereotype.Component; 28 | import org.springframework.util.StringUtils; 29 | import org.springframework.web.client.RestTemplate; 30 | 31 | /** 32 | * Central class for interacting with SDKMAN's API. 33 | * 34 | * @author Madhura Bhave 35 | * @author Brian Clozel 36 | */ 37 | @Component 38 | public class SdkmanService { 39 | 40 | private static final Logger logger = LoggerFactory.getLogger(SdkmanService.class); 41 | 42 | private static final String SDKMAN_URL = "https://vendors.sdkman.io/"; 43 | 44 | private static final String DOWNLOAD_BASE_URL = "https://repo.maven.apache.org/maven2/"; 45 | 46 | private final RestTemplate restTemplate; 47 | 48 | private final SdkmanProperties properties; 49 | 50 | private final String CONSUMER_KEY_HEADER = "Consumer-Key"; 51 | 52 | private final String CONSUMER_TOKEN_HEADER = "Consumer-Token"; 53 | 54 | public SdkmanService(RestTemplateBuilder builder, SdkmanProperties properties) { 55 | this.restTemplate = builder.build(); 56 | this.properties = properties; 57 | } 58 | 59 | public void publish(String version, boolean makeDefault) { 60 | release(version); 61 | if (makeDefault) { 62 | makeDefault(version); 63 | } 64 | broadcast(version); 65 | } 66 | 67 | private void broadcast(String version) { 68 | String url = this.properties.getBroadcastUrl(); 69 | BroadcastRequest broadcastRequest = new BroadcastRequest(this.properties.getCandidate(), version, 70 | (url != null) ? String.format(url, version) : null); 71 | RequestEntity broadcastEntity = RequestEntity.post(URI.create(SDKMAN_URL + "announce/struct")) 72 | .header(this.CONSUMER_KEY_HEADER, this.properties.getConsumerKey()) 73 | .header(this.CONSUMER_TOKEN_HEADER, this.properties.getConsumerToken()) 74 | .contentType(MediaType.APPLICATION_JSON) 75 | .body(broadcastRequest); 76 | this.restTemplate.exchange(broadcastEntity, String.class); 77 | logger.debug("Broadcast complete"); 78 | } 79 | 80 | private void makeDefault(String version) { 81 | logger.debug("Making this version the default"); 82 | Request request = new Request(this.properties.getCandidate(), version); 83 | RequestEntity requestEntity = RequestEntity.put(URI.create(SDKMAN_URL + "default")) 84 | .header(this.CONSUMER_KEY_HEADER, this.properties.getConsumerKey()) 85 | .header(this.CONSUMER_TOKEN_HEADER, this.properties.getConsumerToken()) 86 | .contentType(MediaType.APPLICATION_JSON) 87 | .body(request); 88 | this.restTemplate.exchange(requestEntity, String.class); 89 | logger.debug("Make default complete"); 90 | } 91 | 92 | private void release(String version) { 93 | Artifact artifact = Artifact.parseCoordinates(this.properties.getArtifact()); 94 | ReleaseRequest releaseRequest = new ReleaseRequest(this.properties.getCandidate(), version, 95 | DOWNLOAD_BASE_URL + artifact.buildArtifactPath(version)); 96 | RequestEntity releaseEntity = RequestEntity.post(URI.create(SDKMAN_URL + "release")) 97 | .header(this.CONSUMER_KEY_HEADER, this.properties.getConsumerKey()) 98 | .header(this.CONSUMER_TOKEN_HEADER, this.properties.getConsumerToken()) 99 | .contentType(MediaType.APPLICATION_JSON) 100 | .body(releaseRequest); 101 | this.restTemplate.exchange(releaseEntity, String.class); 102 | logger.debug("Release complete"); 103 | } 104 | 105 | static class Request { 106 | 107 | private final String candidate; 108 | 109 | private final String version; 110 | 111 | public Request(String candidate, String version) { 112 | this.candidate = candidate; 113 | this.version = version; 114 | } 115 | 116 | public String getCandidate() { 117 | return this.candidate; 118 | } 119 | 120 | public String getVersion() { 121 | return this.version; 122 | } 123 | 124 | } 125 | 126 | static class ReleaseRequest extends Request { 127 | 128 | private final String url; 129 | 130 | public ReleaseRequest(String candidate, String version, String url) { 131 | super(candidate, version); 132 | this.url = url; 133 | } 134 | 135 | public String getUrl() { 136 | return this.url; 137 | } 138 | 139 | } 140 | 141 | static class BroadcastRequest extends Request { 142 | 143 | private final String url; 144 | 145 | public BroadcastRequest(String candidate, String version, String url) { 146 | super(candidate, version); 147 | this.url = url; 148 | } 149 | 150 | public String getUrl() { 151 | return this.url; 152 | } 153 | 154 | } 155 | 156 | static class Artifact { 157 | 158 | private final String groupId; 159 | 160 | private final String artifactId; 161 | 162 | private String packaging = "jar"; 163 | 164 | private String classifier = ""; 165 | 166 | public Artifact(String groupId, String artifactId) { 167 | this.groupId = groupId; 168 | this.artifactId = artifactId; 169 | } 170 | 171 | static Artifact parseCoordinates(String coordinates) { 172 | String[] split = coordinates.split(":"); 173 | Artifact artifact = new Artifact(split[0], split[1]); 174 | if (split.length > 2) { 175 | artifact.setPackaging(split[3]); 176 | } 177 | if (split.length > 3) { 178 | artifact.setClassifier(split[4]); 179 | } 180 | return artifact; 181 | } 182 | 183 | public String getGroupId() { 184 | return this.groupId; 185 | } 186 | 187 | public String getArtifactId() { 188 | return this.artifactId; 189 | } 190 | 191 | public String getPackaging() { 192 | return this.packaging; 193 | } 194 | 195 | public void setPackaging(String packaging) { 196 | this.packaging = packaging; 197 | } 198 | 199 | public String getClassifier() { 200 | return this.classifier; 201 | } 202 | 203 | public void setClassifier(String classifier) { 204 | this.classifier = classifier; 205 | } 206 | 207 | public String buildArtifactPath(String version) { 208 | StringBuilder builder = new StringBuilder(); 209 | builder.append(this.groupId.replace('.', '/')).append('/'); 210 | builder.append(this.artifactId).append('/').append(version).append('/'); 211 | builder.append(this.artifactId).append('-').append(version); 212 | if (StringUtils.hasText(this.classifier)) { 213 | builder.append('-').append(this.classifier); 214 | } 215 | builder.append('.').append(this.packaging); 216 | return builder.toString(); 217 | } 218 | 219 | } 220 | 221 | } 222 | -------------------------------------------------------------------------------- /src/test/java/io/spring/concourse/releasescripts/sonatype/SonatypeServiceTests.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2023 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package io.spring.concourse.releasescripts.sonatype; 18 | 19 | import java.io.File; 20 | import java.io.IOException; 21 | import java.nio.file.Path; 22 | import java.util.Collections; 23 | import java.util.Set; 24 | 25 | import org.junit.jupiter.api.AfterEach; 26 | import org.junit.jupiter.api.Test; 27 | 28 | import org.springframework.beans.factory.annotation.Autowired; 29 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 30 | import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; 31 | import org.springframework.core.io.ClassPathResource; 32 | import org.springframework.http.HttpMethod; 33 | import org.springframework.http.HttpStatus; 34 | import org.springframework.http.MediaType; 35 | import org.springframework.test.web.client.ExpectedCount; 36 | import org.springframework.test.web.client.MockRestServiceServer; 37 | import org.springframework.test.web.client.RequestMatcher; 38 | 39 | import static org.assertj.core.api.Assertions.assertThat; 40 | import static org.assertj.core.api.Assertions.assertThatExceptionOfType; 41 | import static org.hamcrest.Matchers.equalTo; 42 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; 43 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.jsonPath; 44 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; 45 | import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; 46 | import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; 47 | import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; 48 | 49 | /** 50 | * Tests for {@link SonatypeService}. 51 | * 52 | * @author Madhura Bhave 53 | * @author Brian Clozel 54 | */ 55 | @RestClientTest(components = SonatypeService.class, 56 | properties = { "sonatype.url=https://nexus.example.org", "sonatype.username=spring", 57 | "sonatype.stagingProfile=org.example", "sonatype.password=secret" }) 58 | @EnableConfigurationProperties(SonatypeProperties.class) 59 | class SonatypeServiceTests { 60 | 61 | @Autowired 62 | private SonatypeService service; 63 | 64 | @Autowired 65 | private MockRestServiceServer server; 66 | 67 | @AfterEach 68 | void tearDown() { 69 | this.server.reset(); 70 | } 71 | 72 | @Test 73 | void publishWhenAlreadyPublishedShouldNotPublish() { 74 | this.server.expect(SonatypeServerUtils.requestTestArtifact()) 75 | .andExpect(method(HttpMethod.GET)) 76 | .andRespond(withSuccess().body("ce8d8b6838ecceb68962b9150b18682f4237ccf71".getBytes())); 77 | Path artifactsRoot = new File("src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo") 78 | .toPath(); 79 | this.service.publish(SonatypeServerUtils.getReleaseInfo(), artifactsRoot); 80 | this.server.verify(); 81 | } 82 | 83 | @Test 84 | void publishWithSuccessfulClose() throws IOException { 85 | this.server.expect(SonatypeServerUtils.requestTestArtifact()) 86 | .andExpect(method(HttpMethod.GET)) 87 | .andRespond(withStatus(HttpStatus.NOT_FOUND)); 88 | String stagingProfileId = SonatypeServerUtils.setupStagingProfile(this.server); 89 | String stagingRepositoryId = SonatypeServerUtils.setupStagingRepositoryCreation(this.server, stagingProfileId); 90 | 91 | Path artifactsRoot = new File("src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo") 92 | .toPath(); 93 | 94 | Set uploads = SonatypeServerUtils.generateUploadRequests(artifactsRoot, stagingRepositoryId); 95 | 96 | AnyOfRequestMatcher uploadRequestsMatcher = anyOf(uploads); 97 | assertThat(uploadRequestsMatcher.getCandidates()).hasSize(150); 98 | this.server.expect(ExpectedCount.times(150), uploadRequestsMatcher) 99 | .andExpect(method(HttpMethod.PUT)) 100 | .andRespond(withSuccess()); 101 | 102 | SonatypeServerUtils.attemptFinishStagingRepository(server, stagingProfileId, stagingRepositoryId, true); 103 | 104 | this.server.expect(requestTo("/service/local/staging/bulk/promote")) 105 | .andExpect(method(HttpMethod.POST)) 106 | .andExpect(header("Content-Type", "application/json")) 107 | .andExpect(header("Accept", "application/json, application/*+json")) 108 | .andExpect(jsonPath("$.data.description").value("Releasing example-build-1")) 109 | .andExpect(jsonPath("$.data.autoDropAfterRelease").value(true)) 110 | .andExpect(jsonPath("$.data.stagedRepositoryIds") 111 | .value(equalTo(Collections.singletonList(stagingRepositoryId)))) 112 | .andRespond(withSuccess()); 113 | this.service.publish(SonatypeServerUtils.getReleaseInfo(), artifactsRoot); 114 | this.server.verify(); 115 | assertThat(uploadRequestsMatcher.getCandidates()).hasSize(0); 116 | } 117 | 118 | @Test 119 | void publishWithCloseFailureDueToRuleViolations() throws IOException { 120 | this.server.expect(SonatypeServerUtils.requestTestArtifact()) 121 | .andExpect(method(HttpMethod.GET)) 122 | .andRespond(withStatus(HttpStatus.NOT_FOUND)); 123 | String stagingProfileId = SonatypeServerUtils.setupStagingProfile(this.server); 124 | String stagingRepositoryId = SonatypeServerUtils.setupStagingRepositoryCreation(this.server, stagingProfileId); 125 | Path artifactsRoot = new File("src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo") 126 | .toPath(); 127 | Set uploads = SonatypeServerUtils.generateUploadRequests(artifactsRoot, stagingRepositoryId); 128 | 129 | AnyOfRequestMatcher uploadRequestsMatcher = anyOf(uploads); 130 | assertThat(uploadRequestsMatcher.getCandidates()).hasSize(150); 131 | 132 | this.server.expect(ExpectedCount.times(150), uploadRequestsMatcher) 133 | .andExpect(method(HttpMethod.PUT)) 134 | .andRespond(withSuccess()); 135 | 136 | SonatypeServerUtils.attemptFinishStagingRepository(server, stagingProfileId, stagingRepositoryId, false); 137 | 138 | this.server.expect(requestTo("/service/local/staging/repository/" + stagingRepositoryId + "/activity")) 139 | .andExpect(method(HttpMethod.GET)) 140 | .andExpect(header("Accept", "application/json, application/*+json")) 141 | .andRespond(withSuccess().contentType(MediaType.APPLICATION_JSON) 142 | .body(getResource("stagingFailureActivity.json"))); 143 | assertThatExceptionOfType(RuntimeException.class) 144 | .isThrownBy(() -> this.service.publish(SonatypeServerUtils.getReleaseInfo(), artifactsRoot)) 145 | .withMessage("Close failed"); 146 | this.server.verify(); 147 | assertThat(uploadRequestsMatcher.getCandidates()).hasSize(0); 148 | } 149 | 150 | private static ClassPathResource getResource(String path) { 151 | return new ClassPathResource(path, SonatypeServiceTests.class); 152 | } 153 | 154 | private AnyOfRequestMatcher anyOf(Set candidates) { 155 | return new AnyOfRequestMatcher(candidates); 156 | } 157 | 158 | } 159 | --------------------------------------------------------------------------------