Skip to content

Commit 70bacf5

Browse files
committed
AllureContainer.groovy
* Added setResultsVolume() JsmDevDeployment.groovy * Now syncs spock reports to allure
1 parent 0fd7d7e commit 70bacf5

File tree

3 files changed

+124
-35
lines changed

3 files changed

+124
-35
lines changed
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.eficode.devstack.container.impl
22

33
import com.eficode.devstack.container.Container
4-
import de.gesellix.docker.remote.api.ContainerCreateRequest
4+
import de.gesellix.docker.remote.api.Volume
55

66
class AllureContainer implements Container {
77

@@ -10,7 +10,6 @@ class AllureContainer implements Container {
1010
String containerImage = "frankescobar/allure-docker-service"
1111
String containerImageTag = "latest"
1212
String defaultShell = "/bin/bash"
13-
String user = "2001:2001"
1413

1514

1615
AllureContainer(String dockerHost = "", String dockerCertPath = "") {
@@ -19,5 +18,10 @@ class AllureContainer implements Container {
1918
}
2019
}
2120

21+
void setResultsVolume(String volumeName) {
22+
Volume volume = dockerClient.getOrCreateVolume(volumeName)
23+
prepareVolumeMount(volume.name, "/app/allure-results", false)
24+
}
25+
2226

2327
}

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

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import com.eficode.devstack.container.impl.JsmContainer
66
import com.eficode.devstack.deployment.Deployment
77
import com.eficode.devstack.util.DirectorySyncer
88
import com.eficode.devstack.util.DockerClientDS
9-
import de.gesellix.docker.client.DockerClient
10-
import de.gesellix.docker.client.EngineResponseContent
119
import de.gesellix.docker.remote.api.Volume
1210
import org.slf4j.Logger
1311
import org.slf4j.LoggerFactory
@@ -27,7 +25,9 @@ class JsmDevDeployment implements Deployment {
2725
Volume srcCodeVolume
2826

2927
AllureContainer allureContainer
28+
Volume jiraReportVolume
3029
Volume allureReportVolume
30+
DirectorySyncer reportSyncer
3131

3232
DockerClientDS dockerClient
3333

@@ -42,17 +42,27 @@ class JsmDevDeployment implements Deployment {
4242
allureContainer.containerName = componentsPrefix + "-reporter"
4343
dockerClient = allureContainer.dockerClient
4444

45-
allureReportVolume = getOrCreateVolume( componentsPrefix+ "-reports")
45+
46+
allureReportVolume = dockerClient.getOrCreateVolume(componentsPrefix + "-allureReports")
47+
jiraReportVolume = dockerClient.getOrCreateVolume(componentsPrefix + "-jiraReports")
4648
allureContainer.prepareCustomEnvVar(["CHECK_RESULTS_EVERY_SECONDS=3", "KEEP_HISTORY=1", "KEEP_HISTORY_LATEST=30"])
47-
allureContainer.prepareVolumeMount(allureReportVolume.name, "/app/allure-results", false)
49+
allureContainer.setResultsVolume(allureReportVolume.name)
4850

4951

50-
srcCodeVolume = getOrCreateVolume(componentsPrefix + "-code")
52+
srcCodeVolume = dockerClient.getOrCreateVolume(componentsPrefix + "-code")
53+
srcSyncer = DirectorySyncer.getDuplicateContainer(dockerClient, "SrcSyncer")
5154
this.srcCodePaths = srcCodePaths
5255

56+
if (srcSyncer?.created) {
57+
log.warn("Old SrcSyncer container exists, removing it before proceeding")
58+
srcSyncer.stopAndRemoveContainer()
59+
srcSyncer = null
60+
}
61+
62+
5363
subDeployments.add(new JsmH2Deployment(jiraBaseUrl, dockerHost, dockerCertPath))
5464
jsmDeployment.jsmContainer.prepareVolumeMount(srcCodeVolume.name, "/var/atlassian/application-data/jira/scripts/", false)
55-
jsmDeployment.jsmContainer.prepareVolumeMount(allureReportVolume.name, "/var/atlassian/application-data/jira/allure-results/", false)
65+
jsmDeployment.jsmContainer.prepareVolumeMount(jiraReportVolume.name, "/var/atlassian/application-data/jira/allure-results/", false)
5666

5767

5868
}
@@ -68,40 +78,65 @@ class JsmDevDeployment implements Deployment {
6878

6979
@Override
7080
ArrayList<Container> getContainers() {
71-
return [srcSyncer, allureContainer, jsmContainer]
81+
return [srcSyncer, allureContainer, jsmContainer, reportSyncer]
7282
}
7383

7484
@Override
7585
void setContainers(ArrayList<Container> containers) {
7686
throw new InputMismatchException("Not implemented")
7787
}
7888

79-
Volume getOrCreateVolume(String volumeName) {
80-
Volume volume = dockerClient.getVolumesWithName(volumeName).find { true }
81-
82-
if (volume) {
83-
log.debug("\tFound existing volume:" + volume.name)
84-
} else {
85-
log.debug("\tCreating new volume $volumeName")
86-
EngineResponseContent<Volume> volumeResponse = dockerClient.createVolume(volumeName)
87-
volume = volumeResponse?.content
88-
assert volume: "Error creating volume $volumeName, " + volumeResponse?.getStatus()?.text
89-
log.debug("\t\tCreated volume:" + volume.name)
89+
@Override
90+
boolean stopAndRemoveDeployment() {
91+
92+
Volume jsmSnapshotVolume
93+
94+
try {
95+
jsmSnapshotVolume = jsmContainer.getSnapshotVolume()
96+
}catch (ignored){}
97+
98+
99+
Boolean success = Deployment.super.stopAndRemoveDeployment()
100+
if (jiraReportVolume) {
101+
dockerClient.rmVolume(jiraReportVolume.name)
102+
}
103+
if (allureReportVolume) {
104+
dockerClient.rmVolume(allureReportVolume.name)
90105
}
91106

92-
return volume
107+
if (srcCodeVolume) {
108+
dockerClient.rmVolume(srcCodeVolume.name)
109+
}
110+
111+
if (jsmSnapshotVolume) {
112+
dockerClient.rmVolume(jsmSnapshotVolume.name)
113+
}
114+
115+
return success
116+
93117
}
94118

95119
@Override
96120
boolean setupDeployment() {
97121

98122

99123
srcSyncer = DirectorySyncer.createSyncToVolume(srcCodePaths, srcCodeVolume.name, "SrcSyncer", "-avh --chown=2001:2001")
124+
125+
126+
reportSyncer = DirectorySyncer.syncBetweenVolumesAndUsers(jiraReportVolume.name, allureReportVolume.name, "1000:1000", "ReportSyncer")
127+
128+
100129
allureContainer.created ?: allureContainer.createContainer()
101130
allureContainer.startContainer()
102131

103-
jsmDeployment.setupDeployment(true, false)
104132

133+
jsmDeployment.setupDeployment(true, true)
134+
//Change owner of the mounted volume
135+
jsmContainer.runBashCommandInContainer("chown -R jira:jira /var/atlassian/application-data/jira/allure-results", 10, "root")
136+
137+
if (jsmDeployment.jiraRest.scriptRunnerIsInstalled()) {
138+
jsmDeployment.jiraRest.deploySpockEndpoint(['com.riadalabs.jira.plugins.insight' ])
139+
}
105140

106141
}
107142

src/test/groovy/com/eficode/devstack/deployment/impl/JsmDevDeploymentSpec.groovy

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package com.eficode.devstack.deployment.impl
22

3+
import com.eficode.atlassian.jira.remotespock.beans.responses.SpockOutputType
34
import com.eficode.atlassian.jiraInstanceManager.JiraInstanceManagerRest
45
import com.eficode.atlassian.jiraInstanceManager.beans.MarketplaceApp
56
import com.eficode.devstack.DevStackSpec
67
import de.gesellix.docker.remote.api.ContainerSummary
78
import org.slf4j.LoggerFactory
89
import spock.lang.Shared
910

10-
class JsmDevDeploymentSpec extends DevStackSpec{
11+
class JsmDevDeploymentSpec extends DevStackSpec {
1112

1213
@Shared
1314
File srLicenseFile = new File(System.getProperty("user.home") + "/.licenses/jira/sr.license")
1415
@Shared
15-
File jsmLicenseFile = new File(System.getProperty("user.home") + "/.licenses/jira/jsm.license")
16-
16+
File jsmLicenseFile = new File(System.getProperty("user.home") + "/.licenses/jira/jsm.license")
1717

1818

1919
def setupSpec() {
@@ -36,49 +36,99 @@ class JsmDevDeploymentSpec extends DevStackSpec{
3636
}
3737

3838

39-
def "Test basics"(){
39+
String getSuccessfulSpockBody() {
40+
return """
41+
package com.eficode.atlassian.jira.jiraLocalScripts
42+
43+
44+
import org.slf4j.Logger
45+
import org.slf4j.LoggerFactory
46+
import spock.lang.Shared
47+
import spock.lang.Specification
48+
49+
class JiraLocalSpockTest extends Specification {
50+
51+
@Shared
52+
static Logger log = LoggerFactory.getLogger(JiraLocalSpockTest.class)
53+
54+
55+
def "A successful test in JiraLocalSpockTest"() {
56+
57+
setup:
58+
59+
log.warn("Running spock test:" + this.specificationContext.currentIteration.name)
60+
expect:
61+
true
62+
63+
cleanup:
64+
log.warn("\\tTest finished with exception:" + \$spock_feature_throwable)
65+
66+
}
67+
68+
69+
70+
}
71+
""".stripIndent()
72+
}
73+
74+
def "Test basics"() {
4075

4176

4277
setup:
4378

4479
File localSrcDir = File.createTempDir()
4580
localSrcDir.deleteOnExit()
4681

47-
String baseUrl = "http://spockdev.localhost"
82+
String hostName = "spockdev.localhost"
83+
String baseUrl = "http://$hostName"
4884

4985
JiraInstanceManagerRest jim = new JiraInstanceManagerRest(baseUrl)
5086

5187

5288
when:
53-
JsmDevDeployment jsmDevDep= new JsmDevDeployment.Builder(baseUrl ,jsmLicenseFile.text, [localSrcDir.canonicalPath])
89+
JsmDevDeployment jsmDevDep = new JsmDevDeployment.Builder(baseUrl, jsmLicenseFile.text, [localSrcDir.canonicalPath])
5490
.setJsmJvmDebugPort("5005")
5591
.setJsmVersion("latest")
5692
.enableJsmDood()
5793
.addAppToInstall(MarketplaceApp.getScriptRunnerVersion().downloadUrl, srLicenseFile.text)
5894
.build()
5995

60-
jsmDevDep.stopAndRemoveDeployment()
61-
62-
ArrayList<ContainerSummary> containersBefore = getContainers()
96+
6397

6498
jsmDevDep.setupDeployment()
6599
ArrayList<ContainerSummary> containersAfter = getContainers()
66100

67101

68102
then:
69-
containersAfter.size() - containersBefore.size() == 3
103+
containersAfter.find {it.names.toString().contains("spockdev.localhost")}
104+
containersAfter.find {it.names.toString().contains("spockdev.localhost-reporter")}
105+
containersAfter.find {it.names.toString().contains("ReportSyncer")}
106+
containersAfter.find {it.names.toString().contains("SrcSyncer")}
70107

71108

72109
when: "Creating a file in the local synced dir"
73-
File localTestFile = new File(localSrcDir, "testFile.groovy")
74-
localTestFile.text = System.currentTimeMillis()
110+
111+
File localTestFile = new File(localSrcDir, "com/eficode/atlassian/jira/jiraLocalScripts/JiraLocalSpockTest.groovy")
112+
localTestFile.createParentDirectories()
113+
localTestFile.text = getSuccessfulSpockBody()
114+
sleep(2000)
75115

76116
then: "It should be available in the container"
77-
jim.getScriptrunnerFile("testFile.groovy") == localTestFile.text
117+
jim.getScriptrunnerFile("com/eficode/atlassian/jira/jiraLocalScripts/JiraLocalSpockTest.groovy") == getSuccessfulSpockBody()
78118

79119
expect:
80120
jsmDevDep.jsmContainer.appAppUploadEnabled
81121
jsmDevDep.jsmContainer.enableJvmDebug() == null
122+
assert jim.isSpockEndpointDeployed(true) : "Spock endpoint was not deployed"
123+
124+
when:"Running spocktest"
125+
jim.runSpockTest("com.eficode.atlassian.jira.jiraLocalScripts.JiraLocalSpockTest", "", SpockOutputType.AllureReport, "allure-results/")
126+
sleep(2000)
127+
then:
128+
jsmDevDep.allureContainer.runBashCommandInContainer("ls -l /app/allure-results/")
129+
assert jsmDevDep.jsmContainer.runBashCommandInContainer("ls allure-results").first().split("\n").every { reportName ->
130+
jsmDevDep.allureContainer.runBashCommandInContainer("ls /app/allure-results/$reportName && echo Status: \$?").toString().contains("Status: 0")
131+
} : "All Reports in JIRA container haven't been synced to Allure container"
82132

83133

84134
cleanup:

0 commit comments

Comments
 (0)