Skip to content

Commit fa4923f

Browse files
authored
[java] create CI Tool classes instead of using a map of constants (#335)
* [java] create CI Tool classes instead of using a map of constants * [java] update CI Tool classes to look for user overrides
1 parent 4022cd1 commit fa4923f

File tree

11 files changed

+244
-40
lines changed

11 files changed

+244
-40
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,38 @@
11
package com.saucelabs.saucebindings;
22

3-
import com.google.common.collect.ImmutableList;
43
import com.google.common.collect.ImmutableMap;
4+
import com.saucelabs.saucebindings.citools.Bamboo;
5+
import com.saucelabs.saucebindings.citools.CITool;
6+
import com.saucelabs.saucebindings.citools.CircleCI;
7+
import com.saucelabs.saucebindings.citools.DefaultTool;
8+
import com.saucelabs.saucebindings.citools.GitHub;
9+
import com.saucelabs.saucebindings.citools.GitLab;
10+
import com.saucelabs.saucebindings.citools.Jenkins;
11+
import com.saucelabs.saucebindings.citools.TeamCity;
12+
import com.saucelabs.saucebindings.citools.TravisCI;
513
import java.util.Map;
14+
import java.util.function.Supplier;
615

716
/**
817
* Determines the information a test needs based on what CI Tool is being used. It does not need to
918
* be initialized.
1019
*/
1120
public abstract class CITools {
12-
private static String ciToolName;
21+
private static CITool ciTool;
1322

1423
/** Map of CI Tools and what Environment variable, if present, indicates its usage. */
15-
public static final Map<String, String> KNOWN_TOOLS =
24+
public static final Map<String, Supplier<CITool>> KNOWN_TOOLS =
1625
ImmutableMap.of(
17-
"Bamboo", "bamboo_agentId",
18-
"Circle", "CIRCLE_JOB",
19-
"Github", "GITHUB_SHA",
20-
"GitLab", "CI",
21-
"Jenkins", "JENKINS_HOME",
22-
"TeamCity", "TEAMCITY_PROJECT_NAME",
23-
"Travis", "TRAVIS_JOB_ID");
24-
25-
/** The Build Name and Build Number values to properly differentiate test runs. */
26-
public static final Map<String, ImmutableList<String>> BUILD_VALUES =
27-
ImmutableMap.of(
28-
"Bamboo", ImmutableList.of("bamboo_shortJobName", "bamboo_buildNumber"),
29-
"Circle", ImmutableList.of("CIRCLE_JOB", "CIRCLE_BUILD_NUM"),
30-
"Github", ImmutableList.of("GITHUB_JOB", "GITHUB_RUN_NUMBER"),
31-
"GitLab", ImmutableList.of("CI_JOB_NAME", "CI_JOB_ID"),
32-
"Jenkins", ImmutableList.of("BUILD_NAME", "BUILD_NUMBER"),
33-
"TeamCity", ImmutableList.of("TEAMCITY_PROJECT_NAME", "BUILD_NUMBER"),
34-
"Travis", ImmutableList.of("TRAVIS_JOB_NAME", "TRAVIS_JOB_NUMBER"));
26+
"bamboo_agentId", Bamboo::new,
27+
"CIRCLE_JOB", CircleCI::new,
28+
"GITHUB_SHA", GitHub::new,
29+
"CI", GitLab::new,
30+
"JENKINS_HOME", Jenkins::new,
31+
"TEAMCITY_PROJECT_NAME", TeamCity::new,
32+
"TRAVIS_JOB_ID", TravisCI::new);
3533

3634
public static String getCiToolName() {
37-
if (ciToolName == null) {
38-
for (Map.Entry<String, String> tool : KNOWN_TOOLS.entrySet()) {
39-
if (SystemManager.get(tool.getValue()) != null) {
40-
ciToolName = tool.getKey();
41-
return ciToolName;
42-
}
43-
}
44-
}
45-
return ciToolName == null ? "unknown" : ciToolName;
35+
return getCiTool().getClientPlatform();
4636
}
4737

4838
/**
@@ -51,11 +41,7 @@ public static String getCiToolName() {
5141
* @return the constant name of the build
5242
*/
5343
public static String getBuildName() {
54-
if (!getCiToolName().equalsIgnoreCase("unknown")) {
55-
String buildNameKey = BUILD_VALUES.get(getCiToolName()).get(0);
56-
return SystemManager.get(buildNameKey);
57-
}
58-
return "Default Build Name";
44+
return getCiTool().getBuildName();
5945
}
6046

6147
/**
@@ -64,10 +50,24 @@ public static String getBuildName() {
6450
* @return the variable number of the current build
6551
*/
6652
public static String getBuildNumber() {
67-
if (!getCiToolName().equalsIgnoreCase("unknown")) {
68-
String buildNumberKey = BUILD_VALUES.get(getCiToolName()).get(1);
69-
return SystemManager.get(buildNumberKey);
53+
return getCiTool().getBuildNumber();
54+
}
55+
56+
private static CITool getCiTool() {
57+
if (ciTool != null) {
58+
return ciTool;
59+
} else if (SystemManager.get("SAUCE_CLIENT_PLATFORM") != null) {
60+
// Override the CI Tool lookup when this environment variable is set.
61+
return new DefaultTool();
62+
} else {
63+
for (Map.Entry<String, Supplier<CITool>> tool : KNOWN_TOOLS.entrySet()) {
64+
if (System.getenv(tool.getKey()) != null) {
65+
ciTool = tool.getValue().get();
66+
return ciTool;
67+
}
68+
}
69+
ciTool = new DefaultTool();
70+
return ciTool;
7071
}
71-
return String.valueOf(System.currentTimeMillis());
7272
}
7373
}

java/main/src/main/java/com/saucelabs/saucebindings/SystemManager.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,17 @@ public static String get(String key, String errorMessage) {
2626
* @return the value of the provided field name
2727
*/
2828
public static String get(String key) {
29+
String systemPropertyKey = key.toLowerCase().replace("_", ".");
30+
String systemEnvKey = key.toUpperCase().replace(".", "_");
31+
2932
if (System.getProperty(key) != null) {
30-
return System.getProperty(key);
33+
return System.getProperty(systemPropertyKey);
3134
} else if (System.getenv(key) != null) {
3235
return System.getenv(key);
36+
} else if (System.getProperty(systemPropertyKey) != null) {
37+
return System.getProperty(systemPropertyKey);
38+
} else if (System.getenv(systemEnvKey) != null) {
39+
return System.getenv(systemEnvKey);
3340
} else {
3441
return null;
3542
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.saucelabs.saucebindings.citools;
2+
3+
import com.saucelabs.saucebindings.SystemManager;
4+
5+
public class Bamboo implements CITool {
6+
7+
@Override
8+
public String getClientPlatform() {
9+
return "Bamboo";
10+
}
11+
12+
@Override
13+
public String getBuildName() {
14+
String buildName = SystemManager.get("SAUCE_BUILD_NAME");
15+
return buildName != null ? buildName : System.getenv("bamboo_shortJobName");
16+
}
17+
18+
@Override
19+
public String getBuildNumber() {
20+
String buildNumber = SystemManager.get("SAUCE_BUILD_NUMBER");
21+
return buildNumber != null ? buildNumber : System.getenv("bamboo_buildNumber");
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.saucelabs.saucebindings.citools;
2+
3+
public interface CITool {
4+
String getClientPlatform();
5+
6+
String getBuildName();
7+
8+
String getBuildNumber();
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.saucelabs.saucebindings.citools;
2+
3+
import com.saucelabs.saucebindings.SystemManager;
4+
5+
public class CircleCI implements CITool {
6+
7+
@Override
8+
public String getClientPlatform() {
9+
return "Circle CI";
10+
}
11+
12+
@Override
13+
public String getBuildName() {
14+
String buildName = SystemManager.get("SAUCE_BUILD_NAME");
15+
return buildName != null ? buildName : System.getenv("CIRCLE_JOB");
16+
}
17+
18+
@Override
19+
public String getBuildNumber() {
20+
String buildNumber = SystemManager.get("SAUCE_BUILD_NUMBER");
21+
return buildNumber != null ? buildNumber : System.getenv("CIRCLE_BUILD_NUM");
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.saucelabs.saucebindings.citools;
2+
3+
import com.saucelabs.saucebindings.SystemManager;
4+
5+
public class DefaultTool implements CITool {
6+
7+
@Override
8+
public String getClientPlatform() {
9+
String clientPlatform = SystemManager.get("SAUCE_CLIENT_PLATFORM");
10+
return clientPlatform != null ? clientPlatform : "Unknown";
11+
}
12+
13+
@Override
14+
public String getBuildName() {
15+
String buildName = SystemManager.get("SAUCE_BUILD_NAME");
16+
return buildName != null ? buildName : "Undefined Build Name";
17+
}
18+
19+
@Override
20+
public String getBuildNumber() {
21+
String buildNumber = SystemManager.get("SAUCE_BUILD_NUMBER");
22+
return buildNumber != null ? buildNumber : String.valueOf(System.currentTimeMillis());
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.saucelabs.saucebindings.citools;
2+
3+
import com.saucelabs.saucebindings.SystemManager;
4+
5+
public class GitHub implements CITool {
6+
7+
@Override
8+
public String getClientPlatform() {
9+
return "GitHub";
10+
}
11+
12+
@Override
13+
public String getBuildName() {
14+
String buildName = SystemManager.get("SAUCE_BUILD_NAME");
15+
String workflow = System.getenv("GITHUB_WORKFLOW");
16+
String jobName = System.getenv("GITHUB_JOB");
17+
18+
return buildName != null ? buildName : workflow + " / " + jobName;
19+
}
20+
21+
@Override
22+
public String getBuildNumber() {
23+
String buildNumber = SystemManager.get("SAUCE_BUILD_NUMBER");
24+
return buildNumber != null ? buildNumber : System.getenv("GITHUB_RUN_NUMBER");
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.saucelabs.saucebindings.citools;
2+
3+
import com.saucelabs.saucebindings.SystemManager;
4+
5+
public class GitLab implements CITool {
6+
7+
@Override
8+
public String getClientPlatform() {
9+
return "GitLab";
10+
}
11+
12+
@Override
13+
public String getBuildName() {
14+
String buildName = SystemManager.get("SAUCE_BUILD_NAME");
15+
return buildName != null ? buildName : System.getenv("CI_JOB_NAME");
16+
}
17+
18+
@Override
19+
public String getBuildNumber() {
20+
String buildNumber = SystemManager.get("SAUCE_BUILD_NUMBER");
21+
return buildNumber != null ? buildNumber : System.getenv("CI_JOB_ID");
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.saucelabs.saucebindings.citools;
2+
3+
import com.saucelabs.saucebindings.SystemManager;
4+
5+
public class Jenkins implements CITool {
6+
7+
@Override
8+
public String getClientPlatform() {
9+
return "Jenkins";
10+
}
11+
12+
@Override
13+
public String getBuildName() {
14+
String buildName = SystemManager.get("SAUCE_BUILD_NAME");
15+
return buildName != null ? buildName : System.getenv("BUILD_NAME");
16+
}
17+
18+
@Override
19+
public String getBuildNumber() {
20+
String buildNumber = SystemManager.get("SAUCE_BUILD_NUMBER");
21+
return buildNumber != null ? buildNumber : System.getenv("BUILD_NUMBER");
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.saucelabs.saucebindings.citools;
2+
3+
import com.saucelabs.saucebindings.SystemManager;
4+
5+
public class TeamCity implements CITool {
6+
7+
@Override
8+
public String getClientPlatform() {
9+
return "Team City";
10+
}
11+
12+
@Override
13+
public String getBuildName() {
14+
String buildName = SystemManager.get("SAUCE_BUILD_NAME");
15+
return buildName != null ? buildName : System.getenv("TEAMCITY_PROJECT_NAME");
16+
}
17+
18+
@Override
19+
public String getBuildNumber() {
20+
String buildNumber = SystemManager.get("SAUCE_BUILD_NUMBER");
21+
return buildNumber != null ? buildNumber : System.getenv("BUILD_NUMBER");
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.saucelabs.saucebindings.citools;
2+
3+
import com.saucelabs.saucebindings.SystemManager;
4+
5+
public class TravisCI implements CITool {
6+
7+
@Override
8+
public String getClientPlatform() {
9+
return "Travis CI";
10+
}
11+
12+
@Override
13+
public String getBuildName() {
14+
String buildName = SystemManager.get("SAUCE_BUILD_NAME");
15+
return buildName != null ? buildName : System.getenv("TRAVIS_JOB_NAME");
16+
}
17+
18+
@Override
19+
public String getBuildNumber() {
20+
String buildNumber = SystemManager.get("SAUCE_BUILD_NUMBER");
21+
return buildNumber != null ? buildNumber : System.getenv("TRAVIS_JOB_NUMBER");
22+
}
23+
}

0 commit comments

Comments
 (0)