Skip to content

Commit 4a12513

Browse files
authored
spike: Run the guide tests in groups under a forked executor (#1428)
* Run the guide tests in a forked executor We seem to have issues with guides hanging, or memory exhaustion. This PR runs each guide in a forked process to hopefully isolate the tests and improve this situation * Move aws env vars from runner to metadata * Env vars required for xray test * Set max heap for forked jvm * Log all current docker containers to see if they're using up memory * Fix script * Up to gradle 8.5, limit workers to 1 and add Xmx setting * Split guide tests into 4 groups * Fix groups * Env for dynamo * Fetch the number of groups from the build * Fix matrix * Fix again * Fix again * And fix again * Try adding cache * Test with 5 groups * Remove docker debug, move group count out of buildSrc
1 parent 0b031a5 commit 4a12513

File tree

25 files changed

+95
-13
lines changed

25 files changed

+95
-13
lines changed

.github/workflows/gradle.yml

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,61 @@ on:
99
- master
1010
- '[1-9]+.[0-9]+.x'
1111
jobs:
12+
test_matrix:
13+
name: Generate Guide Test Matrix
14+
runs-on: ubuntu-latest
15+
outputs:
16+
matrix: ${{ steps.test_matrix_step.outputs.matrix }}
17+
steps:
18+
- uses: actions/checkout@v4
19+
- name: Set up JDK
20+
uses: actions/setup-java@v4
21+
with:
22+
distribution: 'adopt'
23+
java-version: '17'
24+
- uses: actions/cache@v3
25+
with:
26+
path: ~/.gradle/caches
27+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
28+
restore-keys: |
29+
${{ runner.os }}-gradle-
30+
- name: Generate Guide Test Matrix
31+
id: test_matrix_step
32+
run: |
33+
echo "Searching for groups..."
34+
gradleTasks=$(./gradlew tasks | grep "Run group of guide tests" | sed 's/\(.*\) - Run group of guide tests/\"\1\"/' | tr '\n' ',' | sed 's/.$//')
35+
tasksEntry="\"group_test_tasks\":[$(echo $gradleTasks)]"
36+
matrixValue="{$(echo $tasksEntry)}"
37+
echo "Created matrix: $matrixValue"
38+
echo "matrix=$matrixValue" >> $GITHUB_OUTPUT
1239
alltests:
40+
name: Running ${{ matrix.group }} with Java ${{ matrix.java }}
41+
needs: test_matrix
1342
runs-on: ubuntu-latest
1443
strategy:
1544
matrix:
1645
java: ["17", "21"]
46+
group: ${{ fromJson(needs.test_matrix.outputs.matrix).group_test_tasks }}
1747
env:
1848
JDK_VERSION: ${{ matrix.java }}
1949
steps:
20-
- uses: actions/checkout@v2
50+
- uses: actions/checkout@v4
2151
with:
2252
fetch-depth: 0
23-
- uses: actions/cache@v2
53+
- uses: actions/cache@v3
2454
with:
2555
path: ~/.gradle/caches
2656
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
2757
restore-keys: |
2858
${{ runner.os }}-gradle-
2959
- name: Set up JDK
30-
uses: actions/setup-java@v1
60+
uses: actions/setup-java@v4
3161
with:
62+
distribution: 'adopt'
3263
java-version: ${{ matrix.java }}
3364
- name: Run All Guide Tests
34-
run: './gradlew runAllGuideTests'
65+
run: './gradlew ${{ matrix.group }}'
3566
env:
36-
AWS_ACCESS_KEY_ID: XXX
37-
AWS_SECRET_ACCESS_KEY: YYY
38-
AWS_REGION: us-east-1
3967
GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
4068
GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }}
4169
GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }}

