Git Product home page Git Product logo

common-custom-user-data-gradle-plugin's Introduction

This repository is maintained by the Develocity Solutions team, as one of several publicly available repositories:

Common Custom User Data Gradle Plugin

Verify Build Plugin Portal Revved up by Develocity

The Common Custom User Data Gradle plugin for Develocity enhances published build scans by adding a set of tags, links and custom values that have proven to be useful for many projects building with Develocity.

You can leverage this plugin for your project in one of two ways:

  1. Apply the published plugin directly in your build and immediately benefit from enhanced build scans
  2. Copy this repository and develop a customized version of the plugin to standardize Develocity usage across multiple projects

Applying the published plugin

The Common Custom User Data Gradle plugin is available in the Gradle Plugin Portal. This plugin requires the Develocity Gradle plugin to also be applied in your build in order to have an effect.

In order for the Common Custom User Gradle plugin to become active, you need to register it in the settings.gradle(.kts) file of your project. The settings.gradle(.kts) file is the same file where you have already declared the Develocity Gradle plugin.

See here for an example.

Version compatibility

This table details the version compatibility of the Common Custom User Data Gradle plugin with the Develocity Gradle plugin.

Common Custom User Data Gradle plugin versions Develocity Gradle plugin versions Gradle version
1.0+ 3.0+ 5.0+
1.7+ 1.8+ 4.0+

Captured data

The additional tags, links and custom values captured by this plugin include:

  • A tag representing the operating system
  • A tag representing how the build was invoked, be that from your IDE (IDEA, Eclipse, Android Studio) or from the command-line
  • A tag representing builds run on CI, together with a set of tags, links and custom values specific to the CI server running the build
  • For Git repositories, information on the commit id, branch name, status, and whether the checkout is dirty or not

See CustomBuildScanEnhancements.java for details on what data is captured and under which conditions.

Configuration overrides

This plugin also allows overriding various Develocity related settings via system properties and environment variables:

  • Develocity general configuration
  • Remote build cache configuration
  • Local build cache configuration

See Overrides.java for the override behavior.

You can use the system properties and environment variables to override Develocity related settings temporarily without having to modify the build scripts. For example, to disable the local build cache when running a build:

./gradlew -Dgradle.cache.local.enabled=false build
Click to see the complete set of available system properties and environment variables in the table below.

Develocity settings

Develocity API System property Environment variable
develocity.server develocity.url DEVELOCITY_URL
develocity.allowUntrustedServer develocity.allowUntrustedServer DEVELOCITY_ALLOWUNTRUSTEDSERVER

Local Build Cache settings

Local Build Cache API System property Environment variable
buildCache.local.setEnabled gradle.cache.local.enabled GRADLE_CACHE_LOCAL_ENABLED
buildCache.local.setPush gradle.cache.local.push GRADLE_CACHE_LOCAL_PUSH
buildCache.local.setDirectory gradle.cache.local.directory GRADLE_CACHE_LOCAL_DIRECTORY
buildCache.local.setRemoveUnusedEntriesAfterDays gradle.cache.local.removeUnusedEntriesAfterDays GRADLE_CACHE_LOCAL_REMOVEUNUSEDENTRIESAFTERDAYS

HTTP Build Cache settings

HTTP Build Cache API System property Environment variable
buildCache.remote.setEnabled gradle.cache.remote.enabled GRADLE_CACHE_REMOTE_ENABLED
buildCache.remote.setPush gradle.cache.remote.push GRADLE_CACHE_REMOTE_PUSH
buildCache.remote.setAllowUntrustedServer gradle.cache.remote.allowUntrustedServer GRADLE_CACHE_REMOTE_ALLOWUNTRUSTEDSERVER
buildCache.remote.setAllowInsecureProtocol gradle.cache.remote.allowInsecureProtocol GRADLE_CACHE_REMOTE_ALLOWINSECUREPROTOCOL
buildCache.remote.setUrl gradle.cache.remote.url GRADLE_CACHE_REMOTE_URL

Develocity Build Cache settings

