diff --git a/ci/images/releasescripts/pom.xml b/ci/images/releasescripts/pom.xml index 6dc3a70680c..05bd6dde8e9 100644 --- a/ci/images/releasescripts/pom.xml +++ b/ci/images/releasescripts/pom.xml @@ -44,6 +44,10 @@ com.fasterxml.jackson.module jackson-module-parameter-names + + org.awaitility + awaitility + org.springframework.boot spring-boot-starter-test diff --git a/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/bintray/BintrayService.java b/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/bintray/BintrayService.java index f3ee0d9cd41..c5b38b74bb2 100644 --- a/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/bintray/BintrayService.java +++ b/ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/bintray/BintrayService.java @@ -17,19 +17,25 @@ package io.spring.concourse.releasescripts.bintray; import java.net.URI; +import java.util.Objects; +import java.util.concurrent.TimeUnit; import io.spring.concourse.releasescripts.ReleaseInfo; import io.spring.concourse.releasescripts.sonatype.SonatypeProperties; import io.spring.concourse.releasescripts.sonatype.SonatypeService; import io.spring.concourse.releasescripts.system.ConsoleLogger; +import org.awaitility.core.ConditionTimeoutException; import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; +import static org.awaitility.Awaitility.waitAtMost; + /** * Central class for interacting with Bintray's REST API. * @@ -64,25 +70,29 @@ public class BintrayService { } public boolean isDistributionComplete(ReleaseInfo releaseInfo) { - RequestEntity publishedFilesRequest = getRequest(releaseInfo, 0); RequestEntity allFilesRequest = getRequest(releaseInfo, 1); - Object[] allFiles = this.restTemplate.exchange(allFilesRequest, Object[].class).getBody(); - int count = 0; - while (count < 120) { - Object[] publishedFiles = this.restTemplate.exchange(publishedFilesRequest, Object[].class).getBody(); - int unpublished = allFiles.length - publishedFiles.length; - if (unpublished == 0) { - return true; - } - count++; + Object[] allFiles = waitAtMost(5, TimeUnit.MINUTES).with().pollDelay(20, TimeUnit.SECONDS).until(() -> { try { - Thread.sleep(20000); + return this.restTemplate.exchange(allFilesRequest, Object[].class).getBody(); } - catch (InterruptedException e) { - + catch (HttpClientErrorException ex) { + if (ex.getStatusCode() != HttpStatus.NOT_FOUND) { + throw ex; + } + return null; } + }, Objects::nonNull); + RequestEntity publishedFilesRequest = getRequest(releaseInfo, 0); + try { + waitAtMost(40, TimeUnit.MINUTES).with().pollDelay(20, TimeUnit.SECONDS).until(() -> { + Object[] publishedFiles = this.restTemplate.exchange(publishedFilesRequest, Object[].class).getBody(); + return allFiles.length == publishedFiles.length; + }); } - return false; + catch (ConditionTimeoutException ex) { + return false; + } + return true; } private RequestEntity getRequest(ReleaseInfo releaseInfo, int includeUnpublished) { diff --git a/ci/images/releasescripts/src/test/java/io/spring/concourse/releasescripts/bintray/BintrayServiceTests.java b/ci/images/releasescripts/src/test/java/io/spring/concourse/releasescripts/bintray/BintrayServiceTests.java index 0cbccbe1494..e622ed3adb4 100644 --- a/ci/images/releasescripts/src/test/java/io/spring/concourse/releasescripts/bintray/BintrayServiceTests.java +++ b/ci/images/releasescripts/src/test/java/io/spring/concourse/releasescripts/bintray/BintrayServiceTests.java @@ -28,6 +28,7 @@ import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.web.client.ExpectedCount; import org.springframework.test.web.client.MockRestServiceServer; @@ -40,6 +41,7 @@ import static org.springframework.test.web.client.match.MockRestRequestMatchers. import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; +import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; /** @@ -73,6 +75,11 @@ class BintrayServiceTests { @Test void isDistributionComplete() throws Exception { + this.server + .expect(requestTo(String.format( + "https://api.bintray.com/packages/%s/%s/%s/versions/%s/files?include_unpublished=%s", + this.properties.getSubject(), this.properties.getRepo(), "example", "1.1.0.RELEASE", 1))) + .andRespond(withStatus(HttpStatus.NOT_FOUND)); setupGetPackageFiles(1, "all-package-files.json"); setupGetPackageFiles(0, "published-files.json"); setupGetPackageFiles(0, "all-package-files.json");