Skip to content

Commit 33b224e

Browse files
authored
Merge branch 'master' into sarahchen6/update-dd-octo-sts
2 parents 6452fc4 + 054a9d5 commit 33b224e

2,234 files changed

Lines changed: 22003 additions & 5857 deletions

File tree

Some content is hidden

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

.github/CODEOWNERS

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,20 @@
1212
/.gitlab/ @DataDog/apm-release-platform
1313
/.gitlab-ci.yml @DataDog/apm-release-platform
1414

15-
# @DataDog/apm-sdk-api-java
16-
/dd-java-agent/agent-otel @DataDog/apm-sdk-api-java
17-
/dd-smoke-tests/sample-trace @DataDog/apm-sdk-api-java
18-
/dd-trace-core/src/main/java/datadog/trace/core/baggage @DataDog/apm-sdk-api-java
19-
/dd-trace-core/src/test/groovy/datadog/trace/core/baggage @DataDog/apm-sdk-api-java
20-
/dd-trace-core/src/main/java/datadog/trace/core/propagation @DataDog/apm-sdk-api-java
21-
/dd-trace-core/src/test/groovy/datadog/trace/core/propagation @DataDog/apm-sdk-api-java
22-
/dd-trace-core/src/main/java/datadog/trace/core/scopemanager @DataDog/apm-sdk-api-java
23-
/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager @DataDog/apm-sdk-api-java
24-
/dd-trace-ot/ @DataDog/apm-sdk-api-java
25-
/internal-api/src/main/java/datadog/trace/bootstrap @DataDog/apm-sdk-api-java
26-
/internal-api/src/test/groovy/datadog/trace/bootstrap @DataDog/apm-sdk-api-java
27-
/internal-api/src/main/java/datadog/trace/api/sampling @DataDog/apm-sdk-api-java
28-
/internal-api/src/test/groovy/datadog/trace/api/sampling @DataDog/apm-sdk-api-java
15+
# @DataDog/apm-sdk-capabilities-java
16+
/dd-java-agent/agent-otel @DataDog/apm-sdk-capabilities-java
17+
/dd-smoke-tests/sample-trace @DataDog/apm-sdk-capabilities-java
18+
/dd-trace-core/src/main/java/datadog/trace/core/baggage @DataDog/apm-sdk-capabilities-java
19+
/dd-trace-core/src/test/groovy/datadog/trace/core/baggage @DataDog/apm-sdk-capabilities-java
20+
/dd-trace-core/src/main/java/datadog/trace/core/propagation @DataDog/apm-sdk-capabilities-java
21+
/dd-trace-core/src/test/groovy/datadog/trace/core/propagation @DataDog/apm-sdk-capabilities-java
22+
/dd-trace-core/src/main/java/datadog/trace/core/scopemanager @DataDog/apm-sdk-capabilities-java
23+
/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager @DataDog/apm-sdk-capabilities-java
24+
/dd-trace-ot/ @DataDog/apm-sdk-capabilities-java
25+
/internal-api/src/main/java/datadog/trace/bootstrap @DataDog/apm-sdk-capabilities-java
26+
/internal-api/src/test/groovy/datadog/trace/bootstrap @DataDog/apm-sdk-capabilities-java
27+
/internal-api/src/main/java/datadog/trace/api/sampling @DataDog/apm-sdk-capabilities-java
28+
/internal-api/src/test/groovy/datadog/trace/api/sampling @DataDog/apm-sdk-capabilities-java
2929

3030
# @DataDog/apm-serverless
3131
/dd-trace-core/src/main/java/datadog/trace/lambda/ @DataDog/apm-serverless
@@ -46,6 +46,7 @@
4646