Develocity Build Cache API System property Environment variable
buildCache.remote.setEnabled gradle.cache.remote.enabled GRADLE_CACHE_REMOTE_ENABLED
buildCache.remote.setPush gradle.cache.remote.push GRADLE_CACHE_REMOTE_PUSH
buildCache.remote.setAllowUntrustedServer gradle.cache.remote.allowUntrustedServer GRADLE_CACHE_REMOTE_ALLOWUNTRUSTEDSERVER
buildCache.remote.setAllowInsecureProtocol gradle.cache.remote.setAllowInsecureProtocol GRADLE_CACHE_REMOTE_ALLOWINSECUREPROTOCOL
buildCache.remote.setServer gradle.cache.remote.server GRADLE_CACHE_REMOTE_SERVER
buildCache.remote.setPath gradle.cache.remote.path GRADLE_CACHE_REMOTE_PATH

Developing a customized version of the plugin

For more flexibility, we recommend creating a copy of this repository so that you may develop a customized version of the plugin and publish it internally for your projects to consume.

This approach has a number of benefits:

  • Tailor the build scan enhancements to exactly the set of tags, links and custom values you require
  • Standardize the configuration for connecting to Develocity and the remote build cache in your organization, removing the need for each project to specify this configuration

If your customized plugin provides all required Develocity configuration, then a consumer project will get all the benefits of Develocity simply by applying the plugin. The project sources provide a good template to get started with your own plugin.

Refer to the Javadoc for more details on the key types available for use.

See the Gradle User Manual for more details on publishing Gradle plugins to an internal repository.

Changelog

Refer to the release history to see detailed changes on the versions.

Learn more

Visit our website to learn more about Develocity.

License

The Develocity Common Custom User Data Gradle plugin is open-source software released under the Apache 2.0 License.

common-custom-user-data-gradle-plugin's People

Contributors

3flex avatar alextu avatar bigdaz avatar bot-githubaction avatar britter avatar cdsap avatar clayburn avatar dependabot[bot] avatar erichaagdev avatar etiennestuder avatar facewindu avatar ghale avatar github-actions[bot] avatar jprinet avatar jthurne avatar kyhule avatar marcphilipp avatar pshevche avatar ribafish avatar runningcode avatar thedancercodes avatar tylerbertrand avatar zacsweers avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

common-custom-user-data-gradle-plugin's Issues

IDE sync from IntelliJ IDEA incorrectly tagged as Android Studio

Build Scans are incorrectly tagged as coming from Android Studio when running an IDE sync from IntelliJ IDEA.

See the following build scan run from IntelliJ IDEA as an example: https://scans.gradle.com/s/eh22ik7skmtge

I verified running a task from IntelliJ IDEA is tagged correctly: https://scans.gradle.com/s/5clegna2kwvfi

Additional information:

  • Using com.gradle.common-custom-user-data-gradle-plugin version 1.8.1
  • Using com.gradle.enterprise version 3.11.1
  • Using IntelliJ IDEA 2022.2.2 (Ultimate Edition)

Feature Request: Capture the "agent" that triggers the build as the user

Would be nice if they user name in gradle enterprise was the person that triggered the build.

Looks like gradle enterprise reads it from "user.name", so you could set that property.
Else would be nice if gradle enterprise provided a dsl to set it.

Either way, this plugin could set the user name on various CI systems:

for GH actions:

providers.environmentVariable("GITHUB_ACTOR").orNull?.let { System.setProperty("user.name", it) }

for Jenkins: (with https://plugins.jenkins.io/build-user-vars-plugin/)

providers.environmentVariable("BUILD_USER_ID").orNull?.let { System.setProperty("user.name", it) }

Support Config Cache in Gradle 7.5+

In 7.5+ we need to use a providers to exec code

Config Cache is broken with the following message:
org.gradle.api.InvalidUserCodeException: Starting an external process 'git status --porcelain' during configuration time is unsupported.

To fix can change to something like:

providers
        .exec { it.commandLine("git", "rev-parse", "--abbrev-ref HEAD") }.standardOutput.asText

This plugin is not configuration cache compatible starting with Gradle 7.5

This plugin is not configuration cache compatible starting with Gradle 7.5.

When we upgraded androidx project to 7.5 nightly, our builds started failing due to this plugin calling external processes and that breaking configuration

https://ge.androidx.dev/s/zd2jedmewi6pm/console-log#L566

org.gradle.api.InvalidUserCodeException: Starting an external process 'git --version' during configuration time is unsupported.
	at org.gradle.configurationcache.initialization.DefaultConfigurationCacheProblemsListener.onExternalProcessStarted(ConfigurationCacheProblemsListener.kt:78)
	at org.gradle.configurationcache.InstrumentedInputAccessListener.externalProcessStarted(InstrumentedInputAccessListener.kt:110)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:389)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:393)
	at org.gradle.internal.classpath.Instrumented.exec(Instrumented.java:258)
	at com.gradle.Utils.execAndCheckSuccess(Utils.java:153)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.isGitInstalled(CustomBuildScanEnhancements.java:330)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:282)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:270)
	at com.gradle.enterprise.gradleplugin.internal.extension.b$4.run(SourceFile:185)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

