Skip to content

Commit 46bc95b

Browse files
authored
JIM 2.1, Imrpoved Tests, JSM Deploy imrpovments (#34)
* Container.groovy * Now waits for engine to report created JsmH2Deployment.groovy * Now waits for Jira to become responsive DockerClientDS.groovy * New method for deleting images Improved reliability of several tests Updated JIM to 2.1.1 Updated docker client to 2023-12-01T19-40-00 Udpated gmavenplus-plugin to 3.0.2 * Tweaking
1 parent 626f4a6 commit 46bc95b

18 files changed

+188
-160
lines changed

.github/workflows/publish-maven-package.yml

+4-3
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,13 @@ jobs:
4343
mkdir -p repository/com/eficode/devstack-standalone
4444
4545
echo Building and installing "normal" version
46-
mvn install -f pom.xml -DcreateChecksum=true
46+
mvn install -f pom.xml -DcreateChecksum=true -DskipTests
4747
4848
echo Creating pom for standalone version and installing
4949
mvn gplus:execute@execute
50-
mvn install -f pom-standalone.xml -DcreateChecksum=true
51-
50+
mvn install -f pom-standalone.xml -DcreateChecksum=true -DskipTests
51+
52+
5253

5354
- name: Copying JAR files
5455
run: |

pom.xml

+23-29
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.eficode</groupId>
88
<artifactId>devstack</artifactId>
9-
<version>2.3.12-SNAPSHOT</version>
9+
<version>2.3.13</version>
1010
<packaging>jar</packaging>
1111

1212
<name>DevStack</name>
@@ -102,31 +102,18 @@
102102
<dependency>
103103
<groupId>com.eficode.atlassian</groupId>
104104
<artifactId>jirainstancemanager</artifactId>
105-
<version>2.0.3-SNAPSHOT</version>
105+
<version>2.1.1</version>
106106
</dependency>
107107

108108

109109
<!-- https://mvnrepository.com/artifact/de.gesellix/docker-client -->
110110
<dependency>
111111
<groupId>de.gesellix</groupId>
112112
<artifactId>docker-client</artifactId>
113-
<version>2023-08-16T08-25-00</version>
113+
<version>2023-12-01T19-40-00</version>
114114
</dependency>
115115

116116

117-
<!--dependency>
118-
<groupId>org.junit.jupiter</groupId>
119-
<artifactId>junit-jupiter-api</artifactId>
120-
<version>5.9.0</version>
121-
<scope>test</scope>
122-
</dependency>
123-
<dependency>
124-
<groupId>org.junit.jupiter</groupId>
125-
<artifactId>junit-jupiter-engine</artifactId>
126-
<version>5.9.0</version>
127-
<scope>test</scope>
128-
</dependency-->
129-
130117
<dependency>
131118
<groupId>org.junit.jupiter</groupId>
132119
<artifactId>junit-jupiter-api</artifactId>
@@ -179,10 +166,29 @@
179166
</execution>
180167
</executions>
181168
</plugin>
169+
<plugin>
170+
<artifactId>maven-surefire-plugin</artifactId>
171+
<version>3.2.5</version>
172+
<configuration>
173+
<useFile>false</useFile>
174+
<includes>
175+
<include>**/*Test</include>
176+
<include>**/*Spec</include>
177+
</includes>
178+
<statelessTestsetReporter implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5Xml30StatelessReporter">
179+
<disable>false</disable>
180+
<version>3.0</version>
181+
<usePhrasedFileName>false</usePhrasedFileName>
182+
<usePhrasedTestSuiteClassName>true</usePhrasedTestSuiteClassName>
183+
<usePhrasedTestCaseClassName>true</usePhrasedTestCaseClassName>
184+
<usePhrasedTestCaseMethodName>true</usePhrasedTestCaseMethodName>
185+
</statelessTestsetReporter>
186+
</configuration>
187+
</plugin>
182188
<plugin>
183189
<groupId>org.codehaus.gmavenplus</groupId>
184190
<artifactId>gmavenplus-plugin</artifactId>
185-
<version>2.0.0</version>
191+
<version>3.0.2</version>
186192
<executions>
187193
<execution>
188194
<goals>
@@ -213,18 +219,6 @@
213219
</scripts>
214220
</configuration>
215221
</plugin>
216-
<plugin>
217-
<groupId>org.apache.maven.plugins</groupId>
218-
<artifactId>maven-surefire-plugin</artifactId>
219-
<version>3.0.0-M7</version>
220-
<configuration>
221-
<includes>
222-
<include>**/*Spec.class</include>
223-
<include>**/*Test.java</include>
224-
</includes>
225-
<skipTests>true</skipTests>
226-
</configuration>
227-
</plugin>
228222
</plugins>
229223
</build>
230224

src/main/groovy/com/eficode/devstack/container/Container.groovy

+11
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,17 @@ trait Container {
167167
assert setContainerNetworks(networks): "Error setting container networks to:" + containerDefaultNetworks
168168

169169
containerId = response.content.id
170+
171+
long createTimeoutMs = 10000
172+
long createWaitStart = System.currentTimeMillis()
173+
174+
while (!created && (createWaitStart + createTimeoutMs ) > System.currentTimeMillis()) {
175+
sleep(1000)
176+
}
177+
if (!created) {
178+
log.warn("Timed out waiting for container to be created: " + containerId)
179+
}
180+
170181
return containerId
171182

172183
}

src/main/groovy/com/eficode/devstack/deployment/impl/JsmAndBitbucketH2Deployment.groovy

+1
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class JsmAndBitbucketH2Deployment implements Deployment {
126126
bitbucketH2Deployment.setBitbucketLicence(bitbucketLicense)
127127

128128
jsmH2Deployment.deploymentNetworkName = this.containerNetworkName
129+
129130
bitbucketH2Deployment.deploymentNetworkName = this.containerNetworkName
130131
jsmContainer.createBridgeNetwork(this.containerNetworkName)
131132

src/main/groovy/com/eficode/devstack/deployment/impl/JsmH2Deployment.groovy

+4-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class JsmH2Deployment implements Deployment{
4343
this.containers = [new JsmContainer(dockerHost, dockerCertPath)]
4444
jsmContainer.containerMainPort = jsmContainer.extractPortFromUrl(jiraBaseUrl)
4545
jsmContainer.containerName = jsmContainer.extractDomainFromUrl(jiraBaseUrl)
46+
4647
}
4748

4849
JsmContainer getJsmContainer() {
@@ -138,7 +139,7 @@ class JsmH2Deployment implements Deployment{
138139

139140
jsmContainer.containerDefaultNetworks = [deploymentNetworkName]
140141
jsmContainer.createContainer()
141-
log.info("\tCreated jsm container:" + jsmContainer.id)
142+
log.info("*\tCreated jsm container:" + jsmContainer.id)
142143

143144
assert jsmContainer.startContainer() : "Error starting JSM container:" + jsmContainer.id
144145
log.info("\tStarted JSM container")
@@ -147,6 +148,8 @@ class JsmH2Deployment implements Deployment{
147148
String cmdJiraConfigProperties = "echo \"jira.websudo.is.disabled=true\" >> jira-config.properties; chown jira:jira jira-config.properties && echo status: \$?"
148149
assert jsmContainer.runBashCommandInContainer(cmdJiraConfigProperties).find {it == "status: 0"} : "Error creating jira-config.properties file"
149150

151+
log.info("\tWaiting for JIRA to startup")
152+
jiraRest.waitForJiraToBeResponsive()
150153
log.info("\tSetting up local H2 database")
151154
assert jiraRest.setupH2Database() : "Error setting up H2 database for JSM"
152155
log.info("\t\tDatabase setup successfully")

src/main/groovy/com/eficode/devstack/util/DockerClientDS.groovy

+21-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import de.gesellix.docker.remote.api.ContainerSummary
1010
import de.gesellix.docker.remote.api.ExecConfig
1111
import de.gesellix.docker.remote.api.ExecStartConfig
1212
import de.gesellix.docker.remote.api.IdResponse
13+
import de.gesellix.docker.remote.api.ImageDeleteResponseItem
1314
import de.gesellix.docker.remote.api.SystemInfo
1415
import de.gesellix.docker.remote.api.Volume
1516
import de.gesellix.docker.remote.api.VolumeCreateOptions
@@ -121,11 +122,11 @@ class DockerClientDS extends DockerClientImpl {
121122
* @return true on success
122123
*/
123124
boolean overwriteVolume(String srcVolumeName, String destinationVolumeName) {
124-
ArrayList<Volume>srcVolumes = getVolumesWithName(srcVolumeName)
125-
assert srcVolumes.size() == 1 : "Error identifying src volume with name:" + srcVolumeName
125+
ArrayList<Volume> srcVolumes = getVolumesWithName(srcVolumeName)
126+
assert srcVolumes.size() == 1: "Error identifying src volume with name:" + srcVolumeName
126127

127-
ArrayList<Volume>destVolumes = getVolumesWithName(destinationVolumeName)
128-
assert destVolumes.size() == 1 : "Error identifying destination volume with name:" + destinationVolumeName
128+
ArrayList<Volume> destVolumes = getVolumesWithName(destinationVolumeName)
129+
assert destVolumes.size() == 1: "Error identifying destination volume with name:" + destinationVolumeName
129130

130131

131132
return overwriteVolume(srcVolumes.first(), destVolumes.first())
@@ -242,11 +243,26 @@ class DockerClientDS extends DockerClientImpl {
242243
String execId = execCreateResult.content.id
243244
ExecStartConfig execStartConfig = new ExecStartConfig(
244245
(execConfig.detachKeys ?: false) as Boolean,
245-
execConfig.tty
246+
execConfig.tty,
247+
execConfig.consoleSize
246248
)
249+
250+
247251
startExec(execId, execStartConfig, callback, timeout)
248252
return execCreateResult
249253

250254
}
251255

256+
257+
EngineResponseContent<List<ImageDeleteResponseItem>> deleteImage(String imageName, String imageTag) {
258+
259+
String preExistingImage = manageImage.findImageId(imageName, imageTag)
260+
if (preExistingImage && preExistingImage.startsWith("sha256")) {
261+
return manageImage.rmi(preExistingImage)
262+
}
263+
264+
return null
265+
266+
}
267+
252268
}

src/main/groovy/com/eficode/devstack/util/ImageBuilder.groovy

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ class ImageBuilder extends DoodContainer {
5353
String artifactName = "atlassian-servicedesk"
5454
String archType = dockerClient.engineArch
5555
String imageTag = "$imageName:$jsmVersion-$archType"
56-
containerName = imageTag.replaceAll(/[^a-zA-Z0-9_.-]/, "-").take(128-"-imageBuilder".length())
57-
containerName += "-imageBuilder"
56+
containerName = "jsm-builder-$jsmVersion-$archType".replaceAll(/[^a-zA-Z0-9_.-]/, "-")
57+
5858

5959
//Check first if an image with the expected tag already exists
6060
if (!force) {

src/test/groovy/com/eficode/devstack/container/ContainerTest.groovy

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class ContainerTest extends DevStackSpec {
1515
def setupSpec() {
1616

1717

18-
dockerRemoteHost = "https://docker.domain.se:2376"
19-
dockerCertPath = "~/.docker/"
18+
//dockerRemoteHost = "https://docker.domain.se:2376"
19+
//dockerCertPath = "~/.docker/"
2020

2121

2222
log = LoggerFactory.getLogger(ContainerTest.class)

src/test/groovy/com/eficode/devstack/container/impl/BitbucketContainerTest.groovy

+4-5
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class BitbucketContainerTest extends DevStackSpec {
1515

1616

1717
def setupSpec() {
18-
dockerRemoteHost = "https://docker.domain.se:2376"
19-
dockerCertPath = "~/.docker/"
18+
//dockerRemoteHost = "https://docker.domain.se:2376"
19+
//dockerCertPath = "~/.docker/"
2020

2121

2222
log = LoggerFactory.getLogger(BitbucketContainerTest.class)
@@ -46,20 +46,19 @@ class BitbucketContainerTest extends DevStackSpec {
4646
assert containerInspect.name == "/" + bbc.containerName: "BB was not given the expected name"
4747
assert containerInspect.state.status == ContainerState.Status.Created: "BB Container status is of unexpected value"
4848
assert containerInspect.state.running == false: "BB Container was started even though it should only have been created"
49-
assert dockerClient.inspectImage(containerInspect.image).content.repoTags.find { it == "atlassian/bitbucket:latest" }: "BB container was created with incorrect Docker image"
49+
assert dockerClient.inspectImage(containerInspect.image).content.repoTags.find { it == "atlassian/bitbucket:latest" || it.contains("atlassian/bitbucket:${BitbucketContainer.getLatestBbVersion()}") }: "BB container was created with incorrect Docker image"
5050
assert containerInspect.hostConfig.portBindings.containsKey("7990/tcp"): "BB Container port binding was not setup correctly"
5151
log.info("\tBB Container was setup correctly")
5252

5353
expect:
5454
bbc.startContainer()
55-
bbr.setApplicationProperties(new File("resources/bitbucket/licenses/bitbucketLicense").text)
55+
bbr.setApplicationProperties(new File(System.getProperty("user.home") + "/.licenses/bitbucket/bitbucket.license").text)
5656
bbr.status == "RUNNING"
5757

5858

5959
where:
6060
dockerHost | certPath | baseUrl
6161
"" | "" | "http://localhost:7990"
62-
dockerRemoteHost | dockerCertPath | "http://bitbucket.domain.se:7990"
6362

6463

6564
}

src/test/groovy/com/eficode/devstack/container/impl/DoodContainerTest.groovy

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ class DoodContainerTest extends DevStackSpec {
88

99
def setupSpec() {
1010

11-
dockerRemoteHost = "https://docker.domain.se:2376"
12-
dockerCertPath = "~/.docker/"
11+
//dockerRemoteHost = "https://docker.domain.se:2376"
12+
//dockerCertPath = "~/.docker/"
1313

1414

1515
DevStackSpec.log = LoggerFactory.getLogger(DoodContainerTest.class)

src/test/groovy/com/eficode/devstack/container/impl/JenkinsContainerTest.groovy

+4-3
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ class JenkinsContainerTest extends DevStackSpec{
1414

1515
def setupSpec() {
1616

17-
dockerRemoteHost = "https://docker.domain.se:2376"
18-
dockerCertPath = "~/.docker/"
17+
dockerRemoteHost = ""
18+
dockerCertPath = ""
1919

2020
DevStackSpec.log = LoggerFactory.getLogger(JenkinsContainerTest.class)
2121

2222

23+
2324
cleanupContainerNames = ["jenkins.domain.se", "jenkins-agent.domain.se", "localhost"]
2425
cleanupContainerPorts = [8080, 50000]
2526

@@ -95,7 +96,7 @@ class JenkinsContainerTest extends DevStackSpec{
9596
where:
9697
dockerHost | certPath | baseUrl
9798
"" | "" | "http://localhost:8080"
98-
dockerRemoteHost | dockerCertPath | "http://jenkins.domain.se:8080"
99+
99100

100101

101102

0 commit comments

Comments
 (0)