Skip to content

Commit 66736c9

Browse files
committed
Stricter determination of whether build is on CI. The CTHING_CI environment variable must not only be defined, it must now have the value "true" (case-insensitive) to indicate a CI build. Added an isCIBuild method to complement the existing isDeveloperBuild method.
1 parent 42d7b86 commit 66736c9

File tree

4 files changed

+91
-14
lines changed

4 files changed

+91
-14
lines changed

README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ information. The additional information indicates the build type and whether the
99
C Thing Software Continuous Integration service or on a developer's machine. The following versioning scheme is
1010
used:
1111

12-
| Build Environment | Requested Build Type | Actual Build Type | Semantic Version |
13-
|--------------------------------------------|----------------------|-------------------|-----------------------------------|
14-
| CTHING_CI undefined (i.e. developer build) | snapshot | snapshot | n.n.n-0 |
15-
| CTHING_CI defined (i.e. CI build) | snapshot | snapshot | n.n.n-t (t = ms since Unix Epoch) |
16-
| CTHING_CI undefined | release | snapshot | n.n.n-0 |
17-
| CTHING_CI defined | release | release | n.n.n |
12+
| Build Environment | Requested Build Type | Actual Build Type | Semantic Version |
13+
|--------------------------------------------------------------------|----------------------|-------------------|-----------------------------------|
14+
| CTHING_CI == false<sup>1</sup> or undefined (i.e. developer build) | snapshot | snapshot | n.n.n-0 |
15+
| CTHING_CI == true (i.e. CI build) | snapshot | snapshot | n.n.n-t (t = ms since Unix Epoch) |
16+
| CTHING_CI == false or undefined | release | snapshot | n.n.n-0 |
17+
| CTHING_CI == true | release | release | n.n.n |
18+
19+
<sup>1</sup>The values `true` and `false` are case-insensitive
1820