org.gradle.api.InvalidUserCodeException: Starting an external process 'git config --get remote.origin.url' during configuration time is unsupported.
	at org.gradle.configurationcache.initialization.DefaultConfigurationCacheProblemsListener.onExternalProcessStarted(ConfigurationCacheProblemsListener.kt:78)
	at org.gradle.configurationcache.InstrumentedInputAccessListener.externalProcessStarted(InstrumentedInputAccessListener.kt:110)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:389)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:393)
	at org.gradle.internal.classpath.Instrumented.exec(Instrumented.java:258)
	at com.gradle.Utils.execAndGetStdOut(Utils.java:169)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:286)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:270)
	at com.gradle.enterprise.gradleplugin.internal.extension.b$4.run(SourceFile:185)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
org.gradle.api.InvalidUserCodeException: Starting an external process 'git rev-parse --abbrev-ref HEAD' during configuration time is unsupported.
	at org.gradle.configurationcache.initialization.DefaultConfigurationCacheProblemsListener.onExternalProcessStarted(ConfigurationCacheProblemsListener.kt:78)
	at org.gradle.configurationcache.InstrumentedInputAccessListener.externalProcessStarted(InstrumentedInputAccessListener.kt:110)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:389)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:393)
	at org.gradle.internal.classpath.Instrumented.exec(Instrumented.java:258)
	at com.gradle.Utils.execAndGetStdOut(Utils.java:169)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.lambda$execute$0(CustomBuildScanEnhancements.java:289)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.getGitBranchName(CustomBuildScanEnhancements.java:340)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:289)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:270)
	at com.gradle.enterprise.gradleplugin.internal.extension.b$4.run(SourceFile:185)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

org.gradle.api.InvalidUserCodeException: Starting an external process 'git rev-parse --short=8 --verify HEAD' during configuration time is unsupported.
	at org.gradle.configurationcache.initialization.DefaultConfigurationCacheProblemsListener.onExternalProcessStarted(ConfigurationCacheProblemsListener.kt:78)
	at org.gradle.configurationcache.InstrumentedInputAccessListener.externalProcessStarted(InstrumentedInputAccessListener.kt:110)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:389)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:393)
	at org.gradle.internal.classpath.Instrumented.exec(Instrumented.java:258)
	at com.gradle.Utils.execAndGetStdOut(Utils.java:169)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:288)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:270)
	at com.gradle.enterprise.gradleplugin.internal.extension.b$4.run(SourceFile:185)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

org.gradle.api.InvalidUserCodeException: Starting an external process 'git rev-parse --verify HEAD' during configuration time is unsupported.
	at org.gradle.configurationcache.initialization.DefaultConfigurationCacheProblemsListener.onExternalProcessStarted(ConfigurationCacheProblemsListener.kt:78)
	at org.gradle.configurationcache.InstrumentedInputAccessListener.externalProcessStarted(InstrumentedInputAccessListener.kt:110)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:389)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:393)
	at org.gradle.internal.classpath.Instrumented.exec(Instrumented.java:258)
	at com.gradle.Utils.execAndGetStdOut(Utils.java:169)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:287)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:270)
	at com.gradle.enterprise.gradleplugin.internal.extension.b$4.run(SourceFile:185)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

org.gradle.api.InvalidUserCodeException: Starting an external process 'git status --porcelain' during configuration time is unsupported.
	at org.gradle.configurationcache.initialization.DefaultConfigurationCacheProblemsListener.onExternalProcessStarted(ConfigurationCacheProblemsListener.kt:78)
	at org.gradle.configurationcache.InstrumentedInputAccessListener.externalProcessStarted(InstrumentedInputAccessListener.kt:110)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:389)
	at org.gradle.internal.classpath.Instrumented.externalProcessStarted(Instrumented.java:393)
	at org.gradle.internal.classpath.Instrumented.exec(Instrumented.java:258)
	at com.gradle.Utils.execAndGetStdOut(Utils.java:169)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:290)
	at com.gradle.CustomBuildScanEnhancements$CaptureGitMetadataAction.execute(CustomBuildScanEnhancements.java:270)
	at com.gradle.enterprise.gradleplugin.internal.extension.b$4.run(SourceFile:185)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

