Replace static version field with ClassPathResource.

Previously, the default version was loaded from a java constant. This version used to be updated by hand after the release train was published to maven central, then built and deployed by hand. Spring-Cloud-Cli is now built and deployed automatically, but the default version hasn't been updated. The default version was only used if the version couldn't be read from the manifest (which should be the version used during release.

The constant was replaced with the contents of a file that is updated at build time. This process works for development and release without any manual intervention.

Fixes gh-174
This commit is contained in:
spencergibb
2021-02-08 13:26:25 -05:00
parent 7c1d3e1433
commit de714224a9
4 changed files with 40 additions and 12 deletions

View File

@@ -87,6 +87,12 @@
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>

View File

@@ -16,6 +16,9 @@
package org.springframework.cloud.launcher.deployer;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -31,7 +34,10 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.logging.logback.LogbackLoggingSystem;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;
/**
@@ -42,8 +48,6 @@ public class DeployerApplication {
private static final Logger logger = LoggerFactory
.getLogger(DeployerApplication.class);
private static final String DEFAULT_VERSION = "2.2.0.RELEASE";
private String[] args;
public DeployerApplication(String... args) {
@@ -103,8 +107,19 @@ public class DeployerApplication {
String getVersion() {
Package pkg = DeployerApplication.class.getPackage();
return (pkg != null ? pkg.getImplementationVersion() == null ? DEFAULT_VERSION
: pkg.getImplementationVersion() : DEFAULT_VERSION);
return (pkg != null ? pkg.getImplementationVersion() == null ? getDefaultVersion()
: pkg.getImplementationVersion() : getDefaultVersion());
}
String getDefaultVersion() {
try (InputStream in = new ClassPathResource("META-INF/cli-version.txt").getInputStream()) {
return StreamUtils.copyToString(in, StandardCharsets.UTF_8);
}
catch (IOException e) {
ReflectionUtils.rethrowRuntimeException(e);
}
// not reachable since exception rethrown at runtime
return null;
}
private void launch() {

View File

@@ -20,8 +20,7 @@ import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Spencer Gibb
@@ -36,28 +35,35 @@ public class DeployerApplicationTests {
public void testDefaultLibrary() throws Exception {
DeployerApplication wrapper = new DeployerApplication();
if (System.getProperty("project.version") != null) {
assertThat(wrapper.getVersion(),
containsString(System.getProperty("project.version")));
assertThat(wrapper.getVersion())
.contains(System.getProperty("project.version"));
}
}
@Test
public void testCreateClassLoaderAndListDeployables() throws Exception {
new DeployerApplication("--launcher.list=true").run();
assertThat(output.toString(), containsString("configserver"));
assertThat(output.toString()).contains("configserver");
}
@Test
public void testNonOptionArgsPassedDown() throws Exception {
new DeployerApplication("--launcher.list=true", "--spring.profiles.active=test")
.run();
assertThat(output.toString(), containsString("foo"));
assertThat(output.toString()).contains("foo");
}
@Test
public void testInvalidDeployableFails() throws Exception {
new DeployerApplication("--launcher.deploy=foo,bar").run();
assertThat(output.toString(),
containsString("The following are not valid: 'foo,bar'"));
assertThat(output.toString())
.contains("The following are not valid: 'foo,bar'");
}
@Test
public void defaultVersionReadFromFile() {
String defaultVersion = new DeployerApplication("--launcher.deploy=foo,bar").getDefaultVersion();
// starts with one or more digits then a .
assertThat(defaultVersion).isNotBlank().containsPattern("^\\d+\\..*");
}
}