Skip to content

Commit

Permalink
Get branch name from env var (#74)
Browse files Browse the repository at this point in the history
  • Loading branch information
alextu committed Jul 26, 2022
1 parent 1035b44 commit c4b8632
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 51 deletions.
10 changes: 10 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
id 'java-gradle-plugin'
id 'groovy'
id 'maven-publish'
id 'signing'
id 'com.gradle.plugin-publish' version '1.0.0'
Expand All @@ -16,6 +17,8 @@ repositories {

dependencies {
compileOnly 'com.gradle:gradle-enterprise-gradle-plugin:3.10.3'
testImplementation platform("org.spockframework:spock-bom:2.1-groovy-3.0")
testImplementation "org.spockframework:spock-core"
}

wrapperUpgrade {
Expand All @@ -32,6 +35,13 @@ java {
}
}

test {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
}
}

gradlePlugin {
automatedPublishing = true

Expand Down
77 changes: 28 additions & 49 deletions src/main/java/com/gradle/CustomBuildScanEnhancements.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,12 @@
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

import static com.gradle.Utils.appendIfMissing;
import static com.gradle.Utils.execAndCheckSuccess;
import static com.gradle.Utils.execAndGetStdOut;
import static com.gradle.Utils.isNotEmpty;
import static com.gradle.Utils.redactUserInfo;
import static com.gradle.Utils.urlEncode;

Expand Down Expand Up @@ -216,7 +213,7 @@ private void captureCiMetadata() {
customValueSearchLinker.addCustomValueAndSearchLink("CI stage", value));
}

if(isAzurePipelines()) {
if (isAzurePipelines()) {
Optional<String> azureServerUrl = envVariable("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI");
Optional<String> azureProject = envVariable("SYSTEM_TEAMPROJECT");
Optional<String> buildId = envVariable("BUILD_BUILDID");
Expand Down Expand Up @@ -302,44 +299,35 @@ private CaptureGitMetadataAction(ProviderFactory providers, CustomValueSearchLin

@Override
public void execute(BuildScanExtension buildScan) {
if (!isGitInstalled()) {
return;
}

String gitRepo = execAndGetStdOut("git", "config", "--get", "remote.origin.url");
String gitCommitId = execAndGetStdOut("git", "rev-parse", "--verify", "HEAD");
String gitCommitShortId = execAndGetStdOut("git", "rev-parse", "--short=8", "--verify", "HEAD");
String gitBranchName = getGitBranchName(() -> execAndGetStdOut("git", "rev-parse", "--abbrev-ref", "HEAD"));
String gitStatus = execAndGetStdOut("git", "status", "--porcelain");

if (isNotEmpty(gitRepo)) {
buildScan.value("Git repository", redactUserInfo(gitRepo));
}
if (isNotEmpty(gitCommitId)) {
buildScan.value("Git commit id", gitCommitId);
}
if (isNotEmpty(gitCommitShortId)) {
customValueSearchLinker.addCustomValueAndSearchLink("Git commit id", "Git commit id short", gitCommitShortId);
}
if (isNotEmpty(gitBranchName)) {
buildScan.tag(gitBranchName);
buildScan.value("Git branch", gitBranchName);
}
if (isNotEmpty(gitStatus)) {
GitMetadataResolver gitMetadataResolver = new GitMetadataResolver(isGitInstalled());
Optional<String> gitRepo = gitMetadataResolver.resolve(() -> Utils.execAndGetStdOut("git", "config", "--get", "remote.origin.url"));
Optional<String> gitCommitId = gitMetadataResolver.resolve(() -> Utils.execAndGetStdOut("git", "rev-parse", "--verify", "HEAD"));
Optional<String> gitCommitShortId = gitMetadataResolver.resolve(() -> Utils.execAndGetStdOut("git", "rev-parse", "--short=8", "--verify", "HEAD"));
Optional<String> gitStatus = gitMetadataResolver.resolve(() -> Utils.execAndGetStdOut("git", "status", "--porcelain"));
Optional<String> gitBranchName = gitMetadataResolver.resolve(this::getGitBranchNameFromEnv, () -> Utils.execAndGetStdOut("git", "rev-parse", "--abbrev-ref", "HEAD"));

gitRepo.ifPresent(s -> buildScan.value("Git repository", redactUserInfo(s)));
gitCommitId.ifPresent(s -> buildScan.value("Git commit id", s));
gitCommitShortId.ifPresent(s -> customValueSearchLinker.addCustomValueAndSearchLink("Git commit id", "Git commit id short", s));
gitBranchName.ifPresent(s -> {
buildScan.tag(s);
buildScan.value("Git branch", s);
});
gitStatus.ifPresent(s -> {
buildScan.tag("Dirty");
buildScan.value("Git status", gitStatus);
}
buildScan.value("Git status", s);
});

if (isNotEmpty(gitRepo) && isNotEmpty(gitCommitId)) {
if (gitRepo.contains("github.com/") || gitRepo.contains("github.com:")) {
Matcher matcher = Pattern.compile("(.*)github\\.com[/|:](.*)").matcher(gitRepo);
if (gitRepo.isPresent() && gitCommitId.isPresent()) {
if (gitRepo.get().contains("github.com/") || gitRepo.get().contains("github.com:")) {
Matcher matcher = Pattern.compile("(.*)github\\.com[/|:](.*)").matcher(gitRepo.get());
if (matcher.matches()) {
String rawRepoPath = matcher.group(2);
String repoPath = rawRepoPath.endsWith(".git") ? rawRepoPath.substring(0, rawRepoPath.length() - 4) : rawRepoPath;
buildScan.link("Github source", "https://github.com/" + repoPath + "/tree/" + gitCommitId);
}
} else if (gitRepo.contains("gitlab.com/") || gitRepo.contains("gitlab.com:")) {
Matcher matcher = Pattern.compile("(.*)gitlab\\.com[/|:](.*)").matcher(gitRepo);
} else if (gitRepo.get().contains("gitlab.com/") || gitRepo.get().contains("gitlab.com:")) {
Matcher matcher = Pattern.compile("(.*)gitlab\\.com[/|:](.*)").matcher(gitRepo.get());
if (matcher.matches()) {
String rawRepoPath = matcher.group(2);
String repoPath = rawRepoPath.endsWith(".git") ? rawRepoPath.substring(0, rawRepoPath.length() - 4) : rawRepoPath;
Expand All @@ -353,24 +341,15 @@ private boolean isGitInstalled() {
return execAndCheckSuccess("git", "--version");
}

private String getGitBranchName(Supplier<String> gitCommand) {
private Optional<String> getGitBranchNameFromEnv() {
if (isJenkins() || isHudson()) {
Optional<String> branch = Utils.envVariable("BRANCH_NAME", providers);
if (branch.isPresent()) {
return branch.get();
}
return Utils.envVariable("BRANCH_NAME", providers);
} else if (isGitLab()) {
Optional<String> branch = Utils.envVariable("CI_COMMIT_REF_NAME", providers);
if (branch.isPresent()) {
return branch.get();
}
return Utils.envVariable("CI_COMMIT_REF_NAME", providers);
} else if (isAzurePipelines()) {
Optional<String> branch = Utils.envVariable("BUILD_SOURCEBRANCH", providers);
if (branch.isPresent()) {
return branch.get();
}
return Utils.envVariable("BUILD_SOURCEBRANCH", providers);
}
return gitCommand.get();
return Optional.empty();
}

private boolean isJenkins() {
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/com/gradle/GitMetadataResolver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.gradle;

import java.util.Optional;
import java.util.function.Supplier;

class GitMetadataResolver {
private final boolean isGitInstalled;

GitMetadataResolver(boolean isGitInstalled) {
this.isGitInstalled = isGitInstalled;
}

Optional<String> resolve(Supplier<Optional<String>> fromGit) {
return resolve(null, fromGit);
}

Optional<String> resolve(Supplier<Optional<String>> fromEnv, Supplier<Optional<String>> fromGit) {
Optional<String> resolved = Optional.empty();
if (fromEnv != null) {
resolved = fromEnv.get();
if (resolved.isPresent() && resolved.get().isEmpty()) {
resolved = Optional.empty();
}
}
if (isGitInstalled && fromGit != null && !resolved.isPresent()) {
resolved = fromGit.get();
}
return resolved;
}
}
4 changes: 2 additions & 2 deletions src/main/java/com/gradle/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ static boolean execAndCheckSuccess(String... args) {
}
}

static String execAndGetStdOut(String... args) {
static Optional<String> execAndGetStdOut(String... args) {
Runtime runtime = Runtime.getRuntime();
Process process;
try {
Expand All @@ -177,7 +177,7 @@ static String execAndGetStdOut(String... args) {
String ignore = readFully(error);

boolean finished = process.waitFor(10, TimeUnit.SECONDS);
return finished && process.exitValue() == 0 ? trimAtEnd(standardText) : null;
return finished && process.exitValue() == 0 ? Optional.of(trimAtEnd(standardText)) : Optional.empty();
}
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
Expand Down
30 changes: 30 additions & 0 deletions src/test/groovy/com/gradle/GitMetadataResolverTest.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.gradle

import spock.lang.Specification

class GitMetadataResolverTest extends Specification {
def "Resolve from #label"() {
given:
def resolver = new GitMetadataResolver(isGitInstalled)

when:
def resolved = fromEnv ? resolver.resolve(fromEnv, fromGit) : resolver.resolve(fromGit)

then:
resolved == expected

where:
label | isGitInstalled | fromGit | fromEnv | expected
'nothing' | true | null | null | Optional.empty()
'nothing too' | false | null | null | Optional.empty()
'git only' | true | (() -> Optional.of('fromGit')) | null | Optional.of('fromGit')
'git only no CLI' | false | (() -> Optional.of('whatever')) | null | Optional.empty()
'env only' | true | null | (() -> Optional.of('fromEnv')) | Optional.of('fromEnv')
'env, git' | true | (() -> Optional.of('fromGit')) | (() -> Optional.of('fromEnv')) | Optional.of('fromEnv')
'env, git, no CLI' | false | (() -> Optional.of('whatever')) | (() -> Optional.of('fromEnv')) | Optional.of('fromEnv')
'env empty, git' | true | (() -> Optional.of('fromGit')) | (() -> Optional.empty()) | Optional.of('fromGit')
'env empty, git, no CLI' | false | (() -> Optional.of('whatever')) | (() -> Optional.empty()) | Optional.empty()
'env blank, git' | true | (() -> Optional.of('fromGit')) | (() -> Optional.of('')) | Optional.of('fromGit')
'env blank, git, no CLI' | false | (() -> Optional.of('whatever')) | (() -> Optional.of('')) | Optional.empty()
}
}

0 comments on commit c4b8632

Please sign in to comment.