Calling buildFinished when build is finished is too late

When asynchronously invoking code via buildScan.background, it can happen that this background task finishes after the build has finished. The GE plugin will correctly wait for the background task to finish. The problem in the CCUD plugin is that, currently, the background task invoked from captureGitMetadata will add a custom link via buildFinished call - which is too late when the end of the build has already been reached since the GE plugin will no longer allow to add more buildFinished listeners once the build has finished. This can be observed when a warning is printed by the GE plugin at the ened of the build. As explained, this does not happen everytime but under certain conditions.

It seems to me that we should go with the approach we had before: having a list and adding the actions there (in a thread-safe way) and executing them by a single buildFinished listener. Of course we need to be cautious and avoid an infinite loop where an action adds another action.

Fix Build Scan links when running on GitHub Enterprise Server

It is possible to use the GitHub actions with GitHub Enterprise Server. This means that any reference to github.com in Build Scan links will be incorrect. For example:

buildScan.link("GitHub Actions build", "https://github.com/" + gitHubRepository.get() + "/actions/runs/" + gitHubRunId.get());

Instead of hardcoding github.com we should key off of the GITHUB_SERVER_URL environment variable. According to the documentation, this environment variable is available on Enterprise Server, Enterprise Cloud, and Free.

This aligns with the GitHub documentation as well:

If you need to use a workflow run's URL from within a job, you can combine these environment variables: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID

Document in the README how to apply this plugin

I had to browse the build.gradle file to discover the plugin ID, which I later applied in my settings.gradle.kts this way:

plugins {
    id("com.gradle.common-custom-user-data-gradle-plugin") version "1.7.2"
}

Better document it in the README like similar projects.

GitLab source link may be invalid

We've seen build scans generated with invalid links to 'GitLab source'.

Root cause seems to be invalid handling pattern matching for URLs with embedded auth details in the toWebRepoUri method in Utils.java.

In particular.. if the git origin contains embedded user info, and the user name contains 'gitlab', then the groups in GIT_REPO_URI_PATTERN capture the wrong bits of the URL.

e.g. given an origin of https://gitlab-svc-user:[email protected]/foo/bar.git, the generated 'GitLab source' link points to https://gitlab-svc-user/[email protected]/foo/bar

User can read release notes in the plugin portal

We should use the description field of the plugin declaration to specify release notes. Currently, it is always a static string.

The description field is shown on the plugin portal for each published version. Setting the description field to release notes means they can be seen directly in the plugin portal, rather than only on GitHub. This makes release notes and changes much more discoverable for users wanting to update.

An example of this can be seen on the plugin portal page for com.gradle.plugin-publish: https://plugins.gradle.org/plugin/com.gradle.plugin-publish

Make `maxParallelForks` custom value logging optional

For builds with hundreds of modules (i.e. projects), each with tests, this maxParallelForks logging if very noisy.

It adds a custom value to the build scan for EVERY test task.

buildScan.value(test.getIdentityPath() + "#maxParallelForks", String.valueOf(test.getMaxParallelForks()));

Would be great is this was removed or made optional/configurable.

add BRANCH_NAME even if git is missing

We are using the k8s plugin in Jenkins which runs gradle in a docker container that doesn't have git installed. This means that the BRANCH name is no longer added as a tag. It would be good if this was fixed so that even if git is not installed the BRANCH_NAME env variable is still added as a tag.

Index out of bounds in buildFinished action

Since introducing this plugin to our build, we keep seeing this warning printed at the end of builds on CI, but aren't able to get a trace from gradle or indication of where it's coming from. Let me know what I can do to help debug.

WARNING: Error invoking build scan buildFinished action
	Index -1 out of bounds for length 18

Possible naming collision with sysprop `gradle.cache.remote.url`

As of v1.9, the presence of systemProp.gradle.cache.remote.url=https://us-build-cache.gradle.org/cache/ in ~/.gradle/gradle.properties causes this failure:

FAILURE: Build failed with an exception.

* What went wrong:
The Gradle Enterprise server address 'https://us-build-cache.gradle.org/cache/' value should not contain a path component

