mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-08-29 03:06:45 +08:00
Do not publish to Sonatype when already published
Closes gh-27080
This commit is contained in:
parent
0b2c86d122
commit
7617f0df60
@ -72,8 +72,9 @@ public class PublishToCentralCommand implements Command {
|
|||||||
byte[] content = Files.readAllBytes(new File(buildInfoLocation).toPath());
|
byte[] content = Files.readAllBytes(new File(buildInfoLocation).toPath());
|
||||||
BuildInfoResponse buildInfoResponse = this.objectMapper.readValue(content, BuildInfoResponse.class);
|
BuildInfoResponse buildInfoResponse = this.objectMapper.readValue(content, BuildInfoResponse.class);
|
||||||
BuildInfo buildInfo = buildInfoResponse.getBuildInfo();
|
BuildInfo buildInfo = buildInfoResponse.getBuildInfo();
|
||||||
|
ReleaseInfo releaseInfo = ReleaseInfo.from(buildInfo);
|
||||||
String artifactsLocation = nonOptionArgs.get(3);
|
String artifactsLocation = nonOptionArgs.get(3);
|
||||||
this.sonatype.publish(ReleaseInfo.from(buildInfo), new File(artifactsLocation).toPath());
|
this.sonatype.publish(releaseInfo, new File(artifactsLocation).toPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -89,11 +89,30 @@ public class SonatypeService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if artifacts are already published to Maven Central.
|
* Publishes the release by creating a staging repository and deploying to it the
|
||||||
* @return true if artifacts are published
|
* artifacts at the given {@code artifactsRoot}. The repository is then closed and,
|
||||||
|
* upon successfully closure, it is released.
|
||||||
* @param releaseInfo the release information
|
* @param releaseInfo the release information
|
||||||
|
* @param artifactsRoot the root directory of the artifacts to stage
|
||||||
*/
|
*/
|
||||||
public boolean artifactsPublished(ReleaseInfo releaseInfo) {
|
public void publish(ReleaseInfo releaseInfo, Path artifactsRoot) {
|
||||||
|
if (artifactsPublished(releaseInfo)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger.info("Creating staging repository");
|
||||||
|
String buildId = releaseInfo.getBuildNumber();
|
||||||
|
String repositoryId = createStagingRepository(buildId);
|
||||||
|
Collection<DeployableArtifact> artifacts = this.artifactCollector.collectArtifacts(artifactsRoot);
|
||||||
|
logger.info("Staging repository {} created. Deploying {} artifacts", repositoryId, artifacts.size());
|
||||||
|
deploy(artifacts, repositoryId);
|
||||||
|
logger.info("Deploy complete. Closing staging repository");
|
||||||
|
close(repositoryId);
|
||||||
|
logger.info("Staging repository closed");
|
||||||
|
release(repositoryId, buildId);
|
||||||
|
logger.info("Staging repository released");
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean artifactsPublished(ReleaseInfo releaseInfo) {
|
||||||
try {
|
try {
|
||||||
ResponseEntity<?> entity = this.restTemplate
|
ResponseEntity<?> entity = this.restTemplate
|
||||||
.getForEntity(String.format(NEXUS_REPOSITORY_PATH + "%s/spring-boot-%s.jar.sha1",
|
.getForEntity(String.format(NEXUS_REPOSITORY_PATH + "%s/spring-boot-%s.jar.sha1",
|
||||||
@ -109,27 +128,6 @@ public class SonatypeService {
|
|||||||
return false;
|
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,
|
|
||||||
* upon successfully closure, it is released.
|
|
||||||
* @param releaseInfo the release information
|
|
||||||
* @param artifactsRoot the root directory of the artifacts to stage
|
|
||||||
*/
|
|
||||||
public void publish(ReleaseInfo releaseInfo, Path artifactsRoot) {
|
|
||||||
logger.info("Creating staging repository");
|
|
||||||
String buildId = releaseInfo.getBuildNumber();
|
|
||||||
String repositoryId = createStagingRepository(buildId);
|
|
||||||
Collection<DeployableArtifact> artifacts = this.artifactCollector.collectArtifacts(artifactsRoot);
|
|
||||||
logger.info("Staging repository {} created. Deploying {} artifacts", repositoryId, artifacts.size());
|
|
||||||
deploy(artifacts, repositoryId);
|
|
||||||
logger.info("Deploy complete. Closing staging repository");
|
|
||||||
close(repositoryId);
|
|
||||||
logger.info("Staging repository closed");
|
|
||||||
release(repositoryId, buildId);
|
|
||||||
logger.info("Staging repository released");
|
|
||||||
}
|
|
||||||
|
|
||||||
private String createStagingRepository(String buildId) {
|
private String createStagingRepository(String buildId) {
|
||||||
Map<String, Object> body = new HashMap<>();
|
Map<String, Object> body = new HashMap<>();
|
||||||
body.put("data", Collections.singletonMap("description", buildId));
|
body.put("data", Collections.singletonMap("description", buildId));
|
||||||
|
@ -74,29 +74,23 @@ class SonatypeServiceTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void artifactsPublishedWhenPublishedShouldReturnTrue() {
|
void publishWhenAlreadyPublishedShouldNotPublish() {
|
||||||
this.server.expect(requestTo(String.format(
|
this.server.expect(requestTo(String.format(
|
||||||
"/service/local/repositories/releases/content/org/springframework/boot/spring-boot/%s/spring-boot-%s.jar.sha1",
|
"/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))
|
"1.1.0.RELEASE", "1.1.0.RELEASE"))).andExpect(method(HttpMethod.GET))
|
||||||
.andRespond(withSuccess().body("ce8d8b6838ecceb68962b9150b18682f4237ccf71".getBytes()));
|
.andRespond(withSuccess().body("ce8d8b6838ecceb68962b9150b18682f4237ccf71".getBytes()));
|
||||||
boolean published = this.service.artifactsPublished(getReleaseInfo());
|
Path artifactsRoot = new File("src/test/resources/io/spring/concourse/releasescripts/sonatype/artifactory-repo")
|
||||||
assertThat(published).isTrue();
|
.toPath();
|
||||||
this.server.verify();
|
this.service.publish(getReleaseInfo(), artifactsRoot);
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void artifactsPublishedWhenNotPublishedShouldReturnFalse() {
|
|
||||||
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();
|
this.server.verify();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void publishWithSuccessfulClose() throws IOException {
|
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));
|
||||||
this.server.expect(requestTo("/service/local/staging/profiles/1a2b3c4d/start"))
|
this.server.expect(requestTo("/service/local/staging/profiles/1a2b3c4d/start"))
|
||||||
.andExpect(method(HttpMethod.POST)).andExpect(header("Content-Type", "application/json"))
|
.andExpect(method(HttpMethod.POST)).andExpect(header("Content-Type", "application/json"))
|
||||||
.andExpect(header("Accept", "application/json, application/*+json"))
|
.andExpect(header("Accept", "application/json, application/*+json"))
|
||||||
@ -145,6 +139,10 @@ class SonatypeServiceTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void publishWithCloseFailureDueToRuleViolations() throws IOException {
|
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"))
|
this.server.expect(requestTo("/service/local/staging/profiles/1a2b3c4d/start"))
|
||||||
.andExpect(method(HttpMethod.POST)).andExpect(header("Content-Type", "application/json"))
|
.andExpect(method(HttpMethod.POST)).andExpect(header("Content-Type", "application/json"))
|
||||||
.andExpect(header("Accept", "application/json, application/*+json"))
|
.andExpect(header("Accept", "application/json, application/*+json"))
|
||||||
|
Loading…
Reference in New Issue
Block a user