Skip to content

Commit 8495b93

Browse files
committed
[Internal] CICD provider
1 parent c750aae commit 8495b93

File tree

2 files changed

+108
-2
lines changed

2 files changed

+108
-2
lines changed

databricks-sdk-java/src/main/java/com/databricks/sdk/core/UserAgent.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package com.databricks.sdk.core;
22

33
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collections;
6+
import java.util.HashMap;
47
import java.util.List;
8+
import java.util.Map;
59
import java.util.regex.Pattern;
610
import java.util.stream.Collectors;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
713

814
public class UserAgent {
15+
private static final Logger log = LoggerFactory.getLogger(UserAgent.class);
916
private static String product = "unknown";
1017
private static String productVersion = "0.0.0";
1118

@@ -121,6 +128,10 @@ public static String asString() {
121128
segments.add(String.format("databricks-sdk-java/%s", version));
122129
segments.add(String.format("jvm/%s", jvmVersion()));
123130
segments.add(String.format("os/%s", osName()));
131+
String ciProvider = cicdProvider();
132+
if (!ciProvider.isEmpty()) {
133+
segments.add(String.format("ci/%s", ciProvider));
134+
}
124135
// Concurrent iteration over ArrayList must be guarded with synchronized.
125136
synchronized (otherInfo) {
126137
segments.addAll(
@@ -130,4 +141,60 @@ public static String asString() {
130141
}
131142
return segments.stream().collect(Collectors.joining(" "));
132143
}
144+
145+
// Map of CI/CD providers that are used to detect them.
146+
private static final Map<String, List<EnvVar>> PROVIDERS = new HashMap<>();
147+
148+
static {
149+
PROVIDERS.put("github", Collections.singletonList(new EnvVar("GITHUB_ACTIONS", "true")));
150+
PROVIDERS.put("gitlab", Collections.singletonList(new EnvVar("GITLAB_CI", "true")));
151+
PROVIDERS.put("jenkins", Collections.singletonList(new EnvVar("JENKINS_URL", "")));
152+
PROVIDERS.put("azure-devops", Collections.singletonList(new EnvVar("TF_BUILD", "True")));
153+
PROVIDERS.put("circle", Collections.singletonList(new EnvVar("CIRCLECI", "true")));
154+
PROVIDERS.put("travis", Collections.singletonList(new EnvVar("TRAVIS", "true")));
155+
PROVIDERS.put("bitbucket", Collections.singletonList(new EnvVar("BITBUCKET_BUILD_NUMBER", "")));
156+
PROVIDERS.put(
157+
"google-cloud-build",
158+
Arrays.asList(
159+
new EnvVar("PROJECT_ID", ""),
160+
new EnvVar("BUILD_ID", ""),
161+
new EnvVar("PROJECT_NUMBER", ""),
162+
new EnvVar("LOCATION", "")));
163+
PROVIDERS.put(
164+
"aws-code-build", Collections.singletonList(new EnvVar("CODEBUILD_BUILD_ARN", "")));
165+
PROVIDERS.put("tf-cloud", Collections.singletonList(new EnvVar("TFC_RUN_ID", "")));
166+
}
167+
168+
// This is a static private variable to store the CI/CD provider.
169+
// This is thread-safe because static initializers are executed
170+
// in a thread-safe manner by the Java ClassLoader.
171+
private static final String cicdProvider = lookupCiCdProvider();
172+
173+
private static class EnvVar {
174+
private final String name;
175+
private final String expectedValue;
176+
177+
public EnvVar(String name, String expectedValue) {
178+
this.name = name;
179+
this.expectedValue = expectedValue;
180+
}
181+
182+
public boolean detect() {
183+
String value = System.getProperty(name);
184+
return value != null && (expectedValue.isEmpty() || value.equals(expectedValue));
185+
}
186+
}
187+
188+
private static String lookupCiCdProvider() {
189+
for (Map.Entry<String, List<EnvVar>> entry : PROVIDERS.entrySet()) {
190+
if (entry.getValue().stream().allMatch(EnvVar::detect)) {
191+
return entry.getKey();
192+
}
193+
}
194+
return "";
195+
}
196+
197+
public static String cicdProvider() {
198+
return cicdProvider;
199+
}
133200
}

databricks-sdk-java/src/test/java/com/databricks/sdk/core/UserAgentTest.java

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.databricks.sdk.core;
22

3-
import org.junit.jupiter.api.Assertions;
4-
import org.junit.jupiter.api.Test;
3+
import java.util.Properties;
4+
import org.junit.jupiter.api.*;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
57

68
public class UserAgentTest {
9+
private static final Logger log = LoggerFactory.getLogger(UserAgentTest.class);
10+
711
@Test
812
public void testUserAgent() {
913
UserAgent.withProduct("product", "productVersion");
@@ -56,4 +60,39 @@ public void testUserAgentWithSemverValue() {
5660
String userAgent = UserAgent.asString();
5761
Assertions.assertTrue(userAgent.contains("key1/1.0.0-dev+metadata"));
5862
}
63+
64+
private Properties originalProperties;
65+
66+
@BeforeEach
67+
public void clearCICD() {
68+
// Save original system properties
69+
originalProperties = (Properties) System.getProperties().clone();
70+
71+
// Clear all system properties
72+
System.getProperties().clear();
73+
}
74+
75+
@AfterEach
76+
public void restoreProperties() {
77+
// Restore original system properties
78+
System.setProperties(originalProperties);
79+
}
80+
81+
@Test
82+
public void testUserAgentCicdNoProvider() {
83+
Assertions.assertEquals("", UserAgent.cicdProvider());
84+
}
85+
86+
@Test
87+
public void testUserAgentCicdOneProvider() {
88+
System.setProperty("GITHUB_ACTIONS", "true");
89+
Assertions.assertEquals("github", UserAgent.cicdProvider());
90+
}
91+
92+
@Test
93+
public void testUserAgentCicdMultipleProviders() {
94+
System.setProperty("GITHUB_ACTIONS", "true");
95+
System.setProperty("GITLAB_CI", "true");
96+
Assertions.assertEquals("github", UserAgent.cicdProvider());
97+
}
5998
}

0 commit comments

Comments
 (0)