4747
# @DataDog/asm-java (AppSec/IAST)
4848
/buildSrc/call-site-instrumentation-plugin/ @DataDog/asm-java
49+
/dd-java-agent/agent-aiguard/ @DataDog/asm-java
4950
/dd-java-agent/agent-iast/ @DataDog/asm-java
5051
/dd-java-agent/appsec/appsec-test-fixtures/ @DataDog/asm-java
5152
/dd-java-agent/instrumentation/*iast* @DataDog/asm-java
@@ -58,6 +59,7 @@
5859
/dd-smoke-tests/spring-security/ @DataDog/asm-java
5960
/dd-java-agent/instrumentation/commons-fileupload/ @DataDog/asm-java
6061
/dd-java-agent/instrumentation/spring/spring-security/ @DataDog/asm-java
62+
/dd-trace-api/src/main/java/datadog/trace/api/aiguard/ @DataDog/asm-java
6163
/dd-trace-api/src/main/java/datadog/trace/api/EventTracker.java @DataDog/asm-java
6264
/internal-api/src/main/java/datadog/trace/api/gateway/ @DataDog/asm-java
6365
**/appsec/ @DataDog/asm-java
@@ -77,16 +79,14 @@
7779
/dd-java-agent/agent-ci-visibility/ @DataDog/ci-app-libraries-java
7880
/dd-java-agent/instrumentation/cucumber/ @DataDog/ci-app-libraries-java
7981
/dd-java-agent/instrumentation/jacoco/ @DataDog/ci-app-libraries-java
80-
/dd-java-agent/instrumentation/junit-4.10/ @DataDog/ci-app-libraries-java
81-
/dd-java-agent/instrumentation/junit-5.3/ @DataDog/ci-app-libraries-java
82+
/dd-java-agent/instrumentation/junit @DataDog/ci-app-libraries-java
8283
/dd-java-agent/instrumentation/karate/ @DataDog/ci-app-libraries-java
8384
/dd-java-agent/instrumentation/scalatest/ @DataDog/ci-app-libraries-java
8485
/dd-java-agent/instrumentation/selenium/ @DataDog/ci-app-libraries-java
8586
/dd-java-agent/instrumentation/testng/ @DataDog/ci-app-libraries-java
86-
/dd-java-agent/instrumentation/gradle-3.0/ @DataDog/ci-app-libraries-java
87-
/dd-java-agent/instrumentation/gradle-8.3/ @DataDog/ci-app-libraries-java
87+
/dd-java-agent/instrumentation/gradle/ @DataDog/ci-app-libraries-java
8888
/dd-java-agent/instrumentation/gradle-testing/ @DataDog/ci-app-libraries-java
89-
/dd-java-agent/instrumentation/maven-3.2.1/ @DataDog/ci-app-libraries-java
89+
/dd-java-agent/instrumentation/maven @DataDog/ci-app-libraries-java
9090
/dd-java-agent/instrumentation/maven-surefire/ @DataDog/ci-app-libraries-java
9191
/dd-java-agent/instrumentation/weaver/ @DataDog/ci-app-libraries-java
9292
/dd-smoke-tests/gradle/ @DataDog/ci-app-libraries-java
@@ -119,7 +119,7 @@
119119
/dd-java-agent/agent-profiling/ @DataDog/profiling-java
120120
/dd-java-agent/agent-crashtracking/ @DataDog/profiling-java
121121
/dd-java-agent/instrumentation/exception-profiling/ @DataDog/profiling-java
122-
/dd-java-agent/instrumentation/java-directbytebuffer/ @DataDog/profiling-java
122+
/dd-java-agent/instrumentation/java/java-nio-1.8/ @DataDog/profiling-java
123123
/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jfr/ @DataDog/profiling-java
124124
/dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/jfr/ @DataDog/profiling-java
125125
/dd-trace-api/src/main/java/datadog/trace/api/profiling @DataDog/profiling-java

.github/pull_request_template.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
# Contributor Checklist
88