* Try:
> Run with --debug option to get more log output.

* Exception is:
java.lang.IllegalArgumentException: The Gradle Enterprise server address 'https://us-build-cache.gradle.org/cache/' value should not contain a path component
        at com.gradle.scan.agent.a.b.c.a(SourceFile:63)
        at com.gradle.scan.agent.a.b.c.a(SourceFile:54)
        at com.gradle.enterprise.gradleplugin.GradleEnterpriseBuildCache.setServer(SourceFile:82)
        at com.gradle.enterprise.gradleplugin.internal.a.b_Decorated.setServer(Unknown Source)
        at com.gradle.Overrides.lambda$configureBuildCache$6(Overrides.java:76)
        at org.gradle.caching.configuration.internal.DefaultBuildCacheConfiguration.remote(DefaultBuildCacheConfiguration.java:101)
        at com.gradle.Overrides.configureBuildCache(Overrides.java:75)
        at com.gradle.CommonCustomUserDataGradlePlugin.lambda$applySettingsPlugin$0(CommonCustomUserDataGradlePlugin.java:76)
...

Steps to reproduce:

  1. $ git pull # HEAD is 77367a034f3330d6c7ade7094b51c8fdc2158961
  2. $ ./gradlew clean -is # results in error

To workaround, apply this patch:

diff --git a/settings.gradle b/settings.gradle
index fe344f0..f31e331 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,6 +1,6 @@
 plugins {
     id 'com.gradle.enterprise' version '3.12.4'
-    id 'com.gradle.common-custom-user-data-gradle-plugin' version '1.9'
+    id 'com.gradle.common-custom-user-data-gradle-plugin' version '1.8'
 }
 
 def isCI = System.getenv('GITHUB_ACTIONS') != null

Build fails when applying custom user data gradle plugin and gradle enterprise init script

I recently created an init.gradle.kts in my user home .gradle directory that applies the gradle enterprise plugin to all projects built on my machine but when I have com.gradle.common-custom-user-data-gradle-pluginapplied in a project, the build fails with the following error:

An exception occurred applying plugin request [id: 'com.gradle.common-custom-user-data-gradle-plugin', version: '1.4.2']
> Failed to apply plugin 'com.gradle.common-custom-user-data-gradle-plugin'.
   > Extension of type 'GradleEnterpriseExtension' does not exist. Currently registered extension types: [ExtraPropertiesExtension, GradleEnterpriseExtension]

I am using Gradle 7.3 and the init script I used is basically copy and pasted from here (though I made sure to change the version to 3.6.3) and my settings.gradle.kts is:

plugins {
    id("com.gradle.enterprise") version "3.6.3"
    id("com.gradle.common-custom-user-data-gradle-plugin") version "1.4.2"
}

Git Branch Tag is meaningless in GitLab CI

GitLab runners run git in a detached head so whenever the plugin attempts to retrieve the branch in CI it will always return 'head'. This makes developers unable to filter through branches from CI build scans.

I forked the plugin and added the fix.

I was wondering if you guys wanted me to make a PR for this feature, let me know, thanks!

Migrate build logic to Kotlin DSL

As Gradle went Kotlin DSL first this year, which should migrate all our plugins to Kotlin DSL and use it in the samples too.

This plugin seems to be relatively easily convertible.

Busts Configuration Cache

Trying to enable configuration cache, but it tracks every env value which change regularly

Can we disable/enable different system properties that we actually care about vs trying to capture everything?

projectProperty should support more than Strings

We have a projectProperty that is a boolean and we hit this error an NPE at at com.gradle.Utils.projectProperty(Utils.java:37)

an easy fix is to add:

        if (property instanceof Boolean) {
            Boolean value = (Boolean) gradle.getRootProject().findProperty(name);
            if (value == null) {
                return Optional.empty();
            } else {
                return Optional.of(Boolean.toString(value));
            }
        }

but it would be nice if Utils supported wildcards. Please let me know if you will accept a PR for this.

Add a custom value "os.arch" of System.getProperty("os.arch")

Add a custom value "os.arch" of System.getProperty("os.arch")

Something like:

        buildScan.value("os.arch", providers.systemProperty("os.arch").get())

This will help compare build times from Intel machines, compared to ARM based machines.
Also, will help see if certain failures are more common on one or the other.

Add tag for builds which runs with debugger

Problem:

