Skip to content

Commit 80f8f15

Browse files
Set latest version for Gradle and Maven smoke tests through file (#10773)
feat: set smoke test latest through properties file nit: update latest for maven Merge branch 'master' into daniel.mohedano/smoke-test-latest-resolution Merge branch 'master' into daniel.mohedano/smoke-test-latest-resolution Merge branch 'master' into daniel.mohedano/smoke-test-latest-resolution feat: sts policy Co-authored-by: daniel.mohedano <daniel.mohedano@datadoghq.com>
1 parent 92d7ae6 commit 80f8f15

File tree

7 files changed

+208
-83
lines changed

7 files changed

+208
-83
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
issuer: https://token.actions.githubusercontent.com
2+
3+
subject: repo:DataDog/dd-trace-java:ref:refs/heads/master
4+
5+
claim_pattern:
6+
event_name: (schedule|workflow_dispatch)
7+
ref: refs/heads/master
8+
ref_protected: "true"
9+
job_workflow_ref: DataDog/dd-trace-java/\.github/workflows/update-smoke-test-latest-versions\.yaml@refs/heads/master
10+
11+
permissions:
12+
contents: write
13+
pull_requests: write

.github/workflows/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,14 @@ _Action:_ Create a PR updating the Grade dependencies and their locking files.
171171

172172
_Recovery:_ Manually trigger the action again.
173173

174+
### update-smoke-test-latest-versions [🔗](update-smoke-test-latest-versions.yaml)
175+
176+
_Trigger:_ Every week or manually.
177+
178+
_Action:_ Create a PR updating the pinned "latest" tool versions (Gradle, Maven, Maven Surefire) used by CI Visibility smoke tests.
179+
180+
_Recovery:_ Manually trigger the action again.
181+
174182
### update-jmxfetch-submodule [🔗](update-jmxfetch-submodule.yaml)
175183

176184
_Trigger:_ Monthly or manually
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
name: Update smoke test latest versions
2+
on:
3+
schedule:
4+
- cron: "0 5 * * 0"
5+
workflow_dispatch:
6+
7+
jobs:
8+
update-smoke-test-latest-versions:
9+
runs-on: ubuntu-latest
10+
name: Update smoke test latest versions
11+
permissions:
12+
contents: read
13+
id-token: write # Required for OIDC token federation
14+
steps:
15+
- uses: DataDog/dd-octo-sts-action@acaa02eee7e3bb0839e4272dacb37b8f3b58ba80 # v1.0.3
16+
id: octo-sts
17+
with:
18+
scope: DataDog/dd-trace-java
19+
policy: self.update-smoke-test-latest-versions.create-pr
20+
21+
- name: Checkout repository
22+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # 6.0.2
23+
24+
- name: Define branch name
25+
id: define-branch
26+
run: |
27+
DATE=$(date +'%Y%m%d')
28+
echo "branch=ci/update-smoke-test-latest-versions-${DATE}" >> "$GITHUB_OUTPUT"
29+
30+
- name: Fetch latest Gradle version
31+
id: gradle
32+
run: |
33+
VERSION=$(curl -sf https://services.gradle.org/versions/current | jq -r '.version')
34+
if [ -z "$VERSION" ] || [ "$VERSION" = "null" ]; then
35+
echo "::error::Failed to fetch latest Gradle version"
36+
exit 1
37+
fi
38+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
39+
echo "Latest Gradle version: $VERSION"
40+
41+
- name: Fetch latest stable Maven version
42+
id: maven
43+
run: |
44+
METADATA=$(curl -sf https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/maven-metadata.xml)
45+
# Get all versions, filter out alpha/beta/rc, take the latest
46+
VERSION=$(echo "$METADATA" \
47+
| xmllint --xpath '//versions/version/text()' - 2>/dev/null \
48+
| tr ' ' '\n' \
49+
| grep -v -E '(alpha|beta|rc)' \
50+
| sort -V \
51+
| tail -1)
52+
if [ -z "$VERSION" ]; then
53+
echo "::error::Failed to fetch latest stable Maven version"
54+
exit 1
55+
fi
56+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
57+
echo "Latest stable Maven version: $VERSION"
58+
59+
- name: Fetch latest stable Maven Surefire version
60+
id: surefire
61+
run: |
62+
METADATA=$(curl -sf https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/maven-metadata.xml)
63+
# Get all versions, filter out alpha/beta, take the latest
64+
VERSION=$(echo "$METADATA" \
65+
| xmllint --xpath '//versions/version/text()' - 2>/dev/null \
66+
| tr ' ' '\n' \
67+
| grep -v -E '(alpha|beta)' \
68+
| sort -V \
69+
| tail -1)
70+
if [ -z "$VERSION" ]; then
71+
echo "::error::Failed to fetch latest stable Maven Surefire version"
72+
exit 1
73+
fi
74+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
75+
echo "Latest stable Maven Surefire version: $VERSION"
76+
77+
- name: Update properties files
78+
env:
79+
GRADLE_VERSION: ${{ steps.gradle.outputs.version }}
80+
MAVEN_VERSION: ${{ steps.maven.outputs.version }}
81+
SUREFIRE_VERSION: ${{ steps.surefire.outputs.version }}
82+
run: |
83+
printf '%s\n' \
84+
"# Pinned \"latest\" versions for CI Visibility Gradle smoke tests." \
85+
"# Updated automatically by the update-smoke-test-latest-versions workflow." \
86+
"gradle.version=${GRADLE_VERSION}" \
87+
> dd-smoke-tests/gradle/src/test/resources/latest-tool-versions.properties
88+
89+
printf '%s\n' \
90+
"# Pinned \"latest\" versions for CI Visibility Maven smoke tests." \
91+
"# Updated automatically by the update-smoke-test-latest-versions workflow." \
92+
"maven.version=${MAVEN_VERSION}" \
93+
"maven-surefire.version=${SUREFIRE_VERSION}" \
94+
> dd-smoke-tests/maven/src/test/resources/latest-tool-versions.properties
95+
96+
- name: Check for changes
97+
id: check-changes
98+
run: |
99+
if [[ -z "$(git status -s)" ]]; then
100+
echo "No changes to commit."
101+
echo "has_changes=false" >> "$GITHUB_OUTPUT"
102+
else
103+
echo "has_changes=true" >> "$GITHUB_OUTPUT"
104+
fi
105+
106+
- name: Configure git
107+
if: steps.check-changes.outputs.has_changes == 'true'
108+
run: |
109+
git config user.name "github-actions[bot]"
110+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
111+
112+
- name: Create commit
113+
if: steps.check-changes.outputs.has_changes == 'true'
114+
id: create-commit
115+
run: |
116+
git add dd-smoke-tests/gradle/src/test/resources/latest-tool-versions.properties \
117+
dd-smoke-tests/maven/src/test/resources/latest-tool-versions.properties
118+
git commit -m "chore: Update smoke test latest tool versions"
119+
echo "commit=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
120+
121+
- name: Push changes
122+
if: steps.check-changes.outputs.has_changes == 'true'
123+
uses: DataDog/commit-headless@05d7b7ee023e2c7d01c47832d420c2503cd416f3 # action/v2.0.3
124+
with:
125+
token: "${{ steps.octo-sts.outputs.token }}"
126+
branch: "${{ steps.define-branch.outputs.branch }}"
127+
head-sha: "${{ github.sha }}"
128+
create-branch: true
129+
command: push
130+
commits: "${{ steps.create-commit.outputs.commit }}"
131+
132+
- name: Create pull request
133+
if: steps.check-changes.outputs.has_changes == 'true'
134+
env:
135+
GH_TOKEN: ${{ steps.octo-sts.outputs.token }}
136+
run: |
137+
gh pr create --title "Update smoke test latest tool versions" \
138+
--base master \
139+
--head ${{ steps.define-branch.outputs.branch }} \
140+
--label "tag: dependencies" \
141+
--label "tag: no release notes" \
142+
--body "$(cat <<'EOF'
143+
# What Does This Do
144+
145+
This PR updates the pinned "latest" tool versions used by CI Visibility smoke tests:
146+
- Gradle: ${{ steps.gradle.outputs.version }}
147+
- Maven: ${{ steps.maven.outputs.version }}
148+
- Maven Surefire: ${{ steps.surefire.outputs.version }}
149+
150+
# Motivation
151+
152+
Keep smoke tests running against the latest stable versions of build tools.
153+
154+
# Contributor Checklist
155+
156+
- [ ] Verify smoke tests pass with the new versions
157+
EOF
158+
)"

dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/AbstractGradleTest.groovy

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
package datadog.smoketest
22

3-
import com.fasterxml.jackson.databind.JsonNode
4-
import com.fasterxml.jackson.databind.ObjectMapper
53
import datadog.environment.JavaVirtualMachine
64
import datadog.trace.civisibility.CiVisibilitySmokeTest
75
import datadog.trace.util.ComparableVersion
8-
import okhttp3.OkHttpClient
9-
import okhttp3.Request
10-
import okhttp3.Response
116
import org.gradle.internal.impldep.org.apache.commons.io.FileUtils
12-
import org.gradle.util.GradleVersion
137
import org.junit.jupiter.api.Assumptions
148
import spock.lang.AutoCleanup
159
import spock.lang.Shared
@@ -138,16 +132,12 @@ class AbstractGradleTest extends CiVisibilitySmokeTest {
138132
}
139133

140134
private static String getLatestGradleVersion() {
141-
OkHttpClient client = new OkHttpClient()
142-
Request request = new Request.Builder().url("https://services.gradle.org/versions/current").build()
143-
try (Response response = client.newCall(request).execute()) {
144-
if (!response.successful) {
145-
return GradleVersion.current().version
146-
}
147-
def responseBody = response.body().string()
148-
ObjectMapper mapper = new ObjectMapper()
149-
JsonNode root = mapper.readTree(responseBody)
150-
return root.get("version").asText()
135+
def properties = new Properties()
136+
def stream = AbstractGradleTest.classLoader.getResourceAsStream("latest-tool-versions.properties")
137+
if (stream == null) {
138+
throw new IllegalStateException("Could not find latest-tool-versions.properties on classpath")
151139
}
140+
stream.withCloseable { properties.load(it) }
141+
return properties.getProperty("gradle.version")
152142
}
153143
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Pinned "latest" versions for CI Visibility Gradle smoke tests.
2+
# Updated automatically by the update-smoke-test-latest-versions workflow.
3+
gradle.version=9.4.0

dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy

Lines changed: 16 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,15 @@ import datadog.trace.api.civisibility.CIConstants
55
import datadog.trace.api.config.CiVisibilityConfig
66
import datadog.trace.api.config.GeneralConfig
77
import datadog.trace.civisibility.CiVisibilitySmokeTest
8-
import okhttp3.OkHttpClient
9-
import okhttp3.Request
10-
import okhttp3.Response
118
import org.apache.maven.wrapper.MavenWrapperMain
129
import org.slf4j.Logger
1310
import org.slf4j.LoggerFactory
14-
import org.w3c.dom.Document
15-
import org.w3c.dom.NodeList
1611
import spock.lang.AutoCleanup
1712
import spock.lang.IgnoreIf
1813
import spock.lang.Shared
1914
import spock.lang.TempDir
2015
import spock.util.environment.Jvm
2116

22-
import javax.xml.parsers.DocumentBuilder
23-
import javax.xml.parsers.DocumentBuilderFactory
2417
import java.nio.file.FileVisitResult
2518
import java.nio.file.Files
2619
import java.nio.file.Path
@@ -442,70 +435,26 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
442435
}
443436
}
444437

