Skip to content

Commit 88868be

Browse files
authored
Improved built_and_test.yml (#1928)
1 parent 61907bf commit 88868be

File tree

12 files changed

+139
-154
lines changed

12 files changed

+139
-154
lines changed

.github/workflows/build_and_test.yml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ jobs:
4040
with:
4141
path: ~/.konan
4242
key: ${{ runner.os }}-gradle-konan-${{ env.KOTLIN_VERSION }}
43-
- name: Build all (excluding tests for save-orchestrator-common)
43+
- name: Build all (excluding save-orchestrator-common, save-orchestrator and save-sandbox)
4444
uses: gradle/gradle-build-action@v2
4545
with:
4646
gradle-version: wrapper
@@ -50,19 +50,23 @@ jobs:
5050
-x detekt
5151
-x spotlessCheck
5252
-x :save-agent:linkDebugExecutableLinuxX64
53-
-x :save-orchestrator-common:check
53+
-x :save-orchestrator-common:build
54+
-x :save-orchestrator:build
55+
-x :save-sandbox:build
5456
-Pdetekt.multiplatform.disabled=true
5557
-PgprUser=${{ github.actor }}
5658
-PgprKey=${{ secrets.GITHUB_TOKEN }}
5759
--scan
5860
--build-cache
59-
- name: Check save-orchestrator-common
61+
- name: Build save-orchestrator-common, save-orchestrator and save-sandbox
6062
uses: gradle/gradle-build-action@v2
6163
with:
6264
gradle-version: wrapper
6365
gradle-home-cache-cleanup: true
6466
arguments: |
65-
:save-orchestrator-common:check
67+
:save-orchestrator-common:build
68+
:save-orchestrator:build
69+
:save-sandbox:build
6670
-x detekt
6771
-x spotlessCheck
6872
-x :save-agent:linkDebugExecutableLinuxX64

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import com.saveourtool.save.buildutils.*
33
@Suppress("DSL_SCOPE_VIOLATION", "RUN_IN_SCRIPT") // https://github.com/gradle/gradle/issues/22797
44
plugins {
55
id("com.saveourtool.save.buildutils.versioning-configuration")
6+
id("com.saveourtool.save.buildutils.save-cli-download-configuration")
67
id("com.saveourtool.save.buildutils.code-quality-convention")
78
id("com.saveourtool.save.buildutils.publishing-configuration")
89
alias(libs.plugins.talaiot.base)

gradle/plugins/src/main/kotlin/com/saveourtool/save/buildutils/VersioningConfiguration.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import org.ajoberstar.grgit.gradle.GrgitServicePlugin
99
import org.ajoberstar.reckon.gradle.ReckonExtension
1010
import org.ajoberstar.reckon.gradle.ReckonPlugin
1111
import org.gradle.api.Project
12+
import org.gradle.api.provider.Provider
1213
import org.gradle.kotlin.dsl.*
14+
import java.util.*
1315

1416
/**
1517
* @return path to the file with save-cli version for current build
@@ -50,6 +52,16 @@ fun Project.configureVersioning() {
5052
}
5153
}
5254

55+
/**
56+
* @return save-cli version for current build
57+
*/
58+
@Suppress("CUSTOM_GETTERS_SETTERS")
59+
internal fun Project.readSaveCliVersion(): Provider<String> = rootProject.tasks.named("getSaveCliVersion")
60+
.map { getSaveCliVersionTask ->
61+
val file = file(getSaveCliVersionTask.outputs.files.singleFile)
62+
Properties().apply { load(file.reader()) }["version"] as String
63+
}
64+
5365
/**
5466
* @return true if this string denotes a snapshot version
5567
*/

gradle/plugins/src/main/kotlin/com/saveourtool/save/buildutils/save-cli-configuration.gradle.kts

Lines changed: 29 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,77 +5,63 @@
55
package com.saveourtool.save.buildutils
66

77
import de.undercouch.gradle.tasks.download.Download
8-
import org.gradle.api.tasks.TaskProvider
98
import org.gradle.kotlin.dsl.*
109
import java.io.File
11-
import java.util.*
1210

1311
plugins {
1412
kotlin("jvm")
1513
id("de.undercouch.download")
1614
}
1715

18-
/**
19-
* @return version of save-cli from properties file
20-
*/
21-
fun Project.readSaveCliVersion(): String {
22-
val file = file(pathToSaveCliVersion)
23-
return Properties().apply { load(file.reader()) }["version"] as String
24-
}
25-
26-
/**
27-
* @return save-cli file path to copy
28-
*/
29-
fun Project.getSaveCliPath(): String {
30-
val saveCliVersion = readSaveCliVersion()
31-
val saveCliPath = findProperty("saveCliPath")?.takeIf { saveCliVersion.isSnapshot() } as String?
32-
?: "https://github.com/saveourtool/save-cli/releases/download/v$saveCliVersion"
33-
return "$saveCliPath/save-$saveCliVersion-linuxX64.kexe"
34-
}
35-
3616
@Suppress("GENERIC_VARIABLE_WRONG_DECLARATION")
37-
val downloadSaveCliTaskProvider: TaskProvider<Download> = tasks.register<Download>("downloadSaveCli") {
38-
dependsOn(":getSaveCliVersion")
39-
40-
src { getSaveCliPath() }
41-
dest { "$buildDir/download/${File(getSaveCliPath()).name}" }
17+
val copySaveCliTaskProvider = tasks.register<Copy>("copySaveCli") {
18+
val saveCliFile = rootProject.tasks.named<Download>("downloadSaveCli")
19+
.map { downloadTask ->
20+
downloadTask.dest
21+
}
22+
val outputDir = "$buildDir/download"
23+
inputs.file(saveCliFile)
24+
outputs.dir(outputDir)
4225

43-
overwrite(false)
26+
from(saveCliFile.map { it.parentFile })
27+
into(outputDir)
4428
}
4529

4630
dependencies {
4731
add("runtimeOnly",
48-
files(layout.buildDirectory.dir("$buildDir/download")).apply {
49-
builtBy(downloadSaveCliTaskProvider)
50-
}
32+
files(layout.buildDirectory.dir(
33+
copySaveCliTaskProvider.map { task ->
34+
task.outputs.files.singleFile.absolutePath
35+
}
36+
))
5137
)
5238
}
5339

54-
val generateVersionFileTaskProvider = tasks.register("generateVersionFile") {
55-
val versionsFile = File("$buildDir/generated/src/generated/Versions.kt")
40+
val generateSaveCliVersionFileTaskProvider = tasks.register("generateSaveCliVersionFile") {
41+
val saveCliVersion = readSaveCliVersion()
42+
val outputDir = File("$buildDir/generated/src")
43+
val versionFile = outputDir.resolve("generated/SaveCliVersion.kt")
5644

57-
dependsOn(rootProject.tasks.named("getSaveCliVersion"))
58-
inputs.file(pathToSaveCliVersion)
59-
outputs.file(versionsFile)
45+
inputs.property("save-cli version", saveCliVersion)
46+
outputs.dir(outputDir)
6047

6148
doFirst {
62-
val saveCliVersion = readSaveCliVersion()
63-
versionsFile.parentFile.mkdirs()
64-
versionsFile.writeText(
49+
versionFile.parentFile.mkdirs()
50+
versionFile.writeText(
6551
"""
6652
package generated
6753
68-
internal const val SAVE_CORE_VERSION = "$saveCliVersion"
54+
internal const val SAVE_CORE_VERSION = "${saveCliVersion.get()}"
6955
7056
""".trimIndent()
7157
)
7258
}
7359
}
7460

7561
kotlin.sourceSets.getByName("main") {
76-
kotlin.srcDir("$buildDir/generated/src")
77-
}
78-
79-
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().forEach {
80-
it.dependsOn(generateVersionFileTaskProvider)
62+
kotlin.srcDir(
63+
generateSaveCliVersionFileTaskProvider.map {
64+
it.outputs.files.singleFile
65+
}
66+
)
8167
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* Configuration task to download save-cli once per a project
3+
*/
4+
5+
package com.saveourtool.save.buildutils
6+
7+
import de.undercouch.gradle.tasks.download.Download
8+
import org.gradle.kotlin.dsl.*
9+
10+
plugins {
11+
id("de.undercouch.download")
12+
}
13+
14+
tasks.register<Download>("downloadSaveCli") {
15+
val saveCliVersion = readSaveCliVersion()
16+
val saveCliFileName = saveCliVersion.map { "save-$it-linuxX64.kexe" }
17+
val saveCliPath = saveCliVersion.zip(saveCliFileName) { version, fileName ->
18+
findProperty("saveCliPath")?.takeIf { version.isSnapshot() } as String?
19+
?: "https://github.com/saveourtool/save-cli/releases/download/v$version/$fileName"
20+
}
21+
src { saveCliPath }
22+
dest { saveCliFileName.map { fileName -> "$buildDir/download/$fileName" } }
23+
24+
overwrite(false)
25+
}

gradle/plugins/src/main/kotlin/com/saveourtool/save/buildutils/save-cloud-version-file-configuration.gradle.kts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ import java.io.File
88

99
tasks.register("generateSaveCloudVersionFile") {
1010
val outputDir = File("$buildDir/generated/src")
11-
val versionsFile = outputDir.resolve("generated/SaveCloudVersion.kt")
11+
val versionFile = outputDir.resolve("generated/SaveCloudVersion.kt")
1212
inputs.property("project version", version.toString())
13-
outputs.dir("$buildDir/generated/src")
13+
outputs.dir(outputDir)
1414

1515
doFirst {
16-
versionsFile.parentFile.mkdirs()
17-
versionsFile.writeText(
16+
versionFile.parentFile.mkdirs()
17+
versionFile.writeText(
1818
"""
1919
package generated
2020

save-orchestrator-common/src/test/kotlin/com/saveourtool/save/orchestrator/docker/DockerContainerManagerTest.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,9 @@ import com.saveourtool.save.orchestrator.runner.ContainerRunnerException
99
import com.saveourtool.save.orchestrator.service.OrchestratorAgentService
1010
import com.saveourtool.save.orchestrator.utils.DockerClientTestConfiguration
1111
import com.saveourtool.save.orchestrator.utils.silentlyCleanupContainer
12-
import com.saveourtool.save.orchestrator.utils.silentlyExec
1312
import com.saveourtool.save.utils.error
1413
import com.saveourtool.save.utils.getLogger
1514
import org.junit.jupiter.api.*
16-
import org.junit.jupiter.api.condition.DisabledOnOs
17-
import org.junit.jupiter.api.condition.EnabledOnOs
18-
import org.junit.jupiter.api.condition.OS
1915
import org.slf4j.Logger
2016
import org.springframework.beans.factory.annotation.Autowired
2117
import org.springframework.boot.test.context.SpringBootTest
@@ -61,7 +57,6 @@ class DockerContainerManagerTest {
6157
.first {
6258
it.repoTags?.contains("ghcr.io/saveourtool/save-base:eclipse-temurin-11") == true
6359
}
64-
dockerClient.createVolumeCmd().withName("test-volume").exec()
6560
}
6661

6762
@Test
@@ -113,7 +108,6 @@ class DockerContainerManagerTest {
113108
if (::testContainerId.isInitialized) {
114109
dockerClient.silentlyCleanupContainer(testContainerId)
115110
}
116-
dockerClient.removeVolumeCmd("test-volume").silentlyExec()
117111
}
118112

119113
companion object {

save-orchestrator-common/src/test/kotlin/com/saveourtool/save/orchestrator/service/ContainerServiceTest.kt

Lines changed: 5 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,20 @@ package com.saveourtool.save.orchestrator.service
22

33
import com.github.dockerjava.api.DockerClient
44
import com.github.dockerjava.api.async.ResultCallback
5-
import com.github.dockerjava.api.command.PullImageResultCallback
65
import com.github.dockerjava.api.model.*
76
import com.saveourtool.save.entities.Execution
87
import com.saveourtool.save.entities.Project
98
import com.saveourtool.save.execution.ExecutionStatus
10-
import com.saveourtool.save.orchestrator.createTgzStream
119
import com.saveourtool.save.orchestrator.docker.DockerContainerRunner
1210
import com.saveourtool.save.orchestrator.runner.ContainerRunnerException
1311
import com.saveourtool.save.orchestrator.utils.DockerClientTestConfiguration
12+
import com.saveourtool.save.orchestrator.utils.MockserverExtension
13+
import com.saveourtool.save.orchestrator.utils.MockserverExtension.Companion.MOCKSERVER_MOCK_URL
1414

1515
import com.saveourtool.save.orchestrator.utils.silentlyCleanupContainer
16-
import com.saveourtool.save.orchestrator.utils.silentlyExec
1716
import com.saveourtool.save.utils.error
1817
import org.junit.jupiter.api.*
19-
import org.junit.jupiter.api.condition.DisabledOnOs
20-
import org.junit.jupiter.api.condition.EnabledOnOs
21-
import org.junit.jupiter.api.condition.OS
18+
import org.junit.jupiter.api.extension.ExtendWith
2219
import org.junit.jupiter.api.io.TempDir
2320
import org.mockito.kotlin.*
2421
import org.slf4j.LoggerFactory
@@ -29,7 +26,6 @@ import org.springframework.context.annotation.Import
2926
import org.springframework.http.ResponseEntity
3027
import org.springframework.test.context.ActiveProfiles
3128
import reactor.kotlin.core.publisher.toMono
32-
import java.net.ServerSocket
3329
import java.net.URL
3430
import java.nio.file.Path
3531
import kotlin.io.path.*
@@ -44,19 +40,12 @@ import kotlin.random.Random
4440
ContainerService::class,
4541
AgentService::class,
4642
)
43+
@ExtendWith(MockserverExtension::class)
4744
class ContainerServiceTest {
4845
@Autowired private lateinit var dockerClient: DockerClient
4946
@Autowired private lateinit var containerService: ContainerService
5047
@MockBean private lateinit var orchestratorAgentService: OrchestratorAgentService
5148
private lateinit var testContainerId: String
52-
private lateinit var mockserverContainerId: String
53-
private val mockserverPort: Int = ServerSocket(0).localPort
54-
private val mockserverImageName = "mockserver/mockserver"
55-
private val mockserverImageVersion = "5.15.0"
56-
private val mockserverImageFullName = "$mockserverImageName:$mockserverImageVersion"
57-
private val mockserverVolumeName = "mockserver-config"
58-
private val mockserverConfigPath = "/config"
59-
private val mockUrl = "/some-path-do-download-save-agent"
6049

6150
init {
6251
if (System.getProperty("os.name").lowercase().contains("win")) {
@@ -68,57 +57,6 @@ class ContainerServiceTest {
6857
fun setUp(@TempDir tmpDir: Path) {
6958
whenever(orchestratorAgentService.updateExecutionStatus(any(), any(), anyOrNull()))
7059
.thenReturn(ResponseEntity.ok().build<Void>().toMono())
71-
72-
val configFile = (tmpDir / "initializerJson.json").createFile()
73-
.also {
74-
it.writeText(
75-
"""
76-
[
77-
{
78-
"httpRequest": {
79-
"path": "$mockUrl"
80-
},
81-
"httpResponse": {
82-
"body": "!#/bin/bash\n echo \"sleep\"\n sleep 5000"
83-
}
84-
}
85-
]
86-
""".trimIndent()
87-
)
88-
}
89-
dockerClient.pullImageCmd(mockserverImageName)
90-
.withTag(mockserverImageVersion)
91-
.exec(PullImageResultCallback())
92-
.awaitCompletion()
93-
dockerClient.createVolumeCmd()
94-
.withName(mockserverVolumeName)
95-
.exec()
96-
mockserverContainerId = dockerClient.createContainerCmd(mockserverImageFullName)
97-
.withHostName("mockserver")
98-
.withHostConfig(
99-
HostConfig.newHostConfig()
100-
.withBinds(Bind(mockserverVolumeName, Volume(mockserverConfigPath)))
101-
.withPortBindings(
102-
Ports(
103-
ExposedPort.tcp(1080),
104-
Ports.Binding.bindPort(mockserverPort),
105-
)
106-
)
107-
)
108-
.withExposedPorts(ExposedPort.tcp(mockserverPort))
109-
.withEnv("MOCKSERVER_INITIALIZATION_JSON_PATH=$mockserverConfigPath/${configFile.fileName}")
110-
.exec()
111-
.id
112-
.also { containerId ->
113-
createTgzStream(configFile.toFile()).use { out ->
114-
dockerClient.copyArchiveToContainerCmd(containerId)
115-
.withTarInputStream(out.toByteArray().inputStream())
116-
.withRemotePath(mockserverConfigPath)
117-
.exec()
118-
}
119-
dockerClient.startContainerCmd(containerId).exec()
120-
}
121-
12260
}
12361

12462
@Test
@@ -134,7 +72,7 @@ class ContainerServiceTest {
13472
}
13573
val configuration = containerService.prepareConfiguration(
13674
testExecution.toRunRequest(
137-
saveAgentUrl = URL("http://host.docker.internal:$mockserverPort$mockUrl"),
75+
saveAgentUrl = URL("http://host.docker.internal:${MockserverExtension.getMockserverExposedPort()}$MOCKSERVER_MOCK_URL"),
13876
)
13977
)
14078
// start container and query backend
@@ -180,11 +118,6 @@ class ContainerServiceTest {
180118
if (::testContainerId.isInitialized) {
181119
dockerClient.silentlyCleanupContainer(testContainerId)
182120
}
183-
if (::mockserverContainerId.isInitialized) {
184-
dockerClient.silentlyCleanupContainer(mockserverContainerId)
185-
}
186-
dockerClient.removeVolumeCmd(mockserverVolumeName).silentlyExec()
187-
dockerClient.removeImageCmd(mockserverImageFullName).silentlyExec()
188121
}
189122

190123
companion object {

save-orchestrator-common/src/test/kotlin/com/saveourtool/save/orchestrator/utils/DockerClientTestConfiguration.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class DockerClientTestConfiguration {
1414
/**
1515
* @return [DockerClient]
1616
*/
17-
@Bean
17+
@Bean(destroyMethod = "")
1818
@Profile("docker-test")
1919
fun dockerClient(): DockerClient = DockerClientFactory.lazyClient()
2020
}

0 commit comments

Comments
 (0)