When developers run Gradle tasks with debugger, then build time is misrepresented (as it shows how long developers spend debugging).

Example:

User runs tests with debugger ON and spends 5 minutes.

gradle :app:tDUT --debug-jvm

Gradle Enterprise logs 5min build time for test task. This sometimes skews our build time averages when someone does heavy debugging for a day.

I would say it would be a useful GE tag for everyone. But if it doesn't make sense for you, could you give some hint how I could detect this --debug-jvm and register it in our config without breaking config cache?

gradleEnterprise {
    buildScan {
        tag(<??>)
    }
}

Plugin fails with Gradle project isolation enabled

Run a project with -Dorg.gradle.unsafe.isolated-projects=true that applies common-custom-user-data-gradle-plugin

Expected

Success

Actual

Failure with:

org.gradle.api.InvalidUserCodeException: Cannot access project ':activity' from project ':'
	at org.gradle.configurationcache.ProblemReportingCrossProjectModelAccess$ProblemReportingProject.onAccess(ProblemReportingCrossProjectModelAccess.kt:994)
	at org.gradle.configurationcache.ProblemReportingCrossProjectModelAccess$ProblemReportingProject.getTasks(ProblemReportingCrossProjectModelAccess.kt:857)
	at org.gradle.configurationcache.ProblemReportingCrossProjectModelAccess$ProblemReportingProject.getTasks(ProblemReportingCrossProjectModelAccess.kt:131)
	at com.gradle.CustomBuildScanEnhancements.lambda$captureTestParallelization$34(CustomBuildScanEnhancements.java:397)
	at org.gradle.api.internal.DefaultMutationGuard$2.execute(DefaultMutationGuard.java:44)
	at org.gradle.internal.Actions.with(Actions.java:249)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator$1.run(BuildOperationCrossProjectConfigurator.java:69)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.lambda$runProjectConfigureAction$0(BuildOperationCrossProjectConfigurator.java:66)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:360)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$withProjectLock$2(DefaultProjectStateRegistry.java:408)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:270)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:408)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$fromMutableState$1(DefaultProjectStateRegistry.java:386)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:341)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:386)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:359)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.runProjectConfigureAction(BuildOperationCrossProjectConfigurator.java:66)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.access$100(BuildOperationCrossProjectConfigurator.java:32)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator$BlockConfigureBuildOperation.run(BuildOperationCrossProjectConfigurator.java:111)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.runBlockConfigureAction(BuildOperationCrossProjectConfigurator.java:62)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.allprojects(BuildOperationCrossProjectConfigurator.java:53)
	at org.gradle.api.internal.project.DefaultProject.allprojects(DefaultProject.java:701)
	at org.gradle.api.internal.project.DefaultProject.allprojects(DefaultProject.java:696)
	at org.gradle.invocation.DefaultGradle$2.execute(DefaultGradle.java:253)
	at org.gradle.invocation.DefaultGradle$2.execute(DefaultGradle.java:250)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:171)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:168)
	at org.gradle.internal.ImmutableActionSet$SetWithFewActions.execute(ImmutableActionSet.java:285)
	at org.gradle.internal.MutableActionSet.execute(MutableActionSet.java:38)
	at org.gradle.api.internal.DefaultMutationGuard$2.execute(DefaultMutationGuard.java:44)
	at org.gradle.internal.Actions.with(Actions.java:249)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator$1.run(BuildOperationCrossProjectConfigurator.java:69)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.lambda$runProjectConfigureAction$0(BuildOperationCrossProjectConfigurator.java:66)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:360)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$withProjectLock$2(DefaultProjectStateRegistry.java:408)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:270)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:408)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:389)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:359)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.runProjectConfigureAction(BuildOperationCrossProjectConfigurator.java:66)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.access$100(BuildOperationCrossProjectConfigurator.java:32)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator$BlockConfigureBuildOperation.run(BuildOperationCrossProjectConfigurator.java:111)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.runBlockConfigureAction(BuildOperationCrossProjectConfigurator.java:62)
	at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.rootProject(BuildOperationCrossProjectConfigurator.java:58)
	at org.gradle.invocation.DefaultGradle$1.projectsLoaded(DefaultGradle.java:106)
	at jdk.internal.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:61)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy27.projectsLoaded(Unknown Source)
	at org.gradle.initialization.NotifyingBuildLoader$3.run(NotifyingBuildLoader.java:74)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.initialization.NotifyingBuildLoader.load(NotifyingBuildLoader.java:71)
	at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:56)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
	at org.gradle.initialization.VintageBuildModelController.lambda$prepareProjects$3(VintageBuildModelController.java:89)
	at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:227)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:238)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:226)
	at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$10(StateTransitionController.java:201)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
	at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:197)
	at org.gradle.initialization.VintageBuildModelController.prepareProjects(VintageBuildModelController.java:89)
	at org.gradle.initialization.VintageBuildModelController.prepareToScheduleTasks(VintageBuildModelController.java:71)
	at org.gradle.configurationcache.ConfigurationCacheAwareBuildModelController.prepareToScheduleTasks(ConfigurationCacheAwareBuildModelController.kt:48)
	at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$prepareToScheduleTasks$2(DefaultBuildLifecycleController.java:134)
	at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:227)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:238)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:226)
	at org.gradle.internal.model.StateTransitionController.lambda$maybeTransition$9(StateTransitionController.java:187)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
	at org.gradle.internal.model.StateTransitionController.maybeTransition(StateTransitionController.java:183)
	at org.gradle.internal.build.DefaultBuildLifecycleController.prepareToScheduleTasks(DefaultBuildLifecycleController.java:132)
	at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.scheduleRequestedTasks(DefaultBuildTreeWorkPreparer.java:33)
	at org.gradle.configurationcache.ConfigurationCacheAwareBuildTreeWorkPreparer$scheduleRequestedTasks$1.invoke(ConfigurationCacheAwareBuildTreeWorkPreparer.kt:29)
	at org.gradle.configurationcache.ConfigurationCacheAwareBuildTreeWorkPreparer$scheduleRequestedTasks$1.invoke(ConfigurationCacheAwareBuildTreeWorkPreparer.kt:28)
	at org.gradle.configurationcache.DefaultConfigurationCache$loadOrScheduleRequestedTasks$1.invoke(DefaultConfigurationCache.kt:133)
	at org.gradle.configurationcache.DefaultConfigurationCache$loadOrScheduleRequestedTasks$1.invoke(DefaultConfigurationCache.kt:132)
	at org.gradle.configurationcache.DefaultConfigurationCache.runWorkThatContributesToCacheEntry(DefaultConfigurationCache.kt:276)
	at org.gradle.configurationcache.DefaultConfigurationCache.loadOrScheduleRequestedTasks(DefaultConfigurationCache.kt:132)
	at org.gradle.configurationcache.ConfigurationCacheAwareBuildTreeWorkPreparer.scheduleRequestedTasks(ConfigurationCacheAwareBuildTreeWorkPreparer.kt:28)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$doScheduleAndRunTasks$2(DefaultBuildTreeLifecycleController.java:89)
	at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewWorkGraph(DefaultIncludedBuildTaskGraph.java:75)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.doScheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:88)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:106)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:166)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:238)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$7(StateTransitionController.java:166)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
	at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:166)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:103)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:69)
	at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:69)
	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:119)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:128)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:270)
	at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:119)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:103)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
	at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)
	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:58)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

