diff --git a/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/command/PublishToCentralCommand.java b/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/command/PublishToCentralCommand.java index 23ec5a319d..2dccc1876e 100644 --- a/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/command/PublishToCentralCommand.java +++ b/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/command/PublishToCentralCommand.java @@ -72,8 +72,9 @@ public class PublishToCentralCommand implements Command { byte[] content = Files.readAllBytes(new File(buildInfoLocation).toPath()); BuildInfoResponse buildInfoResponse = this.objectMapper.readValue(content, BuildInfoResponse.class); BuildInfo buildInfo = buildInfoResponse.getBuildInfo(); + ReleaseInfo releaseInfo = ReleaseInfo.from(buildInfo); String artifactsLocation = nonOptionArgs.get(3); - this.sonatype.publish(ReleaseInfo.from(buildInfo), new File(artifactsLocation).toPath()); + this.sonatype.publish(releaseInfo, new File(artifactsLocation).toPath()); } } diff --git a/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/sonatype/SonatypeService.java b/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/sonatype/SonatypeService.java index 1f17dd1260..da92b0c207 100644 --- a/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/sonatype/SonatypeService.java +++ b/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/sonatype/SonatypeService.java @@ -88,27 +88,6 @@ public class SonatypeService { this.artifactCollector = new ArtifactCollector(sonatypeProperties.getExclude()); } - /** - * Checks if artifacts are already published to Maven Central. - * @return true if artifacts are published - * @param releaseInfo the release information - */ - public boolean artifactsPublished(ReleaseInfo releaseInfo) { - try { - ResponseEntity entity = this.restTemplate - .getForEntity(String.format(NEXUS_REPOSITORY_PATH + "%s/spring-boot-%s.jar.sha1", - releaseInfo.getVersion(), releaseInfo.getVersion()), byte[].class); - if (HttpStatus.OK.equals(entity.getStatusCode())) { - logger.info("Already published to Sonatype."); - return true; - } - } - catch (HttpClientErrorException ex) { - - } - return false; - } - /** * Publishes the release by creating a staging repository and deploying to it the * artifacts at the given {@code artifactsRoot}. The repository is then closed and, @@ -117,6 +96,9 @@ public class SonatypeService { * @param artifactsRoot the root directory of the artifacts to stage */ public void publish(ReleaseInfo releaseInfo, Path artifactsRoot) { + if (artifactsPublished(releaseInfo)) { + return; + } logger.info("Creating staging repository"); String buildId = releaseInfo.getBuildNumber(); String repositoryId = createStagingRepository(buildId); @@ -130,6 +112,22 @@ public class SonatypeService { logger.info("Staging repository released"); } + private boolean artifactsPublished(ReleaseInfo releaseInfo) { + try { + ResponseEntity entity = this.restTemplate + .getForEntity(String.format(NEXUS_REPOSITORY_PATH + "%s/spring-boot-%s.jar.sha1", + releaseInfo.getVersion(), releaseInfo.getVersion()), byte[].class); + if (HttpStatus.OK.equals(entity.getStatusCode())) { + logger.info("Already published to Sonatype."); + return true; + } + } + catch (HttpClientErrorException ex) { + + } + return false; + } + private String createStagingRepository(String buildId) { Map body = new HashMap<>(); body.put("data", Collections.singletonMap("description", buildId)); diff --git a/ci/images/releasescripts/src/test/java/io/spring/concourse/releasescripts/sonatype/SonatypeServiceTests.java b/ci/images/releasescripts/src/test/java/io/spring/concourse/releasescripts/sonatype/SonatypeServiceTests.java index c8bd5e8e7d..6c9133c7c6 100644 --- a/ci/images/releasescripts/src/test/java/io/spring/concourse/releasescripts/sonatype/SonatypeServiceTests.java +++ b/ci/images/releasescripts/src/test/java/io/spring/concourse/releasescripts/sonatype/SonatypeServiceTests.java @@ -74,29 +74,23 @@ class SonatypeServiceTests { } @Test - void artifactsPublishedWhenPublishedShouldReturnTrue() { + void publishWhenAlreadyPublishedShouldNotPublish() { this.server.expect(requestTo(String.format( "/service/local/repositories/releases/content/org/springframework/boot/spring-boot/%s/spring-boot-%s.jar.sha1", "1.1.0.RELEASE", "1.1.0.RELEASE"))).andExpect(method(HttpMethod.GET)) .andRespond(withSuccess().body("ce8d8b6838ecceb68962b9150b18682f4237ccf71".getBytes())); - boolean published = this.service.artifactsPublished(getReleaseInfo()); - assertThat(published).isTrue(); + Path artifactsRoot = new File("src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo") + .toPath(); + this.service.publish(getReleaseInfo(), artifactsRoot); this.server.verify(); } @Test - void artifactsPublishedWhenNotPublishedShouldReturnFalse() { + void publishWithSuccessfulClose() throws IOException { this.server.expect(requestTo(String.format( "/service/local/repositories/releases/content/org/springframework/boot/spring-boot/%s/spring-boot-%s.jar.sha1", "1.1.0.RELEASE", "1.1.0.RELEASE"))).andExpect(method(HttpMethod.GET)) .andRespond(withStatus(HttpStatus.NOT_FOUND)); - boolean published = this.service.artifactsPublished(getReleaseInfo()); - assertThat(published).isFalse(); - this.server.verify(); - } - - @Test - void publishWithSuccessfulClose() throws IOException { this.server.expect(requestTo("/service/local/staging/profiles/1a2b3c4d/start")) .andExpect(method(HttpMethod.POST)).andExpect(header("Content-Type", "application/json")) .andExpect(header("Accept", "application/json, application/*+json")) @@ -145,6 +139,10 @@ class SonatypeServiceTests { @Test void publishWithCloseFailureDueToRuleViolations() throws IOException { + this.server.expect(requestTo(String.format( + "/service/local/repositories/releases/content/org/springframework/boot/spring-boot/%s/spring-boot-%s.jar.sha1", + "1.1.0.RELEASE", "1.1.0.RELEASE"))).andExpect(method(HttpMethod.GET)) + .andRespond(withStatus(HttpStatus.NOT_FOUND)); this.server.expect(requestTo("/service/local/staging/profiles/1a2b3c4d/start")) .andExpect(method(HttpMethod.POST)).andExpect(header("Content-Type", "application/json")) .andExpect(header("Accept", "application/json, application/*+json"))