Skip to content

Commit d76348c

Browse files
randomandersonsmola
authored andcommitted
Run tests in Gitlab (#8656)
* first pass checks * add some debug * Revert "add some debug" This reverts commit 26a7adb. * Normalize node index and node total * fix normalization * actually use the normalized values * first pass: migrate tests to Gitlab * less scenarios for now * bump memory and workers * actually use task partitions * Add section start/end * Allow individual tests to control gradle memory * remove a little of the reportspam * use concrete docker image tags * configure test containers to use mirror * fix limit * fix missing container versions * Better gitlab naming with smarter split * update caches with test dep cache, save test results * Cleanup repositories {} blocks * update proxy url to use internal routing * no "s" * allow insecure everywhere * include apache with confluence * remove intentional fail * use gradlePluginCache, mavenCentral after pluginportal * proxy mule as well * change BUILD_CACHE_TYPE to CACHE_TYPE since its used for both * split cache like with circleci. Cache became too big * Some caches are too big to be saved * test fixes * more test fixes * disable some tests for now * more fixes * Use maven proxy with openliberty smoketests * missed one more mongodb case * enable some more of the matrix * Fix lettuce tests * Fix lettuce tests * cleanup imports * create asyncCommands * codenarc * Cleanup aggregator tests to try to reduce flakiness * debug maven logs for now * try non-ssh url * Revert "debug maven logs for now" This reverts commit c5c158f. * add some debug logging * codenarc * try fixed value of parallelism * enable debug logs for smoketest building only * limit number of reserved threads * some debug for why the smoketest is not running * more debug for gradle launcher failure * try fixing graal test * try to force the logging * codenarc * set available processors for jetty * codenarc * bluntly bump max threads * some more debug * remove verbose logging * try memcached test with new location * opt out of split by parallel * Try with 3 gradle workers * try decreasing reporting interval * Refractor CrashTrackingSmokeTest to use OutputThreads * Simple forked memory test * better ergonomics * try increasing timeout * extend agent test runner * don't override forkedMinHeapSize and forkedMaxHeapSize * print out requests * remove logging statement * Better crash tracking * remove intentionally failing test * use a test UDP server to record oom events * Make crash tracking smoke test more resiliant * loop through messages until the correct event * some debug * configurable dogstatsd port * enable everything * use sleep instead of park nanos * save body data ahead of time * retry once for system failures * spotless * cleanup * spotless/merge issues * Skip ExceptionHistogramTest on J9 * add a print statement around the body for debugging * comment out all but 8, 17, and 21 for now * fix spring 6 forwarding headers * revert logging statements * needs to be set in 3.1 for latestDepTest * faster OOM * property was set in incorrect location * ssi_smoke, flaky, and esoteric jvms on master only * use normal runner when TestContainers isn't needed * skip forwarding header filter here too * tweaks * limit executor size and fix IPV4 assumptions * try more workers with less memory * set max memory for all crashtracking tests * double retry * scale up memory, less jobs * revert memory bump, increase forked tests * tweaks * add flag for nondefault jvms and flaky tests * correct description * Externalize runtime processors override * ExceptionHistogramTest exclusions already handled by master * increase spring native build memory * bump gradle build timeout * bump graalvm compile memory --------- Co-authored-by: Santiago Mola <santiago.mola@datadoghq.com>
1 parent 8cd5fa8 commit d76348c

File tree

50 files changed

+268
-104
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+268
-104
lines changed

.gitlab-ci.yml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,15 @@ default:
9494
- export NORMALIZED_NODE_TOTAL=${CI_NODE_TOTAL:-1}
9595
- ONE_INDEXED_NODE_INDEX=${CI_NODE_INDEX:-1}; export NORMALIZED_NODE_INDEX=$((ONE_INDEXED_NODE_INDEX - 1))
9696
- echo "NORMALIZED_NODE_TOTAL=${NORMALIZED_NODE_TOTAL}, NORMALIZED_NODE_INDEX=$NORMALIZED_NODE_INDEX"
97+
<<<<<<< HEAD
9798

9899
.cgroup_info: &cgroup_info
99100
- source .gitlab/gitlab-utils.sh
100101
- gitlab_section_start "cgroup-info" "cgroup info"
101102
- .gitlab/cgroup-info.sh
102103
- gitlab_section_end "cgroup-info"
104+
=======
105+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
103106

104107
.gradle_build: &gradle_build
105108
image: ghcr.io/datadog/dd-trace-java-docker-build:${BUILDER_IMAGE_VERSION_PREFIX}base
@@ -146,8 +149,11 @@ default:
146149
- mv .gradle-copy .gradle
147150
- ls -la
148151
- gitlab_section_end "gradle-dance"
152+
<<<<<<< HEAD
149153
after_script:
150154
- *cgroup_info
155+
=======
156+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
151157

152158
build:
153159
extends: .gradle_build
@@ -224,6 +230,7 @@ populate_dep_cache:
224230
# CACHE_TYPE: "latestdep"
225231
# - GRADLE_TARGET: ":smokeTest"
226232
# CACHE_TYPE: "smoke"
233+
<<<<<<< HEAD
227234

228235
publish-artifacts-to-s3:
229236
image: registry.ddbuild.io/images/mirror/amazon/aws-cli:2.4.29
@@ -256,6 +263,8 @@ publish-artifacts-to-s3:
256263
annotations:
257264
- links.json
258265

266+
=======
267+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
259268

260269
spotless:
261270
extends: .gradle_build
@@ -283,7 +292,10 @@ test_published_artifacts:
283292
- export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xmx1G -Xms1G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'"
284293
- ./gradlew check --info $GRADLE_ARGS
285294
after_script:
295+
<<<<<<< HEAD
286296
- *cgroup_info
297+
=======
298+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
287299
- source .gitlab/gitlab-utils.sh
288300
- gitlab_section_start "collect-reports" "Collecting reports"
289301
- .circleci/collect_reports.sh
@@ -302,7 +314,10 @@ test_published_artifacts:
302314
script:
303315
- ./gradlew $GRADLE_TARGET -PskipTests -PrunBuildSrcTests -PskipSpotless -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS
304316
after_script:
317+
<<<<<<< HEAD
305318
- *cgroup_info
319+
=======
320+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
306321
- source .gitlab/gitlab-utils.sh
307322
- gitlab_section_start "collect-reports" "Collecting reports"
308323
- .circleci/collect_reports.sh --destination ./check_reports --move
@@ -363,7 +378,10 @@ muzzle:
363378
- split --number=l/$NORMALIZED_NODE_TOTAL --suffix-length=1 --numeric-suffixes sortedMuzzleTasks muzzleSplit
364379
- ./gradlew `cat muzzleSplit${NORMALIZED_NODE_INDEX} | xargs` $GRADLE_ARGS
365380
after_script:
381+
<<<<<<< HEAD
366382
- *cgroup_info
383+
=======
384+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
367385
- source .gitlab/gitlab-utils.sh
368386
- gitlab_section_start "collect-reports" "Collecting reports"
369387
- .circleci/collect_reports.sh
@@ -409,13 +427,22 @@ muzzle-dep-report:
409427

410428
.test_job:
411429
extends: .gradle_build
430+
<<<<<<< HEAD
412431
image: ghcr.io/datadog/dd-trace-java-docker-build:${BUILDER_IMAGE_VERSION_PREFIX}$testJvm
432+
=======
433+
image: ghcr.io/datadog/dd-trace-java-docker-build:$testJvm
434+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
413435
tags: [ "docker-in-docker:amd64" ] # use docker-in-docker runner for testcontainers
414436
needs: [ build_tests ]
415437
stage: tests
416438
variables:
439+
<<<<<<< HEAD
417440
KUBERNETES_MEMORY_REQUEST: 17Gi
418441
KUBERNETES_MEMORY_LIMIT: 17Gi
442+
=======
443+
KUBERNETES_MEMORY_REQUEST: 16Gi
444+
KUBERNETES_MEMORY_LIMIT: 16Gi
445+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
419446
KUBERNETES_CPU_REQUEST: 10
420447
GRADLE_WORKERS: 4
421448
GRADLE_MEM: 3G
@@ -439,21 +466,33 @@ muzzle-dep-report:
439466
export PROFILER_COMMAND="-XX:StartFlightRecording=settings=profile,filename=/tmp/${CI_JOB_NAME_SLUG}.jfr,dumponexit=true";
440467
fi
441468
- *prepare_test_env
469+
<<<<<<< HEAD
442470
- export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms$GRADLE_MEM -Xmx$GRADLE_MEM $PROFILER_COMMAND -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp' -Ddatadog.forkedMaxHeapSize=1024M -Ddatadog.forkedMinHeapSize=128M"
471+
=======
472+
- export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms$GRADLE_MEM -Xmx$GRADLE_MEM $PROFILER_COMMAND -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp' -Ddatadog.forkedMaxHeapSize=768M -Ddatadog.forkedMinHeapSize=128M"
473+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
443474
- ./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PtestJvm=$testJvm -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS --continue || $CONTINUE_ON_FAILURE
444475
after_script:
445476
- *restore_pretest_env
446477
- *set_datadog_api_keys
478+
<<<<<<< HEAD
447479
- *cgroup_info
480+
=======
481+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
448482
- source .gitlab/gitlab-utils.sh
449483
- gitlab_section_start "collect-reports" "Collecting reports"
450484
- .circleci/collect_reports.sh
451485
- if [ "$PROFILE_TESTS" == "true" ]; then .circleci/collect_profiles.sh; fi
452486
- .circleci/collect_results.sh
487+
<<<<<<< HEAD
453488
- .circleci/upload_ciapp.sh $CACHE_TYPE $testJvm
454489
- gitlab_section_end "collect-reports"
455490
- URL_ENCODED_JOB_NAME=$(jq -rn --arg x "$CI_JOB_NAME" '$x|@uri')
456491
- echo -e "${TEXT_BOLD}${TEXT_YELLOW}See test results in Datadog:${TEXT_CLEAR} https://app.datadoghq.com/ci/test/runs?query=test_level%3Atest%20%40test.service%3Add-trace-java%20%40ci.pipeline.id%3A${CI_PIPELINE_ID}%20%40ci.job.name%3A%22${URL_ENCODED_JOB_NAME}%22"
492+
=======
493+
- .circleci/upload_ciapp.sh tests $testJvm
494+
- gitlab_section_end "collect-reports"
495+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
457496
artifacts:
458497
when: always
459498
paths:
@@ -597,7 +636,11 @@ test_smoke:
597636
GRADLE_PARAMS: "-PskipFlakyTests"
598637
CACHE_TYPE: "smoke"
599638
parallel:
639+
<<<<<<< HEAD
600640
matrix: *test_matrix_4
641+
=======
642+
matrix: *test_matrix_2
643+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
601644

602645
test_ssi_smoke:
603646
extends: .test_job
@@ -608,7 +651,11 @@ test_ssi_smoke:
608651
DD_INJECT_FORCE: "true"
609652
DD_INJECTION_ENABLED: "tracer"
610653
parallel:
654+
<<<<<<< HEAD
611655
matrix: *test_matrix_4
656+
=======
657+
matrix: *test_matrix_2
658+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
612659

613660
test_smoke_graalvm:
614661
extends: .test_job
@@ -630,6 +677,31 @@ test_smoke_semeru8_debugger:
630677
CACHE_TYPE: "smoke"
631678
NON_DEFAULT_JVMS: "true"
632679
testJvm: "semeru8"
680+
<<<<<<< HEAD
681+
=======
682+
683+
required:
684+
extends: .fan_in
685+
needs:
686+
- job: spotless
687+
optional: true
688+
- job: muzzle
689+
optional: true
690+
- job: test_published_artifacts
691+
optional: true
692+
- job: agent_integration_tests
693+
optional: true
694+
- job: check_base
695+
optional: true
696+
- job: check_inst
697+
optional: true
698+
- job: check_smoke
699+
optional: true
700+
- job: check_profiling
701+
optional: true
702+
- job: check_debugger
703+
optional: true
704+
>>>>>>> f494c33b01 (Run tests in Gitlab (#8656))
633705

634706
deploy_to_profiling_backend:
635707
stage: publish

.gitlab/gitlab-utils.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ export TEXT_BLUE="\e[34m"
2424
export TEXT_MAGENTA="\e[35m"
2525
export TEXT_CYAN="\e[36m"
2626
export TEXT_CLEAR="\e[0m"
27-
export TEXT_BOLD="\e[1m"
27+
export TEXT_BOLD="\e[1m"

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/ShellCommandExecutor.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,11 @@ private <T> T executeCommand(
161161
throw new TimeoutException(
162162
"Timeout while waiting for '"
163163
+ String.join(" ", command)
164-
+ "'; "
164+
+ "'; in "
165+
+ executionFolder
166+
+ "\n StdOut: \n"
167+
+ IOUtils.readFully(inputStreamConsumer.read(), Charset.defaultCharset())
168+
+ "\n StdErr: \n "
165169
+ IOUtils.readFully(errorStreamConsumer.read(), Charset.defaultCharset()));
166170
}
167171
} catch (InterruptedException e) {

dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/shallow/git/config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
ignorecase = true
77
precomposeunicode = true
88
[remote "origin"]
9-
url = git@github.com:Netflix/zuul.git
9+
url = https://github.com/Netflix/zuul.git
1010
fetch = +refs/heads/master:refs/remotes/origin/master
1111
[branch "master"]
1212
remote = origin

dd-java-agent/instrumentation/aws-java-dynamodb-2.0/src/test/groovy/DynamoDbClientTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import spock.lang.Shared
2929
import java.time.Duration
3030

3131
class DynamoDbClientTest extends AgentTestRunner {
32-
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack"))
32+
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack:4.2.0"))
3333
.withExposedPorts(4566)
3434
.withEnv("SERVICES", "dynamodb")
3535
.withReuse(true)

dd-java-agent/instrumentation/aws-java-eventbridge-2.0/src/test/groovy/EventBridgeClientTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import java.time.Duration
2121
import java.util.concurrent.CompletableFuture
2222

2323
class EventBridgeClientTest extends AgentTestRunner {
24-
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack"))
24+
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack:4.2.0"))
2525
.withExposedPorts(4566)
2626
.withEnv("SERVICES", "sns,sqs,events")
2727
.withReuse(true)

dd-java-agent/instrumentation/aws-java-s3-2.0/src/test/groovy/S3ClientTest.groovy

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import spock.lang.Shared
1818
import java.time.Duration
1919

2020
class S3ClientTest extends AgentTestRunner {
21-
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack"))
21+
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack:4.2.0"))
2222
.withExposedPorts(4566)
2323
.withEnv("SERVICES", "s3")
2424
.withReuse(true)
@@ -92,8 +92,8 @@ class S3ClientTest extends AgentTestRunner {
9292
tag "bucketname", bucketName
9393
tag "http.method", "PUT"
9494
tag "http.status_code", 200
95-
tag "http.url", { it.startsWith("http://localhost") && it.contains("/$key") }
96-
tag "peer.hostname", "localhost"
95+
tag "http.url", { it.startsWith("http://" + LOCALSTACK.getHost()) && it.contains("/$key") }
96+
tag "peer.hostname", LOCALSTACK.getHost()
9797
tag "peer.port", { it instanceof Integer }
9898
tag "span.kind", "client"
9999
tag "aws.requestId", { it != null }
@@ -151,8 +151,8 @@ class S3ClientTest extends AgentTestRunner {
151151
tag "bucketname", bucketName
152152
tag "http.method", "PUT"
153153
tag "http.status_code", 200
154-
tag "http.url", { it.startsWith("http://localhost") && it.contains("/$sourceKey") }
155-
tag "peer.hostname", "localhost"
154+
tag "http.url", { it.startsWith("http://" + LOCALSTACK.getHost()) && it.contains("/$sourceKey") }
155+
tag "peer.hostname", LOCALSTACK.getHost()
156156
tag "peer.port", { it instanceof Integer }
157157
tag "span.kind", "client"
158158
tag "aws.requestId", { it != null }
@@ -185,8 +185,8 @@ class S3ClientTest extends AgentTestRunner {
185185
tag "bucketname", bucketName
186186
tag "http.method", "PUT"
187187
tag "http.status_code", 200
188-
tag "http.url", { it.startsWith("http://localhost") && it.contains("/$destKey") }
189-
tag "peer.hostname", "localhost"
188+
tag "http.url", { it.startsWith("http://" + LOCALSTACK.getHost()) && it.contains("/$destKey") }
189+
tag "peer.hostname", LOCALSTACK.getHost()
190190
tag "peer.port", { it instanceof Integer }
191191
tag "span.kind", "client"
192192
tag "aws.requestId", { it != null }
@@ -276,8 +276,8 @@ class S3ClientTest extends AgentTestRunner {
276276
tag "bucketname", bucketName
277277
tag "http.method", "POST"
278278
tag "http.status_code", 200
279-
tag "http.url", { it.startsWith("http://localhost") && it.contains("/$key") }
280-
tag "peer.hostname", "localhost"
279+
tag "http.url", { it.startsWith("http://" + LOCALSTACK.getHost()) && it.contains("/$key") }
280+
tag "peer.hostname", LOCALSTACK.getHost()
281281
tag "peer.port", { it instanceof Integer }
282282
tag "span.kind", "client"
283283
tag "aws.requestId", { it != null }
@@ -303,8 +303,8 @@ class S3ClientTest extends AgentTestRunner {
303303
tag "bucketname", bucketName
304304
tag "http.method", "PUT"
305305
tag "http.status_code", 200
306-
tag "http.url", { it.startsWith("http://localhost") && it.contains("/$key") }
307-
tag "peer.hostname", "localhost"
306+
tag "http.url", { it.startsWith("http://" + LOCALSTACK.getHost()) && it.contains("/$key") }
307+
tag "peer.hostname", LOCALSTACK.getHost()
308308
tag "peer.port", { it instanceof Integer }
309309
tag "span.kind", "client"
310310
tag "aws.requestId", { it != null }
@@ -330,8 +330,8 @@ class S3ClientTest extends AgentTestRunner {
330330
tag "bucketname", bucketName
331331
tag "http.method", "PUT"
332332
tag "http.status_code", 200
333-
tag "http.url", { it.startsWith("http://localhost") && it.contains("/$key") }
334-
tag "peer.hostname", "localhost"
333+
tag "http.url", { it.startsWith("http://" + LOCALSTACK.getHost()) && it.contains("/$key") }
334+
tag "peer.hostname", LOCALSTACK.getHost()
335335
tag "peer.port", { it instanceof Integer }
336336
tag "span.kind", "client"
337337
tag "aws.requestId", { it != null }
@@ -365,8 +365,8 @@ class S3ClientTest extends AgentTestRunner {
365365
tag "bucketname", bucketName
366366
tag "http.method", "POST"
367367
tag "http.status_code", 200
368-
tag "http.url", { it.startsWith("http://localhost") && it.contains("/$key") }
369-
tag "peer.hostname", "localhost"
368+
tag "http.url", { it.startsWith("http://" + LOCALSTACK.getHost()) && it.contains("/$key") }
369+
tag "peer.hostname", LOCALSTACK.getHost()
370370
tag "peer.port", { it instanceof Integer }
371371
tag "span.kind", "client"
372372
tag "aws.requestId", { it != null }

dd-java-agent/instrumentation/aws-java-sdk-2.2/src/payloadTaggingTest/groovy/PayloadTaggingTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ abstract class AbstractPayloadTaggingTest extends AgentTestRunner {
2626
static final Object NA = {}
2727

2828
static final int DEFAULT_PORT = 4566
29-
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack"))
29+
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack:4.2.0"))
3030
.withExposedPorts(DEFAULT_PORT)
3131
.withEnv("SERVICES", "apigateway,events,s3,sns,sqs,kinesis")
3232
.withReuse(true)

dd-java-agent/instrumentation/aws-java-sfn-2.0/src/test/groovy/SfnClientTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ abstract class SfnClientTest extends VersionedNamingTestBase {
2525
@Shared Object endPoint
2626

2727
def setupSpec() {
28-
localStack = new GenericContainer(DockerImageName.parse("localstack/localstack"))
28+
localStack = new GenericContainer(DockerImageName.parse("localstack/localstack:4.2.0"))
2929
.withExposedPorts(4566)
3030
.withEnv("SERVICES", "stepfunctions")
3131
.withReuse(true)

dd-java-agent/instrumentation/aws-java-sns-1.0/src/test/groovy/SnsClientTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import java.time.Duration
2727

2828
abstract class SnsClientTest extends VersionedNamingTestBase {
2929

30-
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack"))
30+
static final LOCALSTACK = new GenericContainer(DockerImageName.parse("localstack/localstack:4.2.0"))
3131
.withExposedPorts(4566) // Default LocalStack port
3232
.withEnv("SERVICES", "sns,sqs") // Enable SNS and SQS service
3333
.withReuse(true)

0 commit comments

Comments
 (0)