diff --git a/Jenkinsfile b/Jenkinsfile index fbaeac0bf7e884cd110466aa1c82ccef998add27..53861d6861aef7b56661aefe6ee7a783a919fd90 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -48,7 +48,7 @@ pipeline { } configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) { - sh 'mvn -s $MAVEN_SETTINGS clean install -Dmaven.wagon.http.retryHandler.count=3 -DelasticTests.disabled=true' + sh "mvn -s $MAVEN_SETTINGS clean install -Dmaven.wagon.http.retryHandler.count=3 -DelasticTests.disabled=true -Dbuild.number=$BUILD_NUMBER" } } } diff --git a/pom.xml b/pom.xml index ee848024a1a3d75c5c23b3c3379c8dde2ec14430..1d4c685ba2befeb87f4d6114af6dd676ccaa7bd6 100644 --- a/pom.xml +++ b/pom.xml @@ -14,9 +14,12 @@ <version>1.0.0-SNAPSHOT</version> <name>Administration</name> <description>Administration Backend Project</description> + <properties> <imageName>docker.ozg-sh.de/administration</imageName> + <build.number>SET_BY_JENKINS</build.number> </properties> + <dependencies> <!-- Spring --> <dependency> @@ -86,7 +89,7 @@ </configuration> </plugin> </plugins> - </build> + </build> </profile> <profile> <id>release</id> @@ -102,11 +105,11 @@ </configuration> </plugin> </plugins> - </build> + </build> </profile> </profiles> <build> - <plugins> + <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> @@ -132,6 +135,19 @@ </exclude> </excludes> </configuration> + <executions> + <execution> + <id>build-info</id> + <goals> + <goal>build-info</goal> + </goals> + <configuration> + <additionalProperties> + <number>${build.number}</number> + </additionalProperties> + </configuration> + </execution> + </executions> </plugin> </plugins> </build> diff --git a/src/main/java/de/ozgcloud/admin/Root.java b/src/main/java/de/ozgcloud/admin/Root.java new file mode 100644 index 0000000000000000000000000000000000000000..b5658c3ff6a812571e2dcb10e2ba4fcc6e524740 --- /dev/null +++ b/src/main/java/de/ozgcloud/admin/Root.java @@ -0,0 +1,15 @@ +package de.ozgcloud.admin; + +import java.time.Instant; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class Root { + private String javaVersion; + private String buildVersion; + private Instant buildTime; + private String buildNumber; +} diff --git a/src/main/java/de/ozgcloud/admin/RootController.java b/src/main/java/de/ozgcloud/admin/RootController.java new file mode 100644 index 0000000000000000000000000000000000000000..bf17388b3274c557be524e5dc1d48e8dc347a7b2 --- /dev/null +++ b/src/main/java/de/ozgcloud/admin/RootController.java @@ -0,0 +1,32 @@ +package de.ozgcloud.admin; + +import org.springframework.boot.info.BuildProperties; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping(RootController.PATH) +public class RootController { + static final String PATH = "/api"; // NOSONAR + + private final BuildProperties buildProperties; + + @GetMapping + public Root getRoot() { + return buildRoot(); + } + + private Root buildRoot() { + return Root.builder() + .javaVersion(System.getProperty("java.version")) + .buildTime(buildProperties.getTime()) + .buildVersion(buildProperties.getVersion()) + .buildNumber(buildProperties.get("number")) + .build(); + } + +} diff --git a/src/test/java/de/ozgcloud/admin/RootControllerTest.java b/src/test/java/de/ozgcloud/admin/RootControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f2e35aae3631b6179a8c2941c3524296fcfa6b8e --- /dev/null +++ b/src/test/java/de/ozgcloud/admin/RootControllerTest.java @@ -0,0 +1,91 @@ +package de.ozgcloud.admin; + +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.info.BuildProperties; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import lombok.SneakyThrows; + +@ExtendWith(MockitoExtension.class) +class RootControllerTest { + + @Spy + @InjectMocks + private RootController rootController; + + @Mock + private BuildProperties buildProperties; + + private MockMvc mockMvc; + + @BeforeEach + void mock() { + mockMvc = MockMvcBuilders.standaloneSetup(rootController).build(); + } + + @DisplayName("Root") + @Nested + class TestInfo { + + @Test + @SneakyThrows + void shouldHaveJavaVersion() { + System.setProperty("java.version", RootTestFactory.JAVA_VERSION); + + ResultActions result = doRequest(); + + result.andExpect(jsonPath("$.javaVersion").value(RootTestFactory.JAVA_VERSION)); + } + + @Test + @SneakyThrows + void shouldHaveVersion() { + when(buildProperties.getVersion()).thenReturn(RootTestFactory.BUILD_VERSION); + + ResultActions result = doRequest(); + + result.andExpect(jsonPath("$.buildVersion").value(RootTestFactory.BUILD_VERSION)); + } + + @Test + @SneakyThrows + void shouldHaveBuildTime() { + when(buildProperties.getTime()).thenReturn(RootTestFactory.BUILD_TIME); + + ResultActions result = doRequest(); + + result.andExpect(jsonPath("$.buildTime").value(RootTestFactory.BUILD_TIME.getEpochSecond())); + } + + @Test + @SneakyThrows + void shouldHaveBuildNumber() { + when(buildProperties.get("number")).thenReturn(RootTestFactory.BUILD_NUMBER); + + ResultActions result = doRequest(); + + result.andExpect(jsonPath("$.buildNumber").value(RootTestFactory.BUILD_NUMBER)); + } + + @SneakyThrows + private ResultActions doRequest() { + return mockMvc.perform(get(RootController.PATH)).andExpect(status().isOk()); + } + + } + +} diff --git a/src/test/java/de/ozgcloud/admin/RootTestFactory.java b/src/test/java/de/ozgcloud/admin/RootTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..e0879c7530926dbbe52514acab93f2bf3cf63820 --- /dev/null +++ b/src/test/java/de/ozgcloud/admin/RootTestFactory.java @@ -0,0 +1,14 @@ +package de.ozgcloud.admin; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneOffset; + +public class RootTestFactory { + + public static final Instant BUILD_TIME = LocalDateTime.parse("2021-04-01T10:30").toInstant(ZoneOffset.UTC); + public static final String JAVA_VERSION = "1"; + public static final String BUILD_VERSION = "2"; + public static final String BUILD_NUMBER = "3"; + +}