99
- Format the title [according the contribution guidelines](https://github.com/DataDog/dd-trace-java/blob/master/CONTRIBUTING.md#title-format)
10-
- Assign the `type:` and (`comp:` or `inst:`) labels in addition to [any usefull labels](https://github.com/DataDog/dd-trace-java/blob/master/CONTRIBUTING.md#labels)
10+
- Assign the `type:` and (`comp:` or `inst:`) labels in addition to [any useful labels](https://github.com/DataDog/dd-trace-java/blob/master/CONTRIBUTING.md#labels)
1111
- Don't use `close`, `fix` or any [linking keywords](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) when referencing an issue.
1212
Use `solves` instead, and assign the PR [milestone](https://github.com/DataDog/dd-trace-java/milestones) to the issue
1313
- Update the [CODEOWNERS](https://github.com/DataDog/dd-trace-java/blob/master/.github/CODEOWNERS) file on source file addition, move, or deletion

.github/workflows/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ _Action:_ Check the pull request complies with [the contribution guidelines](htt
2828

2929
_Recovery:_ Manually verify the guideline compliance.
3030

31+
### check-pull-request-labels [🔗](check-pull-request-labels.yaml)
32+
33+
_Trigger:_ When creating or updating a pull request.
34+
35+
_Action:_ Check the pull request did not introduce unexpected label.
36+
37+
_Recovery:_ Update the pull request or add a comment to trigger the action again.
38+
3139
### draft-release-notes-on-tag [🔗](draft-release-notes-on-tag.yaml)
3240

3341
_Trigger:_ When creating a tag, or manually (providing a tag)

.github/workflows/analyze-changes.yaml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ jobs:
2323
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0
2424
with:
2525
submodules: 'recursive'
26-
2726
- name: Cache Gradle dependencies
28-
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
27+
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
2928
with:
3029
path: |
3130
~/.gradle/caches
@@ -35,12 +34,14 @@ jobs:
3534
${{ runner.os }}-gradle-
3635
3736
- name: Initialize CodeQL
38-
uses: github/codeql-action/init@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5
37+
uses: github/codeql-action/init@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.29.5
3938
with:
4039
languages: 'java'
4140
build-mode: 'manual'
4241

4342
- name: Build dd-trace-java for creating the CodeQL database
43+
env:
44+
ORG_GRADLE_PROJECT_akkaRepositoryToken: ${{ secrets.AKKA_REPO_TOKEN }}
4445
run: |
4546
GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xmx3G -Xms2G'" \
4647
JAVA_HOME=$JAVA_HOME_8_X64 \
@@ -52,7 +53,7 @@ jobs:
5253
--build-cache --parallel --stacktrace --no-daemon --max-workers=4
5354
5455
- name: Perform CodeQL Analysis and upload results to GitHub Security tab
55-
uses: github/codeql-action/analyze@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5
56+
uses: github/codeql-action/analyze@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.29.5
5657

5758
trivy:
5859
name: Analyze changes with Trivy
@@ -69,7 +70,7 @@ jobs:
6970
submodules: 'recursive'
7071

7172
- name: Cache Gradle dependencies
72-
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
73+
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
7374
with:
7475
path: |
7576
~/.gradle/caches
@@ -85,6 +86,8 @@ jobs:
8586
rm -rf "${MVN_LOCAL_REPO}/com/datadoghq"
8687
8788
- name: Build and publish artifacts locally
89+
env:
90+
ORG_GRADLE_PROJECT_akkaRepositoryToken: ${{ secrets.AKKA_REPO_TOKEN }}
8891
run: |
8992
GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xmx3G -Xms2G'" \
9093
JAVA_HOME=$JAVA_HOME_8_X64 \
@@ -115,7 +118,7 @@ jobs:
115118
TRIVY_JAVA_DB_REPOSITORY: ghcr.io/aquasecurity/trivy-java-db,public.ecr.aws/aquasecurity/trivy-java-db
116119

117120
- name: Upload Trivy scan results to GitHub Security tab
118-
uses: github/codeql-action/upload-sarif@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5
121+
uses: github/codeql-action/upload-sarif@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.29.5
119122
if: always()
120123
with:
121124
sarif_file: 'trivy-results.sarif'
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
name: Validate PR Label Format
2+
on:
3+
pull_request:
4+
types: [opened, edited, ready_for_review, labeled]
5+
6+
concurrency:
7+
group: ${{ github.workflow }}-${{ github.ref }}
8+
cancel-in-progress: true
9+
10+
jobs:
11+
check_pr_labels:
12+
name: Check pull request labels
13+
permissions:
14+
issues: write
15+
pull-requests: write
16+
runs-on: ubuntu-latest
17+
steps:
18+
- name: Check pull request labels
19+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # 8.0.0
20+
with:
21+
github-token: ${{ secrets.GITHUB_TOKEN }}
22+
script: |
23+
// Skip draft pull requests
24+
if (context.payload.pull_request.draft) {
25+
return
26+
}
27+
// Define valid label categories
28+
const validCategories = [
29+
'type:',
30+
'comp:',
31+
'inst:',
32+
'tag:',
33+
'performance:', // To refactor to 'ci: ' in the future
34+
'run-tests:' // Unused since GitLab migration
35+
]
36+
// Look for invalid labels
37+
const invalidLabels = context.payload.pull_request.labels
38+
.map(label => label.name)
39+
.filter(label => validCategories.every(prefix => !label.startsWith(prefix)))
40+
const hasInvalidLabels = invalidLabels.length > 0
41+
// Get existing comments to check for blocking comment
42+
const comments = await github.rest.issues.listComments({
43+
issue_number: context.payload.pull_request.number,
44+
owner: context.repo.owner,
45+
repo: context.repo.repo
46+
})
47+
const commentMarker = '<!-- dd-trace-java-check-pr-labels-workflow -->'
48+
const blockingComment = comments.data.find(comment => comment.body.includes(commentMarker))
49+
// Create or update blocking comment if there are invalid labels
50+
if (hasInvalidLabels) {
51+
const commentBody = '**PR Blocked - Invalid Label**\n\n' +
52+
`The pull request introduced unexpected labels:\n\n` +
53+
invalidLabels.map(label => `* \`${label}\``).join('\n') + '\n\n' +
54+
'**This PR is blocked until:**\n' +
55+
'1. The invalid labels are deleted, and\n' +
56+
'2. A maintainer deletes this comment to unblock the PR\n\n' +
57+
'**Note:** Simply removing labels from the pull request is not enough - a maintainer must remove the label and delete this comment to remove the block.\n\n' +
58+
commentMarker
59+
60+
if (blockingComment) {
61+
// Update existing blocking comment
62+
await github.rest.issues.updateComment({
63+
comment_id: blockingComment.id,
64+
owner: context.repo.owner,
65+
repo: context.repo.repo,
66+
body: commentBody
67+
})
68+
} else {
69+
// Create new blocking comment
70+
await github.rest.issues.createComment({
71+
issue_number: context.payload.pull_request.number,
72+
owner: context.repo.owner,
73+
repo: context.repo.repo,
74+
body: commentBody
75+
})
76+
}
77+
blockingComment = true
78+
}
79+
if (blockingComment) {
80+
// Block the PR by failing the workflow
81+
core.setFailed(`PR blocked: Invalid labels detected: (${invalidLabels.join(', ')}). A maintainer must delete the blocking comment after fixing the labels to allow merging.`)
82+
}

.github/workflows/prune-old-pull-requests.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
pull-requests: write
1414
steps:
1515
- name: Prune old pull requests
16-
uses: actions/stale@3a9db7e6a41a89f618792c92c0e97cc736e1b13f # v10.0.0
16+
uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0
1717
with:
1818
days-before-stale: -1 # Disable general stale bot
1919
days-before-pr-stale: 90 # Only enable stale bot for PRs with no activity for 90 days

.github/workflows/run-system-tests.yaml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
fetch-depth: 0
3030

3131
- name: Cache Gradle dependencies
32-
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
32+
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
3333
with:
3434
path: |
3535
~/.gradle/caches
@@ -39,6 +39,8 @@ jobs:
3939
${{ runner.os }}-gradle-
4040
4141
- name: Build dd-trace-java
42+
env:
43+
ORG_GRADLE_PROJECT_akkaRepositoryToken: ${{ secrets.AKKA_REPO_TOKEN }}
4244
run: |
4345
GRADLE_OPTS="-Xms2g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC" \
4446
JAVA_HOME=$JAVA_HOME_8_X64 \
@@ -76,7 +78,7 @@ jobs:
7678
check:
7779
name: Check system tests success
7880
runs-on: ubuntu-latest
79-
needs:
80-
- main
81+
if: ${{ always() }}
82+
needs: [build, main]
8183
steps:
8284
- run: exit 0

.github/workflows/update-gradle-dependencies.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ jobs:
2626
id: define-branch
2727
run: echo "branch=ci/update-gradle-dependencies-$(date +'%Y%m%d')" >> $GITHUB_OUTPUT
2828
- name: Update Gradle dependencies
29+
env:
30+
ORG_GRADLE_PROJECT_akkaRepositoryToken: ${{ secrets.AKKA_REPO_TOKEN }}
2931
run: |
3032
GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xmx3G -Xms2G'" \
3133
JAVA_HOME=$JAVA_HOME_8_X64 \

.gitlab-ci.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ build:
256256
DEPENDENCY_CACHE_POLICY: pull
257257
script:
258258
- if [ $CI_PIPELINE_SOURCE == "schedule" ] ; then ./gradlew resolveAndLockAll --write-locks $GRADLE_ARGS; fi
259+
- ./gradlew --version
259260
- ./gradlew clean :dd-java-agent:shadowJar :dd-trace-api:jar :dd-trace-ot:shadowJar -PskipTests $GRADLE_ARGS
260261
- echo UPSTREAM_TRACER_VERSION=$(java -jar workspace/dd-java-agent/build/libs/*.jar) >> upstream.env
261262
- echo "BUILD_JOB_NAME=$CI_JOB_NAME" >> build.env
@@ -296,6 +297,7 @@ build_tests:
296297

297298
script:
298299
- *gitlab_base_ref_params
300+
- ./gradlew --version
299301
- ./gradlew clean $GRADLE_TARGET $GRADLE_PARAMS -PskipTests $GRADLE_ARGS
300302

301303
populate_dep_cache:
@@ -362,7 +364,7 @@ spotless:
362364
stage: tests
363365
needs: []
364366
script:
365-
- export JAVA_HOME=$JAVA_11_HOME
367+
- ./gradlew --version
366368
- ./gradlew spotlessCheck $GRADLE_ARGS
367369

368370
test_published_artifacts:
@@ -381,6 +383,7 @@ test_published_artifacts:
381383
- ./gradlew publishToMavenLocal $GRADLE_ARGS
382384
- cd test-published-dependencies
383385
- export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xmx1G -Xms1G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'"
386+
- ./gradlew --version
384387
- ./gradlew check --info $GRADLE_ARGS
385388
after_script:
386389
- *cgroup_info
@@ -401,6 +404,7 @@ test_published_artifacts:
401404
CACHE_TYPE: lib
402405
script:
403406
- *gitlab_base_ref_params
407+
- ./gradlew --version
404408
- ./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PskipTests -PrunBuildSrcTests -PskipSpotless -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS
405409
after_script:
406410
- *cgroup_info
@@ -461,6 +465,7 @@ muzzle:
461465
CACHE_TYPE: inst
462466
script:
463467
- export SKIP_BUILDSCAN="true"
468+
- ./gradlew --version
464469
- ./gradlew :runMuzzle -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS
465470
after_script:
466471
- *cgroup_info
@@ -482,6 +487,7 @@ muzzle-dep-report:
482487
CACHE_TYPE: inst
483488
script:
484489
- export SKIP_BUILDSCAN="true"
490+
- ./gradlew --version
485491
- ./gradlew generateMuzzleReport muzzleInstrumentationReport $GRADLE_ARGS
486492
after_script:
487493
- *cgroup_info
@@ -541,6 +547,7 @@ muzzle-dep-report:
541547
fi
542548
- *prepare_test_env
543549
- 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"
550+
- ./gradlew --version
544551
- ./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PtestJvm=$testJvm -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS --continue || $CONTINUE_ON_FAILURE
545552
after_script:
546553
- *restore_pretest_env

BUILDING.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,6 @@ Requirements to build the full project:
6363

6464
Download and install JDK versions 8, 11, 17, 21 and 25, and GraalVM 17 for your OS.
6565

66-
> [!NOTE]
67-
> While Temurin JDK 25 from [Eclipse Temurin releases](https://adoptium.net/temurin/releases/) has not been released, please download the OpenJDK EA version at [this link](https://jdk.java.net/25/). Add the required environment variable using an `export` command along the lines of `export JAVA_25_HOME=/Library/Java/JavaVirtualMachines/jdk-25.jdk/Contents/Home`. Then, confirm that this was set properly by executing `echo $JAVA_25_HOME`.
68-
6966
#### macOS
7067

7168
* Install the required JDKs using `brew`:

0 commit comments

Comments
 (0)