buildSrc/src/main/groovy/io/micronaut/guides/GuideMetadata.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class GuideMetadata {
3636

3737
List<String> zipIncludes
3838

39+
Map<String, String> env
40+
3941
List<App> apps
4042

4143
List<String> getTags() {

buildSrc/src/main/groovy/io/micronaut/guides/GuideProjectGenerator.groovy

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.micronaut.guides
22

3-
import groovy.io.FileType
43
import groovy.json.JsonSlurper
54
import groovy.transform.CompileDynamic
65
import groovy.transform.CompileStatic
@@ -115,6 +114,7 @@ class GuideProjectGenerator implements AutoCloseable {
115114
minimumJavaVersion: config.minimumJavaVersion,
116115
maximumJavaVersion: config.maximumJavaVersion,
117116
zipIncludes: config.zipIncludes ?: [],
117+
env: config.env ?: [:],
118118
apps: config.apps.collect { it ->
119119
new App(
120120
validateLicense: it.validateLicense == null ? true : it.validateLicense,
@@ -128,7 +128,8 @@ class GuideProjectGenerator implements AutoCloseable {
128128
groovyFeatures: it.groovyFeatures ?: [],
129129
applicationType: it.applicationType ? ApplicationType.valueOf(it.applicationType.toUpperCase()) : ApplicationType.DEFAULT,
130130
excludeSource: it.excludeSource,
131-
excludeTest: it.excludeTest)
131+
excludeTest: it.excludeTest,
132+
)
132133
}
133134
))
134135
}
@@ -405,6 +406,7 @@ class GuideProjectGenerator implements AutoCloseable {
405406
merged.minimumJavaVersion = metadata.minimumJavaVersion ?: base.minimumJavaVersion
406407
merged.maximumJavaVersion = metadata.maximumJavaVersion ?: base.maximumJavaVersion
407408
merged.zipIncludes = metadata.zipIncludes // TODO support merging from base
409+
merged.env = metadata.env ?: base.env
408410
merged.apps = mergeApps(base, metadata)
409411

410412
merged

buildSrc/src/main/groovy/io/micronaut/guides/GuidesPlugin.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.gradle.api.tasks.Copy
2121
import org.gradle.api.tasks.TaskProvider
2222
import org.gradle.api.tasks.bundling.Zip
2323

24+
import java.math.RoundingMode
2425
import java.nio.file.Files
2526
import java.nio.file.Paths
2627
import java.util.function.Predicate
@@ -51,6 +52,11 @@ class GuidesPlugin implements Plugin<Project> {
5152
GuideProjectGenerator projectGenerator = new GuideProjectGenerator()
5253
Directory guidesDir = project.layout.projectDirectory.dir("guides")
5354
Provider<Directory> codeDir = project.layout.buildDirectory.dir("code")
55+
Properties testProps = guidesDir.file("tests.properties").asFile.withInputStream { inputStream ->
56+
new Properties().tap {
57+
load(inputStream)
58+
}
59+
} as Properties
5460
List<GuideMetadata> metadatas = GuideProjectGenerator.parseGuidesMetadata(
5561
guidesDir.asFile,
5662
project.extensions.extraProperties.get("metadataConfigName").toString())
@@ -101,6 +107,17 @@ class GuidesPlugin implements Plugin<Project> {
101107
it.description = 'Generates guide applications at build/code'
102108
}
103109

110+
int groupSize = (sampleTasks.size() / Integer.parseInt(testProps.get("numberOfTestGroups") as String))
111+
.setScale(0, RoundingMode.UP).toInteger()
112+
113+
sampleTasks.collate(groupSize, true).eachWithIndex { List<Map<String, TaskProvider<Task>>> tasks, int i ->
114+
project.tasks.register("testsGroup${i + 1}") { Task it ->
115+
it.group = 'guides'
116+
it.description = "Run group of guide tests"
117+
it.dependsOn(tasks.collect { it[TEST_RUNNER] })
118+
}
119+
}
120+
104121
project.tasks.register("runAllGuideTests") { Task it ->
105122
it.group = 'guides'
106123
it.description = 'Runs all Guide test scripts'
@@ -246,6 +263,8 @@ class GuidesPlugin implements Plugin<Project> {
246263
it.group = "guides $metadata.slug"
247264
it.description = "Run the tests for all projects generated by $metadata.slug"
248265

266+
it.environment.set(metadata.env)
267+
249268
it.testScript.set(testScriptTask.flatMap { t -> t.scriptFile })
250269
it.guideSourceDirectory.set(project.layout.projectDirectory.dir("guides/${metadata.slug}"))
251270

buildSrc/src/main/groovy/io/micronaut/guides/tasks/TestScriptRunnerTask.groovy

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import groovy.transform.CompileStatic
44
import org.gradle.api.DefaultTask
55
import org.gradle.api.file.DirectoryProperty
66
import org.gradle.api.file.RegularFileProperty
7+
import org.gradle.api.provider.MapProperty
78
import org.gradle.api.tasks.CacheableTask
9+
import org.gradle.api.tasks.Input
810
import org.gradle.api.tasks.InputDirectory
911
import org.gradle.api.tasks.InputFile
1012
import org.gradle.api.tasks.OutputFile
@@ -29,6 +31,9 @@ abstract class TestScriptRunnerTask extends DefaultTask {
2931
@PathSensitive(RELATIVE)
3032
abstract DirectoryProperty getGuideSourceDirectory()
3133

34+
@Input
35+
abstract MapProperty<String, String> getEnvironment()
36+
3237
@OutputFile
3338
abstract RegularFileProperty getOutputFile()
3439

@@ -37,7 +42,15 @@ abstract class TestScriptRunnerTask extends DefaultTask {
3742

3843
@TaskAction
3944
void runScript() {
40-
WorkQueue queue = workerExecutor.noIsolation()
45+
Map<String, String> buildEnvironment = environment.get() + [ JAVA_HOME: System.getProperty("java.home") ]
46+
logger.lifecycle("Running test script ${testScript.get()} with environment $buildEnvironment")
47+
48+
WorkQueue queue = workerExecutor.processIsolation(workerSpec -> {
49+
workerSpec.forkOptions(options -> {
50+
options.environment(buildEnvironment)
51+
options.maxHeapSize = "5G"
52+
});
53+
})
4154

4255
queue.submit(TestScriptRunnerWorkAction) { parameters ->
4356
parameters.testScript.set(testScript)

gradle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ org.gradle.parallel=true
22
org.gradle.caching=true
33

44
# Limit the max workers to prevent resource exhaustion
5-
org.gradle.workers.max=2
5+
org.gradle.workers.max=1
6+
org.gradle.jvmargs=-Xmx4G

gradle/wrapper/gradle-wrapper.jar

-19.8 KB
Binary file not shown.

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

guides/micronaut-aws-lambda-eventbridge-event/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"languages": ["java"],
99
"testFramework": "junit",
1010
"maximumJavaVersion": 17,
11+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
1112
"apps": [
1213
{
1314
"applicationType": "function",

guides/micronaut-aws-lambda-s3-event/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"languages": ["java"],
99
"testFramework": "junit",
1010
"maximumJavaVersion": 17,
11+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
1112
"apps": [
1213
{
1314
"applicationType": "function",

guides/micronaut-aws-parameter-store/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"categories": ["AWS", "Distributed Configuration"],
77
"publicationDate": "2018-10-03",
88
"languages": ["java"],
9+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
910
"apps": [
1011
{
1112
"name": "default",

guides/micronaut-aws-secretsmanager-rotation/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"publicationDate": "2021-08-10",
88
"languages": ["java"],
99
"maximumJavaVersion": 17,
10+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
1011
"apps": [
1112
{
1213
"applicationType": "function",

guides/micronaut-aws-secretsmanager/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"tags": ["aws", "secrets"],
66
"categories": ["AWS", "Secrets Manager"],
77
"publicationDate": "2019-05-15",
8+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
89
"apps": [
910
{
1011
"name": "default",

guides/micronaut-cloud-database-aws/metadata.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
"authors": ["Álvaro Sánchez-Mariscal"],
66
"tags": ["aws"],
77
"categories": ["AWS"],
8-
"publicationDate": "2022-03-14"
8+
"publicationDate": "2022-03-14",
9+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" }
910
}

guides/micronaut-dynamodb/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"categories": ["Data Access"],
66
"publicationDate": "2022-07-05",
77
"languages": ["java"],
8+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
89
"apps": [
910
{
1011
"name": "default",

guides/micronaut-email-amazon-ses/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"categories": ["Email"],
77
"base": "micronaut-email",
88
"publicationDate": "2022-02-05",
9+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
910
"apps": [
1011
{
1112
"name": "default",

guides/micronaut-metrics-aws/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"tags": ["aws", "metrics"],
77
"categories": ["Metrics", "AWS"],
88
"publicationDate": "2022-10-10",
9+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
910
"apps": [{
1011
"name": "default",
1112
"features": ["micrometer-cloudwatch"]

guides/micronaut-microservices-distributed-tracing-xray/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"categories": ["Distributed Tracing"],
77
"publicationDate": "2022-08-04",
88
"languages": ["java"],
9+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
910
"apps": [
1011
{
1112
"name": "bookcatalogue",

guides/micronaut-object-storage-aws/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"categories": ["AWS", "Object Storage"],
88
"publicationDate": "2022-09-20",
99
"languages": ["java"],
10+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
1011
"apps": [
1112
{
1213
"name": "default",

guides/mn-application-aws-lambda-graalvm/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"tags": ["lambda", "aws"],
77
"categories": ["AWS Lambda", "GraalVM"],
88
"publicationDate": "2020-08-29",
9+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
910
"apps": [
1011
{
1112
"name": "default",

guides/mn-application-aws-lambda-java-runtime/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"categories": ["AWS Lambda"],
77
"publicationDate": "2020-08-29",
88
"maximumJavaVersion": 17,
9+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
910
"apps": [
1011
{
1112
"name": "default",

guides/mn-serverless-function-aws-lambda-function-url/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"categories": ["AWS Lambda"],
77
"publicationDate": "2023-10-16",
88
"maximumJavaVersion": 17,
9+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
910
"apps": [
1011
{
1112
"applicationType": "function",

guides/mn-serverless-function-aws-lambda-graalvm/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"languages": ["java", "kotlin"],
88
"publicationDate": "2020-08-29",
99
"maximumJavaVersion": 17,
10+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
1011
"apps": [
1112
{
1213
"applicationType": "function",

guides/mn-serverless-function-aws-lambda/metadata.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"categories": ["AWS Lambda"],
77
"publicationDate": "2020-08-29",
88
"maximumJavaVersion": 17,
9+
"env": { "AWS_ACCESS_KEY_ID": "XXX", "AWS_SECRET_ACCESS_KEY": "YYY", "AWS_REGION": "us-east-1" },
910
"apps": [
1011
{
1112
"applicationType": "function",

guides/tests.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
numberOfTestGroups=4

0 commit comments

Comments
 (0)