Skip to content

Commit c73f881

Browse files
2.3.14 Release - Bugfixes and and test improvements (#35)
* wip * Update docs * Do not add x86_64 archType to image tag * update groovy * Use correct groupid for new groovy version * WIP * Basic JSM and Bitbucket setup.groovy * Updated to use devstack 2.3.13 and latest SR Basic JSM Setup.groovy * Updated to use devstack 2.3.13 JsmContainer.groovy * Added new parameter/field jvmSupportRecommendedArgs * Reworked some of enableJvmDebug to work with jvmSupportRecommendedArgs JsmAndBitbucketH2Deployment.groovy * Now sets JSM to allow App upload using enableAppUpload() ExamplesTest.groovy * WIP, needs to be tested once this version of DevStack has been built pom.xml * Bumped docker-client 2024-02-10T12-30-00 -> 2024-03-16T11-35-00 * Various tweaks and bugfixes related to running the tests --------- Co-authored-by: Joni Lahtinen <joni.lahtinen@eficode.com>
1 parent 46bc95b commit c73f881

File tree

14 files changed

+292
-43
lines changed

14 files changed

+292
-43
lines changed

README.md

+6-1
Original file line numberDiff line numberDiff line change
@@ -155,4 +155,9 @@ mvn dependency:get -Dartifact=com.eficode:devstack-standalone:2.3.9-SNAPSHOT -Dr
155155
# Breaking Changes
156156

157157
* 2.3.9
158-
* From now on two artifacts will be generated, devstack and devstack-standalone and the classifier standalone is deprecated
158+
* From now on two artifacts will be generated, devstack and devstack-standalone and the classifier standalone is deprecated
159+
160+
# Requirements
161+
The devstack packages are mainly built for JAVA 17 but should work with java 8+ and should work with groovy
162+
* 3.x >= 3.0.17
163+
* 4.x >= 4.0.11

examples/Basic JSM Setup.groovy

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@GrabResolver(name = 'github', root = 'https://github.com/eficode/DevStack/raw/packages/repository/')
2-
@Grab(group = 'com.eficode', module = 'devstack', version = '2.2.0-SNAPSHOT-groovy-3.0.14', classifier = "standalone")
2+
@Grab(group = 'com.eficode', module = 'devstack-standalone', version = '2.3.13')
33
@Grab(group='org.slf4j', module='slf4j-simple', version='1.7.36', scope='test')
44
@GrabConfig(systemClassLoader=true, initContextClassLoader=true)
55

examples/Basic JSM and Bitbucket setup.groovy

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@GrabResolver(name = 'github', root = 'https://github.com/eficode/DevStack/raw/packages/repository/')
2-
@Grab(group = 'com.eficode', module = 'devstack', version = '2.2.0-SNAPSHOT-groovy-3.0.14', classifier = "standalone")
2+
@Grab(group = 'com.eficode', module = "devstack-standalone", version = '2.3.14')
33
@Grab(group='org.slf4j', module='slf4j-simple', version='1.7.36', scope='test')
44
@GrabConfig(systemClassLoader=true, initContextClassLoader=true)
55

@@ -37,7 +37,7 @@ jsmAndBb.jsmContainer.setJvmMaxRam(4096)
3737

3838
//Install JIRA App.
3939
//ScriptRunner is needed for setting up application link between JIRA and Bitbucket
40-
jsmAndBb.jiraAppsToInstall = ["https://marketplace.atlassian.com/download/apps/6820/version/1005740":scriptRunnerLicense]
40+
jsmAndBb.jiraAppsToInstall = ["https://marketplace.atlassian.com/download/apps/6820/version/1007940":scriptRunnerLicense]
4141

4242
//Stop and remove if already existing
4343
jsmAndBb.stopAndRemoveDeployment()

pom.xml

+18-22
Original file line numberDiff line numberDiff line change
@@ -6,50 +6,47 @@
66

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

1212
<name>DevStack</name>
1313

1414
<description>A series of scripts for setting up common developer application suites</description>
1515

1616
<properties>
17-
<maven.compiler.source>11</maven.compiler.source>
18-
<maven.compiler.target>11</maven.compiler.target>
19-
<groovy.major.version>3.0</groovy.major.version>
20-
<groovy.version>[3.0,4.0)</groovy.version>
21-
<spock-core.version>2.4-M1-groovy-${groovy.major.version}</spock-core.version>
17+
<java.version>11</java.version>
18+
<maven.compiler.source>${java.version}</maven.compiler.source>
19+
<maven.compiler.target>${java.version}</maven.compiler.target>
20+
<groovy.major.version>4.0</groovy.major.version>
21+
<groovy.groupId>org.apache.groovy</groovy.groupId>
22+
<groovy.version>4.0.18</groovy.version>
23+
<spock-core.version>2.3-groovy-${groovy.major.version}</spock-core.version>
2224
<jiraShortcuts.version>2.0.3-SNAPSHOT-groovy-3.0</jiraShortcuts.version>
2325
<bitbucketinstancemanager.version>0.0.3-SNAPSHOT-groovy-3.0</bitbucketinstancemanager.version>
26+
<jirainstancemanager.version>2.1.4</jirainstancemanager.version>
2427
</properties>
2528

2629

2730
<dependencies>
28-
29-
30-
3131
<dependency>
32-
<groupId>org.codehaus.groovy</groupId>
33-
<artifactId>groovy-all</artifactId>
32+
<groupId>${groovy.groupId}</groupId>
33+
<artifactId>groovy</artifactId>
3434
<version>${groovy.version}</version>
35-
<scope>provided</scope>
36-
<type>pom</type>
3735
</dependency>
3836
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml -->
3937
<dependency>
4038
<groupId>com.fasterxml.jackson.dataformat</groupId>
4139
<artifactId>jackson-dataformat-yaml</artifactId>
4240
<version>2.15.3</version>
4341
</dependency>
44-
4542
<dependency>
46-
<groupId>org.codehaus.groovy</groupId>
43+
<groupId>${groovy.groupId}</groupId>
4744
<artifactId>groovy-json</artifactId>
4845
<version>${groovy.version}</version>
4946
</dependency>
5047
<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-ant -->
5148
<dependency>
52-
<groupId>org.codehaus.groovy</groupId>
49+
<groupId>${groovy.groupId}</groupId>
5350
<artifactId>groovy-ant</artifactId>
5451
<version>${groovy.version}</version>
5552
</dependency>
@@ -84,7 +81,7 @@
8481
<dependency>
8582
<groupId>org.slf4j</groupId>
8683
<artifactId>slf4j-simple</artifactId>
87-
<version>2.0.0</version>
84+
<version>2.0.1</version>
8885
</dependency>
8986
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
9087
<dependency>
@@ -102,15 +99,15 @@
10299
<dependency>
103100
<groupId>com.eficode.atlassian</groupId>
104101
<artifactId>jirainstancemanager</artifactId>
105-
<version>2.1.1</version>
102+
<version>${jirainstancemanager.version}</version>
106103
</dependency>
107104

108105

109106
<!-- https://mvnrepository.com/artifact/de.gesellix/docker-client -->
110107
<dependency>
111108
<groupId>de.gesellix</groupId>
112109
<artifactId>docker-client</artifactId>
113-
<version>2023-12-01T19-40-00</version>
110+
<version>2024-03-16T11-35-00</version>
114111
</dependency>
115112

116113

@@ -207,10 +204,9 @@
207204
</executions>
208205
<dependencies>
209206
<dependency>
210-
<groupId>org.codehaus.groovy</groupId>
207+
<groupId>${groovy.groupId}</groupId>
211208
<artifactId>groovy</artifactId>
212209
<version>${groovy.version}</version>
213-
<scope>runtime</scope>
214210
</dependency>
215211
</dependencies>
216212
<configuration>
@@ -222,4 +218,4 @@
222218
</plugins>
223219
</build>
224220

225-
</project>
221+
</project>

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ trait Container {
246246
* @return
247247
*/
248248
String getShortId() {
249-
return getContainerId().substring(0,12)
249+
return getContainerId()?.substring(0,12)
250250
}
251251

252252
String getId() {
@@ -838,8 +838,7 @@ trait Container {
838838
*/
839839
static ArrayList<String> runCmdAndRm(String cmd, long timeoutMs, ArrayList<Map> mounts = [], String dockerHost = "", String dockerCertPath = "") {
840840

841-
842-
return runCmdAndRm(["/bin/sh", "-c", cmd], timeoutMs, mounts, dockerHost, dockerCertPath)
841+
return this.runCmdAndRm(["/bin/sh", "-c", cmd], timeoutMs, mounts, dockerHost, dockerCertPath)
843842
}
844843

845844

src/main/groovy/com/eficode/devstack/container/impl/HarborManagerContainer.groovy

+4-3
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class HarborManagerContainer extends DoodContainer {
176176
yamlFile.write( objectMapper.writeValueAsString(modifiedYml))
177177

178178
assert copyFileToContainer(yamlFile.absolutePath, installPath + "/harbor/"): "Error copying updated YAML file to container"
179-
tmpDir.deleteDir()
179+
tmpDir.toFile().deleteDir()
180180

181181
log.info("\tFinished customizing docker-compose file")
182182

@@ -190,8 +190,9 @@ class HarborManagerContainer extends DoodContainer {
190190
boolean modifyInstallYml() {
191191

192192

193-
Path tmpDir = Files.createTempDirectory("harbor-conf")
194-
String tmpDirPath = tmpDir.toFile().absolutePath
193+
File tmpDir = File.createTempDir("harbor-conf")
194+
195+
String tmpDirPath = tmpDir.absolutePath
195196

196197

197198
ArrayList<File> files = copyFilesFromContainer("${installPath}/harbor/harbor.yml.tmpl", tmpDirPath + "/")

src/main/groovy/com/eficode/devstack/container/impl/JsmContainer.groovy

+22-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class JsmContainer implements Container {
2323
long jvmMaxRam = 6000
2424

2525
private String debugPort //Contains the port used for JVM debug
26+
ArrayList<String> jvmSupportRecommendedArgs = [] //Used for setting application properties: https://confluence.atlassian.com/adminjiraserver/setting-properties-and-options-on-startup-938847831.html
2627

2728
JsmContainer(String dockerHost = "", String dockerCertPath = "") {
2829
if (dockerHost && dockerCertPath) {
@@ -36,8 +37,18 @@ class JsmContainer implements Container {
3637
*/
3738
void enableJvmDebug(String portNr = "5005") {
3839

39-
assert !created: "Error, cant enable JVM Debug for a container that has already been crated"
40+
assert !created: "Error, cant enable JVM Debug for a container that has already been created"
4041
debugPort = portNr
42+
jvmSupportRecommendedArgs += ["-Xdebug", "-Xrunjdwp:transport=dt_socket,address=*:${debugPort},server=y,suspend=n"]
43+
}
44+
45+
/**
46+
* Enables upload of Apps so that not only Marketplace apps can be installed
47+
* See: https://jira.atlassian.com/browse/JRASERVER-77129
48+
*/
49+
void enableAppUpload() {
50+
assert !created: "Error, cant enable App Upload for a container that has already been created"
51+
jvmSupportRecommendedArgs += ["-Dupm.plugin.upload.enabled=true"]
4152
}
4253

4354
/**
@@ -84,7 +95,6 @@ class JsmContainer implements Container {
8495

8596
c.image = image
8697
c.hostname = containerName
87-
c.env = ["JVM_MAXIMUM_MEMORY=" + jvmMaxRam + "m", "JVM_MINIMUM_MEMORY=" + ((jvmMaxRam / 2) as String) + "m", "ATL_TOMCAT_PORT=" + containerMainPort] + customEnvVar
8898

8999

90100
c.exposedPorts = [(containerMainPort + "/tcp"): [:]]
@@ -94,15 +104,19 @@ class JsmContainer implements Container {
94104
if (debugPort) {
95105
h.portBindings.put((debugPort + "/tcp"), [new PortBinding("0.0.0.0", (debugPort))])
96106
c.exposedPorts.put((debugPort + "/tcp"), [:])
97-
c.env.add("JVM_SUPPORT_RECOMMENDED_ARGS=-Xdebug -Xrunjdwp:transport=dt_socket,address=*:${debugPort},server=y,suspend=n".toString())
98107
}
99108

100109

101110
h.mounts = this.preparedMounts
102111
}
103112

113+
c.env = ["JVM_MAXIMUM_MEMORY=" + jvmMaxRam + "m", "JVM_MINIMUM_MEMORY=" + ((jvmMaxRam / 2) as String) + "m", "ATL_TOMCAT_PORT=" + containerMainPort] + customEnvVar
114+
104115

116+
}
105117

118+
if (jvmSupportRecommendedArgs) {
119+
containerCreateRequest.env.add("JVM_SUPPORT_RECOMMENDED_ARGS=" + jvmSupportRecommendedArgs.join(" "))
106120
}
107121

108122
return containerCreateRequest
@@ -136,11 +150,16 @@ class JsmContainer implements Container {
136150
startContainer()
137151
}
138152

153+
139154
return success
140155

141156
}
142157

143158
Volume getSnapshotVolume(String snapshotName = "") {
159+
160+
if (!created) {
161+
return null
162+
}
144163
snapshotName = snapshotName ?: shortId + "-clone"
145164

146165
ArrayList<Volume> volumes = dockerClient.getVolumesWithName(snapshotName)

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class JenkinsAndHarborDeployment implements Deployment {
107107

108108
if (jenkinsFuture.done) {
109109
log.info("\tJenkins deployment finished successfully:" + jenkinsFuture.get())
110-
log.info("\t\tJenkins URL:" + jenkinsDeployment.baseUrl)
110+
log.info("\t\tJenkins URL:" + getJenkinsDeployment().baseUrl)
111111
log.info("\t\tJenkins Admin PW:" + jenkinsContainer.initialAdminPassword)
112112
}
113113

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

+1
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ class JsmAndBitbucketH2Deployment implements Deployment {
123123
assert bitbucketLicense: "Error no Bitbucket License has been setup"
124124

125125
jsmH2Deployment.setJiraLicense(jiraLicense)
126+
jsmH2Deployment.jsmContainer.enableAppUpload()
126127
bitbucketH2Deployment.setBitbucketLicence(bitbucketLicense)
127128

128129
jsmH2Deployment.deploymentNetworkName = this.containerNetworkName

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

+2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ class JsmH2Deployment implements Deployment{
112112
if (useSnapshotIfAvailable && jsmContainer.created && jsmContainer.getSnapshotVolume()) {
113113
log.info("\tSnapshot is available, will restore that instead of setting up new JSM")
114114
assert jsmContainer.restoreJiraHomeSnapshot(): "Error resting snapshot for " + jsmContainer.shortId
115+
log.info("\t\tSnapshot restored, waiting for jira to become responsive")
116+
jiraRest.waitForJiraToBeResponsive(120)
115117
log.info("\t" * 2 + "Finished restoring JSM snapshot")
116118
return true
117119
} else {

src/main/resources/com/eficode/devstack/deployment/jira/scripts/CreateBitbucketLink.groovy

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.eficode.atlassian.JiraShortcuts.test.resources.jiraLocalScripts
1+
package com.eficode.devstack.deployment.jira.scripts
22

33
/**
44
* A script executed in JIRA by Scriptrunner

0 commit comments

Comments
 (0)