Skip to content

Commit 7b14d5b

Browse files
committed
Protect against NPE in isAlreadyPromoted
Fixes gh-27094
1 parent 82963a3 commit 7b14d5b

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

ci/images/releasescripts/src/main/java/io/spring/concourse/releasescripts/artifactory/ArtifactoryService.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import io.spring.concourse.releasescripts.ReleaseInfo;
2222
import io.spring.concourse.releasescripts.artifactory.payload.BuildInfoResponse;
23+
import io.spring.concourse.releasescripts.artifactory.payload.BuildInfoResponse.Status;
2324
import io.spring.concourse.releasescripts.artifactory.payload.PromotionRequest;
2425
import org.slf4j.Logger;
2526
import org.slf4j.LoggerFactory;
@@ -96,7 +97,12 @@ private boolean isAlreadyPromoted(String buildName, String buildNumber, String t
9697
logger.debug("Checking if already promoted");
9798
ResponseEntity<BuildInfoResponse> entity = this.restTemplate
9899
.getForEntity(BUILD_INFO_URL + buildName + "/" + buildNumber, BuildInfoResponse.class);
99-
BuildInfoResponse.Status status = entity.getBody().getBuildInfo().getStatuses()[0];
100+
Status[] statuses = entity.getBody().getBuildInfo().getStatuses();
101+
BuildInfoResponse.Status status = (statuses != null) ? statuses[0] : null;
102+
if (status == null) {
103+
logger.debug("Returned no status object");
104+
return false;
105+
}
100106
logger.debug("Returned repository " + status.getRepository() + " expecting " + targetRepo);
101107
return status.getRepository().equals(targetRepo);
102108
}

ci/images/releasescripts/src/test/java/io/spring/concourse/releasescripts/artifactory/ArtifactoryServiceTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,17 @@ void promoteWhenCheckForArtifactsAlreadyPromotedFails() {
9797
this.server.verify();
9898
}
9999

100+
@Test
101+
void promoteWhenCheckForArtifactsAlreadyPromotedReturnsNoStatus() {
102+
this.server.expect(requestTo("https://repo.spring.io/api/build/promote/example-build/example-build-1"))
103+
.andRespond(withStatus(HttpStatus.CONFLICT));
104+
this.server.expect(requestTo("https://repo.spring.io/api/build/example-build/example-build-1"))
105+
.andRespond(withJsonFrom("no-status-build-info-response.json"));
106+
assertThatExceptionOfType(HttpClientErrorException.class)
107+
.isThrownBy(() -> this.service.promote("libs-milestone-local", getReleaseInfo()));
108+
this.server.verify();
109+
}
110+
100111
@Test
101112
void promoteWhenPromotionFails() {
102113
this.server.expect(requestTo("https://repo.spring.io/api/build/promote/example-build/example-build-1"))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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+
},
25+
"uri": "https://my-artifactory-repo.com/api/build/example/example-build-1"
26+
}

0 commit comments

Comments
 (0)