1921
## Usage
2022
The library is available from [Maven Central](https://repo.maven.apache.org/maven2/org/cthing/cthing-projectversion/) using

build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ plugins {
2222
alias(libs.plugins.versions)
2323
}
2424

25-
val baseVersion = "2.0.1"
25+
val baseVersion = "3.0.0"
2626
val isSnapshot = true
2727

28-
val isCIServer = System.getenv("CTHING_CI") != null
28+
val isCIServer = "true" == System.getenv("CTHING_CI")?.lowercase()
2929
val now = System.currentTimeMillis()
3030
val buildNumber = if (isCIServer) now.toString() else "0"
3131
val buildDate: String = Instant.ofEpochMilli(now)

src/main/java/org/cthing/projectversion/ProjectVersion.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.text.DateFormat;
1111
import java.text.SimpleDateFormat;
1212
import java.util.Date;
13+
import java.util.Locale;
1314
import java.util.Objects;
1415
import java.util.TimeZone;
1516
import java.util.regex.Matcher;
@@ -35,32 +36,36 @@
3536
* </thead>
3637
* <tbody>
3738
* <tr>
38-
* <td style="text-align: left; padding: 5px;">CTHING_CI defined (i.e. CI build)</td>
39+
* <td style="text-align: left; padding: 5px;">CTHING_CI == true<sup>1</sup> (i.e. CI build)</td>
3940
* <td style="text-align: left; padding: 5px;">snapshot</td>
4041
* <td style="text-align: left; padding: 5px;">snapshot</td>
4142
* <td style="text-align: left; padding: 5px;">n.n.n-t (t = ms since Unix Epoch)</td>
4243
* </tr>
4344
* <tr>
44-
* <td style="text-align: left; padding: 5px;">CTHING_CI undefined (i.e. developer build)</td>
45+
* <td style="text-align: left; padding: 5px;">CTHING_CI == false or undefined (i.e. developer build)</td>
4546
* <td style="text-align: left; padding: 5px;">snapshot</td>
4647
* <td style="text-align: left; padding: 5px;">snapshot</td>
4748
* <td style="text-align: left; padding: 5px;">n.n.n-0</td>
4849
* </tr>
4950
* <tr>
50-
* <td style="text-align: left; padding: 5px;">CTHING_CI defined</td>
51+
* <td style="text-align: left; padding: 5px;">CTHING_CI == true</td>
5152
* <td style="text-align: left; padding: 5px;">release</td>
5253
* <td style="text-align: left; padding: 5px;">release</td>
5354
* <td style="text-align: left; padding: 5px;">n.n.n</td>
5455
* </tr>
5556
* <tr>
56-
* <td style="text-align: left; padding: 5px;">CTHING_CI undefined</td>
57+
* <td style="text-align: left; padding: 5px;">CTHING_CI == false or undefined</td>
5758
* <td style="text-align: left; padding: 5px;">release</td>
5859
* <td style="text-align: left; padding: 5px;">snapshot</td>
5960
* <td style="text-align: left; padding: 5px;">n.n.n-0</td>
6061
* </tr>
6162
* </tbody>
6263
* </table>
6364
*
65+
* <p>
66+
* <sup>1</sup>The values {@code true} and {@code false} are case-insensitive
67+
* </p>
68+
*
6469
* @see "http://semver.org/"
6570
*/
6671
public final class ProjectVersion implements Comparable<ProjectVersion>, Serializable {
@@ -239,6 +244,8 @@ public String getBuildNumber() {
239244
* Obtains the type of the build represented by this version.
240245
*
241246
* @return Build type
247+
* @see #isReleaseBuild()
248+
* @see #isSnapshotBuild()
242249
*/
243250
public BuildType getBuildType() {
244251
return this.buildType;
@@ -248,6 +255,8 @@ public BuildType getBuildType() {
248255
* Indicates whether this version represents a release build.
249256
*
250257
* @return {@code true} if this version represents a release build.
258+
* @see #getBuildType()
259+
* @see #isSnapshotBuild()
251260
*/
252261
public boolean isReleaseBuild() {
253262
return this.buildType == BuildType.release;
@@ -257,19 +266,34 @@ public boolean isReleaseBuild() {
257266
* Indicates whether this version represents a snapshot build.
258267
*
259268
* @return {@code true} if this version represents a snapshot build.
269+
* @see #getBuildType()
270+
* @see #isReleaseBuild()
260271
*/
261272
public boolean isSnapshotBuild() {
262273
return this.buildType == BuildType.snapshot;
263274
}
264275

265276
/**
266277
* Indicates whether the version represents a build taking place on a developer's machine.
278+
* This method is the inverse of {@link #isCIBuild()}.
267279
*
268280
* @return {@code true} if the build is taking place on a developer's machine.
281+
* @see #isCIBuild()
269282
*/
270283
public static boolean isDeveloperBuild() {
271284
final String cthingCI = System.getenv("CTHING_CI");
272-
return cthingCI == null || cthingCI.isBlank();
285+
return cthingCI == null || !"true".equals(cthingCI.toLowerCase(Locale.ENGLISH));
286+
}
287+
288+
/**
289+
* Indicates whether the version represents a build taking place on the Continuous Integration (CI) system.
290+
* This method is the inverse of {@link #isDeveloperBuild()}.
291+
*
292+
* @return {@code true} if the build is taking place on the CI system.
293+
* @see #isDeveloperBuild()
294+
*/
295+
public static boolean isCIBuild() {
296+
return !isDeveloperBuild();
273297
}
274298

275299
/**

src/test/java/org/cthing/projectversion/ProjectVersionTest.java

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public void testSnapshotDeveloperVersion() throws Exception {
3434
final ProjectVersion version = new ProjectVersion("1.2.3", BuildType.snapshot);
3535

3636
assertThat(ProjectVersion.isDeveloperBuild()).isTrue();
37+
assertThat(ProjectVersion.isCIBuild()).isFalse();
3738
assertThat(version.getMajorVersion()).isEqualTo(1);
3839
assertThat(version.getMinorVersion()).isEqualTo(2);
3940
assertThat(version.getPatchVersion()).isEqualTo(3);
@@ -56,6 +57,30 @@ public void testSnapshotDeveloperVersion() throws Exception {
5657
final ProjectVersion version = new ProjectVersion("1.2.3", BuildType.snapshot);
5758

5859
assertThat(ProjectVersion.isDeveloperBuild()).isTrue();
60+
assertThat(ProjectVersion.isCIBuild()).isFalse();
61+
assertThat(version.getMajorVersion()).isEqualTo(1);
62+
assertThat(version.getMinorVersion()).isEqualTo(2);
63+
assertThat(version.getPatchVersion()).isEqualTo(3);
64+
assertThat(version.getSemanticVersion()).isEqualTo("1.2.3-0");
65+
assertThat(version.getCoreVersion()).isEqualTo("1.2.3");
66+
assertThat(version.getBuildNumber()).isEqualTo("0");
67+
assertThat(version.getBuildType()).isEqualTo(BuildType.snapshot);
68+
assertThat(version.isReleaseBuild()).isFalse();
69+
assertThat(version.isSnapshotBuild()).isTrue();
70+
assertThat(version.getBuildDate()).matches("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$");
71+
assertThat(version.getBuildDateMillis()).isGreaterThan(0L);
72+
assertThat(version.getBranch()).isEqualTo("unknown");
73+
assertThat(version.getCommit()).isEqualTo("unknown");
74+
assertThat(version.toString()).isEqualTo("1.2.3-0");
75+
});
76+
withEnvironmentVariable("CTHING_CI", "false")
77+
.and("GIT_BRANCH", "")
78+
.and("GIT_COMMIT", " ")
79+
.execute(() -> {
80+
final ProjectVersion version = new ProjectVersion("1.2.3", BuildType.snapshot);
81+
82+
assertThat(ProjectVersion.isDeveloperBuild()).isTrue();
83+
assertThat(ProjectVersion.isCIBuild()).isFalse();
5984
assertThat(version.getMajorVersion()).isEqualTo(1);
6085
assertThat(version.getMinorVersion()).isEqualTo(2);
6186
assertThat(version.getPatchVersion()).isEqualTo(3);
@@ -82,6 +107,30 @@ public void testSnapshotCIVersion() throws Exception {
82107
final ProjectVersion version = new ProjectVersion("1.2.3", BuildType.snapshot);
83108

84109
assertThat(ProjectVersion.isDeveloperBuild()).isFalse();
110+
assertThat(ProjectVersion.isCIBuild()).isTrue();
111+
assertThat(version.getMajorVersion()).isEqualTo(1);
112+
assertThat(version.getMinorVersion()).isEqualTo(2);
113+
assertThat(version.getPatchVersion()).isEqualTo(3);
114+
assertThat(version.getSemanticVersion()).matches("1\\.2\\.3-\\d{2,}");
115+
assertThat(version.getCoreVersion()).isEqualTo("1.2.3");
116+
assertThat(version.getBuildNumber()).isNotEqualTo("0");
117+
assertThat(version.getBuildType()).isEqualTo(BuildType.snapshot);
118+
assertThat(version.isReleaseBuild()).isFalse();
119+
assertThat(version.isSnapshotBuild()).isTrue();
120+
assertThat(version.getBuildDate()).matches("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$");
121+
assertThat(version.getBuildDateMillis()).isGreaterThan(0L);
122+
assertThat(version.getBranch()).isEqualTo("master");
123+
assertThat(version.getCommit()).isEqualTo("a5b7f46");
124+
assertThat(version.toString()).matches("1\\.2\\.3-\\d{2,}");
125+
});
126+
withEnvironmentVariable("CTHING_CI", "TRUE")
127+
.and("GIT_BRANCH", "master")
128+
.and("GIT_COMMIT", "a5b7f46")
129+
.execute(() -> {
130+
final ProjectVersion version = new ProjectVersion("1.2.3", BuildType.snapshot);
131+
132+
assertThat(ProjectVersion.isDeveloperBuild()).isFalse();
133+
assertThat(ProjectVersion.isCIBuild()).isTrue();
85134
assertThat(version.getMajorVersion()).isEqualTo(1);
86135
assertThat(version.getMinorVersion()).isEqualTo(2);
87136
assertThat(version.getPatchVersion()).isEqualTo(3);
@@ -108,6 +157,7 @@ public void testReleaseDeveloperVersion() throws Exception {
108157
final ProjectVersion version = new ProjectVersion("1.2.3", BuildType.release);
109158

110159
assertThat(ProjectVersion.isDeveloperBuild()).isTrue();
160+
assertThat(ProjectVersion.isCIBuild()).isFalse();
111161
assertThat(version.getMajorVersion()).isEqualTo(1);
112162
assertThat(version.getMinorVersion()).isEqualTo(2);
113163
assertThat(version.getPatchVersion()).isEqualTo(3);
@@ -134,6 +184,7 @@ public void testReleaseCIVersion() throws Exception {
134184
final ProjectVersion version = new ProjectVersion("1.2.3", BuildType.release);
135185

136186
assertThat(ProjectVersion.isDeveloperBuild()).isFalse();
187+
assertThat(ProjectVersion.isCIBuild()).isTrue();
137188
assertThat(version.getMajorVersion()).isEqualTo(1);
138189
assertThat(version.getMinorVersion()).isEqualTo(2);
139190
assertThat(version.getPatchVersion()).isEqualTo(3);
@@ -200,7 +251,7 @@ public void testSerialize() throws Exception {
200251

201252
@Test
202253
public void testOrder() throws Exception {
203-
withEnvironmentVariable("CTHING_CI", "true")
254+
withEnvironmentVariable("CTHING_CI", "True")
204255
.and("GIT_BRANCH", "master")
205256
.and("GIT_COMMIT", "a5b7f46")
206257
.execute(() -> {

0 commit comments

Comments
 (0)