Specifically, this is gradle.allprojects usage for captureTestParallelization

PR branch custom value empty

PR branch custom value is empty if the Github Action workflow wasn't triggered on pull_request, but was triggered for example by push.

Original discussion in PR gradle/common-custom-user-data-sbt-plugin#20

Note: This is the documentation on GITHUB_HEAD_REF:

The head ref or source branch of the pull request in a workflow run. This property is only set when the event that triggers a workflow run is either pull_request or pull_request_target. For example, feature-branch-1.

Inconsistencies in Custom Values Reporting between Jenkins and GitHub Actions

Hi ๐Ÿ‘‹

We are currently migrating from Jenkins to GHA, and by comparing the scans produced by this plugin and we think it's not supporting correctly Github Actions.

We have observed some inconsistencies on its custom values as you can see below .
image

The main problems are :

  • Git branch is reported always as HEAD, when we'd expect to have the git branch name
  • The git commit on PRs is reporting the virtual merge commit instead of the HEAD commit of the PR (this also was happening on jenkins)
  • We don't see the PR number in any custom value.

Proposal Fixes :

Follow the same pattern applied in getGitBranchName function, and use CI environment variables to report git branch / commit / PR number / repository and fall back to the git command when it can't be read from it.

We'll only add the logic for GHA, but anyone else can support other CIs later.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.