import org.gradle.api.provider.ValueSourceParameters import javax.inject.Inject // Must wrap this in a ValueSource in order to get well-defined fail behavior without confusing Gradle on repeat builds. abstract class GitShaValueSource implements ValueSource { @Inject abstract ExecOperations getExecOperations() @Override String obtain() { try { def output = new ByteArrayOutputStream() execOperations.exec { it.commandLine 'git', 'rev-parse', '--short=8', 'HEAD' it.standardOutput = output } return output.toString().trim() } catch (GradleException ignore) { // Git executable unavailable, or we are not building in a git repo. Fall through: } return "unknown" } } // Export closure ext.getGitSha = { providers.of(GitShaValueSource) {}.get() }