445-
private static String getLatestMavenVersion() {
446-
OkHttpClient client = new OkHttpClient()
447-
Request request = new Request.Builder().url("https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/maven-metadata.xml").build()
448-
try (Response response = client.newCall(request).execute()) {
449-
if (response.successful) {
450-
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance()
451-
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder()
452-
Document doc = dBuilder.parse(response.body().byteStream())
453-
doc.getDocumentElement().normalize()
454-
455-
NodeList versionList = doc.getElementsByTagName("latest")
456-
if (versionList.getLength() > 0) {
457-
def version = versionList.item(0).getTextContent()
458-
if (!version.contains('alpha') && !version.contains('beta') && !version.contains('rc')) {
459-
LOGGER.info("Will run the 'latest' tests with version ${version}")
460-
return version
461-
}
462-
}
463-
} else {
464-
LOGGER.warn("Could not get latest maven version, response from repo.maven.apache.org is ${response.code()}: ${response.body().string()}")
465-
}
466-
} catch (Exception e) {
467-
LOGGER.warn("Could not get latest maven version", e)
438+
private static Properties loadLatestToolVersions() {
439+
def properties = new Properties()
440+
def stream = MavenSmokeTest.classLoader.getResourceAsStream("latest-tool-versions.properties")
441+
if (stream == null) {
442+
throw new IllegalStateException("Could not find latest-tool-versions.properties on classpath")
468443
}
469-
def hardcodedLatestVersion = "4.0.0-beta-3" // latest version that is known to work
470-
LOGGER.info("Will run the 'latest' tests with hard-coded version ${hardcodedLatestVersion}")
471-
return hardcodedLatestVersion
444+
stream.withCloseable { properties.load(it) }
445+
return properties
446+
}
447+
448+
private static String getLatestMavenVersion() {
449+
def version = loadLatestToolVersions().getProperty("maven.version")
450+
LOGGER.info("Will run the 'latest' tests with Maven version ${version}")
451+
return version
472452
}
473453

474454
private static String getLatestMavenSurefireVersion() {
475-
OkHttpClient client = new OkHttpClient()
476-
Request request =
477-
new Request.Builder()
478-
.url(
479-
"https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/maven-metadata.xml")
480-
.build()
481-
try (Response response = client.newCall(request).execute()) {
482-
if (response.isSuccessful()) {
483-
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance()
484-
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder()
485-
Document doc = dBuilder.parse(response.body().byteStream())
486-
doc.getDocumentElement().normalize()
487-
488-
NodeList versionList = doc.getElementsByTagName("latest")
489-
if (versionList.getLength() > 0) {
490-
String version = versionList.item(0).getTextContent()
491-
if (!version.contains("alpha") && !version.contains("beta")) {
492-
LOGGER.info("Will run the 'latest' tests with version " + version)
493-
return version
494-
}
495-
}
496-
} else {
497-
LOGGER.warn(
498-
"Could not get latest Maven Surefire version, response from repo.maven.apache.org is "
499-
+ response.code()
500-
+ ":"
501-
+ response.body().string())
502-
}
503-
} catch (Exception e) {
504-
LOGGER.warn("Could not get latest Maven Surefire version", e)
505-
}
506-
String hardcodedLatestVersion = "3.5.0" // latest version that is known to work
507-
LOGGER.info("Will run the 'latest' tests with hard-coded version " + hardcodedLatestVersion)
508-
return hardcodedLatestVersion
455+
def version = loadLatestToolVersions().getProperty("maven-surefire.version")
456+
LOGGER.info("Will run the 'latest' tests with Maven Surefire version ${version}")
457+
return version
509458
}
510459

511460
private static BitSet bits(int ... indices) {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Pinned "latest" versions for CI Visibility Maven smoke tests.
2+
# Updated automatically by the update-smoke-test-latest-versions workflow.
3+
maven.version=4.0.0-beta-3
4+
maven-surefire.version=3.5.5

0 commit comments

Comments
 (0)