diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 0000000..a25abde
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+# All files are owned by the maintainers
+* @eBayMobile/metrics-for-develocity-plugin-team
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..be84021
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,10 @@
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
+ - package-ecosystem: gradle
+ directory: "/"
+ schedule:
+ interval: "daily"
diff --git a/.github/issue_template.md b/.github/issue_template.md
new file mode 100644
index 0000000..3f775fa
--- /dev/null
+++ b/.github/issue_template.md
@@ -0,0 +1,10 @@
+### Describe the Issue
+
+
+### Expected Behavior
+
+
+### Actual Behavior
+
+
+### Steps to Reproduce the Behavior
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..42e5b8c
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,4 @@
+This PR relates to Issue #
+
+Changes proposed in this pull request:
+-
diff --git a/.github/workflows/precommit.yml b/.github/workflows/precommit.yml
new file mode 100644
index 0000000..b043187
--- /dev/null
+++ b/.github/workflows/precommit.yml
@@ -0,0 +1,15 @@
+name: PR Build
+on: [push]
+jobs:
+ gradle:
+ runs-on: ebaymobile
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-java@v3
+ with:
+ distribution: temurin
+ java-version: 17
+ - name: Setup Gradle
+ uses: gradle/gradle-build-action@v2
+ - name: Build Plugin
+ run: ./gradlew build
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9b5979b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+.DS_Store
+.gradle
+.kotlin
+build
+
+# Android Studio / IntelliJ
+/.idea/*
+!/.idea/codeStyles
+!/.idea/runConfigurations/
+*.iws
+*.iml
+/local.properties
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..85f8682
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,4 @@
+# Code of Conduct
+
+Contributors to this project are expected to adhere to the
+[eBay Code of Conduct](https://github.com/eBay/.github/blob/main/CODE_OF_CONDUCT.md)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..b5bc16d
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,58 @@
+# Contributing to the Metrics for Develocity Plugin
+
+First, thank you for considering contributing to this project!
+
+We welcome contributions and have provided a guide to help make this is as straightforward as
+possible.
+
+## Steps
+
+1. [Raise an Issue](#raise-an-issue)
+1. [Write code](#write-code)
+1. [Submit pull request](#submit-pull-request)
+
+## Raise an Issue
+
+Before starting development please look at the existing issues to ensure that your concern or
+improvement is not already being addressed. This is important to prevent conflicting work.
+
+If no issues already match your intentions raise an issue with sufficient detail as to what you
+intend to do. The issue can then become a place where discussion relating to the problem
+statement and intended approach can be had.
+
+This step is critical in ensuring that owners are aware of and can provide feedback on incoming
+changes.
+
+This helps eliminate duplicate work, conflicting work, or any other unintended consequences.
+
+## Write code
+
+All code should conform to the project's code style. This project follows the
+[Kotlin Coding Conventions](https://kotlinlang.org/docs/coding-conventions.html).
+
+All work intended for release should be committed against the `main` branch.
+
+Work will not be considered complete unless it is in a publishable, production-ready
+state. This restriction is in place to ensure that the library can be published when
+needed without delay.
+
+### Tests
+
+Every bug fix or change should be accompanied by corresponding tests. These tests are
+important both to protect the quality of the library as well as to demonstrate scenarios
+that the change impacts.
+
+## Submit pull request
+
+Submit a PR to merge the code into the `main` branch and assign to one or more
+owners for review.
+
+The PR should reference the issue being worked on and contain a description that is
+useful for understanding the implementation details.
+
+Once a PR is approved, it will likely be merged to `main`.
+
+If your change is time-sensitive, please indicate this fact in a comment on the
+PR. The project owners will do their best to publish a release containing your change
+as soon as possible.
+
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..65c537c
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2017 eBay, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..951ace4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,70 @@
+# Metrics for Develocity Plugin
+
+## Design Overview
+
+The data processing pipeline is split into two main elements:
+- Data gathering and aggregation
+- Data consumption / reporting
+
+### Data gathering tasks:
+
+The purpose of the data gathering tasks is to collect data from the Develocity API and
+aggregate it into summaries that can be used for reporting. The data for this stage must be
+defined such that it can be accumulated over time through a reduction operation, adding the
+results of one build to the results of the next, etc.. The data collected in this stage can
+be thought of as an intermediate format, not intended for direct consumption.
+
+Multiple summaries can be created as a result of this stage of processing. Summarizers are
+registered with the plugin and have the responsibility of processing the raw build data
+and producing the intermediate data format.
+
+Hourly tasks
+- Query the Develocity server for list of builds within the hour
+- For each configured summarizer:
+ - Process each build and produce a summary file
+ - reduces the summaries together, persisting them to disk by ID
+
+Daily tasks
+ - Depends upon the outputs of hourly tasks for the configured day
+ - For each configured summarizer:
+ - Loads the hourly summary files
+ - reduces the summaries together, persisting them to disk by ID
+
+Time window tasks (e.g., last 7 days)
+- Depends upon the outputs of hourly and/or daily tasks to satisfy the requested time window
+- For each configured summarizer:
+ - Loads the hourly summary files
+ - reduces the summaries together, persisting them to disk by ID
+
+### Data consumer/reporting tasks
+
+Data consumer / reporting tasks are configured to consume the aggregated data from the first
+stage of the pipeline and produce data or reports in their final form. These tasks are
+to be implemented as needed to satisfy the requirements of the project.
+
+## Operation
+
+### Obtain / Configure a Develocity Access Token
+
+- `./gradlew provisionDevelocityAccessKey` or `./gradlew provisionGradleEnterpriseAccessKey`
+
+## Reference:
+
+### Gradle Enterprise API
+
+API Manual: https://docs.gradle.com/enterprise/api-manual/
+API Documentation: https://docs.gradle.com/enterprise/api-manual/ref/2022.4.html
+
+### OpenAPI
+
+This project uses the OpenAPI 3.0 specification. Both iOS and Android are using the
+[OpenAPI generator](https://github.com/OpenAPITools/openapi-generator) to output models. On the Android side,
+we're using [OpenAPI Gradle Plugin](https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator-gradle-plugin) --
+which is described below.
+
+The current specification, as defined by Gradle Enterprise, can be found
+[here](https://docs.gradle.com/enterprise/api-manual/#reference_documentation).
+
+## License
+
+Apache 2.0 - See [LICENSE](LICENSE.txt) for more information.
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 0000000..6df0a02
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,66 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
+
+plugins {
+ `embedded-kotlin`
+ embeddedKotlin("plugin.serialization")
+ alias(libs.plugins.openapi.generator)
+ id("java-gradle-plugin")
+}
+
+group = "com.ebay.plugins"
+
+gradlePlugin {
+ plugins {
+ create("metricsForDevelocity") {
+ id = "com.ebay.metrics-for-develocity"
+ implementationClass = "com.ebay.plugins.metrics.develocity.DevelocityMetricsPlugin"
+ }
+ }
+}
+
+dependencies {
+ compileOnly(libs.gradle.develocity)
+
+ implementation(libs.kotlinx.serializationJson)
+ implementation(libs.ktor.client.auth)
+ implementation(libs.ktor.client.core)
+ implementation(libs.ktor.client.logging)
+ implementation(libs.ktor.client.okhttp)
+ implementation(libs.ktor.client.content.negotiation)
+ implementation(libs.ktor.serialization.kotlinxJson)
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+}
+
+project.tasks.withType(KotlinJvmCompile::class.java) {
+ compilerOptions {
+ allWarningsAsErrors.set(true)
+ freeCompilerArgs.addAll(listOf("-Xjvm-default=all", "-opt-in=kotlin.RequiresOptIn"))
+ jvmTarget.set(JvmTarget.JVM_11)
+ }
+}
+
+val openApiFile = "develocity-2024.1-api.yaml"
+openApiGenerate {
+ generatorName.set("kotlin")
+ generateModelDocumentation.set(false)
+ // The ignore file doesn't seem to work with the gradle plugin, so this is a way to only get it to generate models.
+ modelFilesConstrainedTo.set(listOf(""))
+ modelPackage.set("com.ebay.plugins.metrics.develocity.service.model")
+ inputSpec.set("$projectDir/openapi/$openApiFile")
+ outputDir.set(project.layout.buildDirectory.file("generated/openApi").map { it.asFile.path })
+ configFile.set("$projectDir/openapi/config.json")
+}
+
+openApiValidate {
+ inputSpec.set("$projectDir/openapi/$openApiFile")
+}
+
+project.tasks.withType(Test::class.java) {
+ useJUnitPlatform()
+}
+
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..de0b936
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,5 @@
+org.gradle.daemon=true
+org.gradle.caching=true
+org.gradle.parallel=true
+org.gradle.configuration-cache=true
+version=0.0.0
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
new file mode 100644
index 0000000..11f5c19
--- /dev/null
+++ b/gradle/libs.versions.toml
@@ -0,0 +1,22 @@
+[versions]
+# https://plugins.gradle.org/plugin/com.gradle.develocity
+gradle-develocity = "3.17.6"
+# https://github.com/Kotlin/kotlinx.serialization/releases
+kotlinx-serializationJson = "1.6.3"
+# https://github.com/ktorio/ktor/releases
+ktor = "2.3.12"
+# https://github.com/OpenAPITools/openapi-generator/releases
+openapi-generator = "7.3.0"
+
+[libraries]
+gradle-develocity = { module = "com.gradle:develocity-gradle-plugin", version.ref = "gradle-develocity" }
+kotlinx-serializationJson = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serializationJson" }
+ktor-client-auth = { group = "io.ktor", name = "ktor-client-auth", version.ref = "ktor" }
+ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" }
+ktor-client-logging = { group = "io.ktor", name = "ktor-client-logging", version.ref = "ktor" }
+ktor-client-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktor" }
+ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" }
+ktor-serialization-kotlinxJson = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" }
+
+[plugins]
+openapi-generator = { id = "org.openapi.generator", version.ref = "openapi-generator" }
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..2c35211
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..a659fde
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
+networkTimeout=120000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..f5feea6
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,252 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..9d21a21
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,94 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/openapi/config.json b/openapi/config.json
new file mode 100644
index 0000000..544c2f1
--- /dev/null
+++ b/openapi/config.json
@@ -0,0 +1,5 @@
+{
+ "enumPropertyNaming": "UPPERCASE",
+ "serializationLibrary": "kotlinx_serialization",
+ "dateLibrary": "string"
+}
diff --git a/openapi/develocity-2024.1-api.yaml b/openapi/develocity-2024.1-api.yaml
new file mode 100644
index 0000000..8749b54
--- /dev/null
+++ b/openapi/develocity-2024.1-api.yaml
@@ -0,0 +1,4988 @@
+openapi: 3.0.3
+info:
+ title: Develocity API
+ description: |
+ The Develocity API allows programmatic interaction with various aspects of Develocity, from configuration to inspecting build data.
+ version: "2024.1"
+ license:
+ name: Develocity License
+ url: https://gradle.com/help/legal-gradle-software-license-agreement
+ termsOfService: https://gradle.com/help/legal-terms-of-use
+ contact:
+ name: Gradle
+ url: https://gradle.com
+ x-logo:
+ url: https://assets.gradle.com/logo/develocity-logo.svg
+ altText: Develocity
+servers:
+ - url: https://dv.mycompany.com
+ description: Your Develocity instance.
+security:
+ - DevelocityAccessKeyOrToken: []
+tags:
+ - name: Auth
+ description: |
+ Endpoints related to Develocity authentication and authorization.
+ The permissions required for these endpoints vary.
+ Consult the endpoint descriptions.
+ - name: Builds
+ description: |
+ Endpoints related to retrieving details of a build from the Develocity instance.
+ To access these endpoints the user requires the `Access build data via the API` permission.
+ - name: BuildCache
+ x-displayName: Build Cache
+ description: |
+ Endpoints related to configuring the Build Cache nodes of the Develocity instance.
+ To access these endpoints the user requires the `Configure build caches` permission.
+ - name: Projects
+ x-displayName: |
+ Projects (Beta)
+ description: |
+ Endpoints related to the management of projects in Develocity.
+ To access these endpoints the user requires the `Administer Projects` permission.
+
+ **Beta: _The Projects API is unstable and is likely to change in future._**
+ - name: Tests
+ description: |
+ Endpoints related to retrieving details of tests of the Develocity instance.
+ To access these endpoints the user requires the `Access build data via the API` permission.
+ The Develocity installation also needs to have the Test Failure Analytics feature enabled.
+ - name: Meta
+ x-displayName: Meta
+ description: |
+ Endpoints related to the Develocity installation and its state.
+ - name: TestDistribution
+ x-displayName: Test Distribution
+ description: |
+ Endpoints related to the management of Test Distribution resources.
+ To access these endpoints the user requires the `Admin` permission.
+ - name: Develocity
+ x-traitTag: true
+ description: All endpoints of the Develocity API.
+ - name: GradleEnterprise
+ x-traitTag: true
+ description: |
+ **This tag is deprecated, use `Develocity` instead**.
+ All endpoints of the Develocity API.
+paths:
+ /api/auth/token:
+ post:
+ operationId: CreateAccessToken
+ summary: Create a new access token
+ description: Create a new short-lived access token, optionally limited to the provided permissions and projects. Users do not need any specific Develocity permission to do this. If an access key is used to authenticate this request, the created token will be limited to the user's permissions and projects. If an access token is used to authenticate this request, the created token will be limited to the authenticating token's permissions and projects and not live longer than the authenticating token's remaining lifetime. Query parameters can be used to further restrict the permissions of the access token. A 403 response will be sent if one of the projects or permissions present in the query parameters is not assigned to this user. A 403 will also be sent if an access token is used to authenticate the request and the requested expiration date is after the authenticating access token's expiration.
+ tags:
+ - Auth
+ - GradleEnterprise
+ - Develocity
+ parameters:
+ - in: query
+ name: projectIds
+ schema:
+ type: array
+ uniqueItems: true
+ items:
+ $ref: '#/components/schemas/ProjectId'
+ example:
+ - project-a,project-b
+ - project-c
+ explode: true
+ required: false
+ description: Limit the created token to one or more projects. Values should be project ids. Comma seperated values and repeated parameters are supported.
+ - in: query
+ name: permissions
+ schema:
+ type: array
+ uniqueItems: true
+ items:
+ $ref: '#/components/schemas/Permission'
+ example:
+ - publishScan,readCache
+ - writeCache
+ explode: true
+ required: false
+ description: Limit the created token to one or more permissions. Values should be permission [config values](https://gradle.com/help/helm-admin-permissions). Comma seperated values and repeated parameters are supported.
+ - in: query
+ name: expiresInHours
+ schema:
+ type: number
+ format: float
+ minimum: 0
+ exclusiveMinimum: true
+ maximum: 24
+ default: 2
+ example: 0.5
+ required: false
+ description: The lifetime of the created token, in hours.
+ responses:
+ '200':
+ description: An access token
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: eyJraWQiOiJ0ZXN0LWtleSIsImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0.eyJpc19hbm9ueW1vdXMiOmZhbHNlLCJwZXJtaXNzaW9ucyI6WyJSRUFEX1ZFUlNJT04iLCJFWFBPUlRfREFUQSIsIkFDQ0VTU19EQVRBX1dJVEhPVVRfQVNTT0NJQVRFRF9QUk9KRUNUIl0sInByb2plY3RzIjp7ImEiOjEsImIiOjJ9LCJ1c2VyX2lkIjoic29tZS1pZCIsInVzZXJuYW1lIjoidGVzdCIsImZpcnN0X25hbWUiOiJhIiwibGFzdF9uYW1lIjoidXNlciIsImVtYWlsIjoiYkBncmFkbGUuY29tIiwic3ViIjoidGVzdCIsImV4cCI6NzIwMCwibmJmIjowLCJpYXQiOjAsImF1ZCI6ImV4YW1wbGUuZ3JhZGxlLmNvbSIsImlzcyI6ImV4YW1wbGUuZ3JhZGxlLmNvbSIsInRva2VuX3R5cGUiOiJhY2Nlc3NfdG9rZW4ifQ.H1_NEG1xuleP-WIAY_uvSmdd2o7i_-Ko3qhlo04zvCgrElJe7_F5jNuqsyDfnb5hvKlOe5UKG_7QPTgY9-3pFQ
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '403':
+ $ref: '#/components/responses/AccessTokenForbidden'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ /api/auth/revoke-signing-keys:
+ post:
+ operationId: RevokeSigningKeys
+ summary: Revoke auth token signing keys
+ description: Revokes the existing auth token signing keys, and creates a new one. Requires the `Administer Develocity` permission. All existing access tokens will become invalid. Develocity may take a few minutes to revoke all existing access tokens.
+ tags:
+ - Auth
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The existing signing keys have been revoked, all access tokens will become invalid shortly
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ /api/builds:
+ description: |
+ Returns a list of builds with common attributes.
+ The returned list is capped by the `maxBuilds` and `maxWaitSecs` query parameters.
+ This endpoint supports pagination by using the `fromBuild` or `sinceBuild` query parameters, and the last returned build from a previous call to one of these endpoints.
+ parameters:
+ - in: query
+ name: BuildsQuery
+ explode: true
+ description: The query parameters used to retrieve the list of builds.
+ schema:
+ title: BuildsQuery
+ type: object
+ properties:
+ since:
+ type: integer
+ format: int64
+ minimum: 0
+ nullable: true
+ description: |
+ **This parameter is deprecated, use `fromInstant` instead.**
+ A unix-epoch-time in milliseconds allowing to retrieve builds for which Develocity completed receiving and processing the build after this instant.
+ This parameter can only be used with `reverse=false`.
+ Therefore, a value of `0` will process all builds.
+ If not provided, the time in milliseconds when the request is received by the Develocity instance will be used.
+ This parameter has no effect if any of `sinceBuild`, `fromInstant`, `fromBuild` are used.
+ deprecated: true
+ sinceBuild:
+ type: string
+ nullable: true
+ description: |
+ **This parameter is deprecated, use `fromBuild` instead.**
+ A Build Scan ID allowing to retrieve builds for which Develocity completed receiving and processing after the given Build Scan ID (excluding it).
+ This parameter can only be used with `reverse=false`.
+ This parameter has precedence over any value set for the `since` parameter.
+ A valid Build Scan ID must be provided, that is, a Build Scan ID that exists in the Develocity instance.
+ A Build Scan ID for a deleted build is valid.
+ This parameter has no effect if any of `fromInstant`, `fromBuild` are used.
+ deprecated: true
+ fromInstant:
+ type: integer
+ format: int64
+ minimum: 0
+ nullable: true
+ description: |
+ A unix-epoch-time in milliseconds allowing to retrieve builds for which Develocity completed receiving and processing the build after this instant when used in conjunction with `reverse=false`, or before this instant when used in conjunction with `reverse=true`.
+ Therefore, a value of `0` will process all builds.
+ If not provided, the time in milliseconds when the request is received by the Develocity instance will be used.
+ This parameter has no effect if `fromBuild` is used.
+ fromBuild:
+ type: string
+ nullable: true
+ description: |
+ A Build Scan ID allowing to retrieve builds for which Develocity completed receiving and processing after the given Build Scan ID (excluding it) when used in conjunction with `reverse=false`, or before the given Build Scan ID (excluding it) when used in conjunction with `reverse=true`.
+ This parameter has precedence over any value set for the `since`, `sinceBuild`, `fromInstant` parameters.
+ A valid Build Scan ID must be provided, that is, a Build Scan ID that exists in the Develocity instance.
+ A Build Scan ID for a deleted build is valid.
+ reverse:
+ type: boolean
+ nullable: true
+ description: |
+ A boolean indicating the time direction of the query.
+ A value of `true` indicates a backward query, and returned builds will be sorted from most to least recent.
+ A value of `false` indicates a forward query, and returned builds will be sorted from least to most recent.
+ This parameter has no effect if any of `since`, `sinceBuild` are used.
+ If not provided, the default value is `false`.
+ maxBuilds:
+ type: integer
+ minimum: 0
+ maximum: 1000
+ nullable: true
+ description: |
+ The maximum number of builds returned by the query.
+ The query returns when that number is reached or when `maxWaitSecs` is reached.
+ If not provided, the default value is `100`.
+ maxWaitSecs:
+ type: integer
+ minimum: 1
+ maximum: 20
+ nullable: true
+ description: |
+ The maximum number of seconds to wait for builds before returning.
+ If this time is reached before `maxBuilds` is reached, the query returns with the already processed builds.
+ Note that this time is respected with best effort.
+ A query will return soon after this time has passed but there is no guarantee that it exactly returns before this time has passed.
+ This parameter has no effect if `reverse=true` is specified, because new builds cannot become available in the past.
+ If not provided, the default value is `3`.
+ query:
+ type: string
+ nullable: true
+ description: |
+ A query for filtering builds, written in the Develocity advanced search query language
+ See: https://gradle.com/help/advanced-search
+ models:
+ $ref: '#/components/schemas/BuildModelNames'
+ allModels:
+ type: boolean
+ default: false
+ description: |
+ Whether to include all build models for each build.
+ If set to `true`, the value of the `models` parameter is ignored.
+ get:
+ operationId: GetBuilds
+ summary: Get a list of builds with common attributes.
+ description: |
+ The contained attributes are build tool agnostic.
+ If none of `fromInstant`, `fromBuild`, or `reverse` is used, when making a request to this endpoint, it will return builds that were received and processed by Develocity after the request was made.
+ tags:
+ - Builds
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: A list of builds with common attributes.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Builds'
+ example:
+ - id: 9r4d13f0r3v3r
+ availableAt: 1635400481000
+ buildToolType: gradle
+ buildToolVersion: '7.2'
+ buildAgentVersion: 3.7.1
+ models:
+ gradleAttributes:
+ model:
+ id: 9r4d13f0r3v3r
+ buildStartTime: 1637316480
+ buildDuration: 5000
+ gradleVersion: '7.3'
+ pluginVersion: 3.7.2
+ rootProjectName: example-project
+ requestedTasks:
+ - clean
+ - build
+ hasFailed: true
+ hasVerificationFailure: true
+ hasNonVerificationFailure: true
+ tags:
+ - CI
+ - feature-branch
+ values:
+ - name: branch
+ value: feature/one
+ - name: commitId
+ value: c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ links:
+ - label: CI job
+ url: https://ci.com/job1
+ - label: GIT commit
+ url: https://git.com/c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ gradleEnterpriseSettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ taskInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ develocitySettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ taskInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ buildOptions:
+ buildCacheEnabled: true
+ configurationCacheEnabled: true
+ configurationOnDemandEnabled: true
+ continuousBuildEnabled: true
+ continueOnFailureEnabled: true
+ daemonEnabled: true
+ dryRunEnabled: true
+ excludedTasks:
+ - takesALongTime
+ - doesNotLikeToBeExecuted
+ fileSystemWatchingEnabled: true
+ maxNumberOfGradleWorkers: 4
+ offlineModeEnabled: true
+ parallelProjectExecutionEnabled: true
+ refreshDependenciesEnabled: true
+ rerunTasksEnabled: true
+ environment:
+ username: gradle
+ operatingSystem: macOS 12.2.1 (x86_64)
+ numberOfCpuCores: 16
+ jreVersion: AdoptOpenJDK OpenJDK Runtime Environment 11.0.11+9
+ jvmVersion: AdoptOpenJDK OpenJDK 64-Bit Server VM 11.0.11+9 (mixed mode)
+ jvmMaxMemoryHeapSize: 16777216
+ jvmCharset: UTF-8
+ jvmLocale: English (United States)
+ publicHostname: agent.gradle.com
+ localHostname: gradle
+ localIpAddresses:
+ - 192.168.1.126
+ - 192.168.1.128
+ mavenAttributes:
+ problem:
+ type: urn:gradle:enterprise:api:problems:build-model-not-applicable
+ title: Build model is not applicable.
+ detail: Build model is not available for build with ID '9r4d13f0r3v3r' because its build tool type is 'gradle' (allowed list is '[maven]').
+ status: 400
+ - id: ji7vz3ey5qdvk
+ availableAt: 1635400482000
+ buildToolType: maven
+ buildToolVersion: 3.8.4
+ buildAgentVersion: '1.13'
+ models:
+ gradleAttributes:
+ problem:
+ type: urn:gradle:enterprise:api:problems:build-model-not-applicable
+ title: Build model is not applicable.
+ detail: Build model is not available for build with ID 'ji7vz3ey5qdvk' because its build tool type is 'maven' (allowed list is '[gradle]').
+ status: 400
+ mavenAttributes:
+ model:
+ id: 9r4d13f0r3v3r
+ buildStartTime: 1637316480
+ buildDuration: 11000
+ mavenVersion: 3.8.4
+ extensionVersion: 1.11.1
+ topLevelProjectName: example-project
+ requestedGoals:
+ - clean
+ - verify
+ hasFailed: true
+ hasVerificationFailure: true
+ hasNonVerificationFailure: true
+ tags:
+ - CI
+ - feature-branch
+ values:
+ - name: branch
+ value: feature/one
+ - name: commitId
+ value: c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ links:
+ - label: CI job
+ url: https://ci.com/job1
+ - label: GIT commit
+ url: https://git.com/c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ gradleEnterpriseSettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ goalInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ develocitySettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ goalInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ buildOptions:
+ batchModeEnabled: true
+ debugEnabled: true
+ errorsEnabled: true
+ failAtEndEnabled: true
+ failFastEnabled: true
+ failNeverEnabled: true
+ laxChecksumsEnabled: true
+ maxNumberOfThreads: 4
+ nonRecursiveEnabled: true
+ noSnapshotsUpdatesEnabled: true
+ offlineModeEnabled: true
+ quietEnabled: true
+ rerunGoals: false
+ strictChecksumsEnabled: true
+ updateSnapshotsEnabled: true
+ environment:
+ username: maven
+ operatingSystem: macOS 12.2.1 (x86_64)
+ numberOfCpuCores: 16
+ jreVersion: AdoptOpenJDK OpenJDK Runtime Environment 11.0.11+9
+ jvmVersion: AdoptOpenJDK OpenJDK 64-Bit Server VM 11.0.11+9 (mixed mode)
+ jvmMaxMemoryHeapSize: 16777216
+ jvmCharset: UTF-8
+ jvmLocale: English (United States)
+ publicHostname: agent.gradle.com
+ localHostname: maven
+ localIpAddresses:
+ - 192.168.1.126
+ - 192.168.1.128
+ - id: cvpd4j7ug7j4q
+ availableAt: 1635400483000
+ buildToolType: bazel
+ buildToolVersion: 6.0.0
+ buildAgentVersion: '1.0'
+ models:
+ gradleAttributes:
+ problem:
+ type: urn:gradle:enterprise:api:problems:build-model-not-applicable
+ title: Build model is not applicable.
+ detail: Build model is not available for build with ID 'cvpd4j7ug7j4q' because its build tool type is 'bazel' (allowed list is '[gradle]').
+ status: 400
+ mavenAttributes:
+ problem:
+ type: urn:gradle:enterprise:api:problems:build-model-not-applicable
+ title: Build model is not applicable.
+ detail: Build model is not available for build with ID 'cvpd4j7ug7j4q' because its build tool type is 'bazel' (allowed list is '[maven]').
+ status: 400
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the common attributes of a build.
+ schema:
+ $ref: '#/components/schemas/BuildQuery'
+ get:
+ operationId: GetBuild
+ summary: Get the common attributes of a build.
+ description: The contained attributes are build tool agnostic.
+ tags:
+ - Builds
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The common attributes of a build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Build'
+ example:
+ id: 9r4d13f0r3v3r
+ availableAt: 1635400481000
+ buildToolType: gradle
+ buildToolVersion: '7.2'
+ buildAgentVersion: 3.7.1
+ models:
+ gradleAttributes:
+ model:
+ id: 9r4d13f0r3v3r
+ buildStartTime: 1637316480
+ buildDuration: 5000
+ gradleVersion: '7.3'
+ pluginVersion: 3.7.2
+ rootProjectName: example-project
+ requestedTasks:
+ - clean
+ - build
+ hasFailed: true
+ hasVerificationFailure: true
+ hasNonVerificationFailure: true
+ tags:
+ - CI
+ - feature-branch
+ values:
+ - name: branch
+ value: feature/one
+ - name: commitId
+ value: c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ links:
+ - label: CI job
+ url: https://ci.com/job1
+ - label: GIT commit
+ url: https://git.com/c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ gradleEnterpriseSettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ taskInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ develocitySettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ taskInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ buildOptions:
+ buildCacheEnabled: true
+ configurationCacheEnabled: true
+ configurationOnDemandEnabled: true
+ continuousBuildEnabled: true
+ continueOnFailureEnabled: true
+ daemonEnabled: true
+ dryRunEnabled: true
+ excludedTasks:
+ - takesALongTime
+ - doesNotLikeToBeExecuted
+ fileSystemWatchingEnabled: true
+ maxNumberOfGradleWorkers: 4
+ offlineModeEnabled: true
+ parallelProjectExecutionEnabled: true
+ refreshDependenciesEnabled: true
+ rerunTasksEnabled: true
+ environment:
+ username: gradle
+ operatingSystem: macOS 12.2.1 (x86_64)
+ numberOfCpuCores: 16
+ jreVersion: AdoptOpenJDK OpenJDK Runtime Environment 11.0.11+9
+ jvmVersion: AdoptOpenJDK OpenJDK 64-Bit Server VM 11.0.11+9 (mixed mode)
+ jvmMaxMemoryHeapSize: 16777216
+ jvmCharset: UTF-8
+ jvmLocale: English (United States)
+ publicHostname: agent.gradle.com
+ localHostname: gradle
+ localIpAddresses:
+ - 192.168.1.126
+ - 192.168.1.128
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/gradle-attributes:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the attributes of a Gradle build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetGradleAttributes
+ summary: Get the attributes of a Gradle build.
+ description: This model is Gradle specific and cannot be requested for another build tool.
+ tags:
+ - Builds
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The attributes of a Gradle build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GradleAttributes'
+ example:
+ id: 9r4d13f0r3v3r
+ buildStartTime: 1637316480
+ buildDuration: 5000
+ gradleVersion: '7.3'
+ pluginVersion: 3.7.2
+ rootProjectName: example-project
+ requestedTasks:
+ - clean
+ - build
+ hasFailed: true
+ hasVerificationFailure: true
+ hasNonVerificationFailure: true
+ tags:
+ - CI
+ - feature-branch
+ values:
+ - name: branch
+ value: feature/one
+ - name: commitId
+ value: c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ links:
+ - label: CI job
+ url: https://ci.com/job1
+ - label: GIT commit
+ url: https://git.com/c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ gradleEnterpriseSettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ taskInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ develocitySettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ taskInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ buildOptions:
+ buildCacheEnabled: true
+ configurationCacheEnabled: true
+ configurationOnDemandEnabled: true
+ continuousBuildEnabled: true
+ continueOnFailureEnabled: true
+ daemonEnabled: true
+ dryRunEnabled: true
+ excludedTasks:
+ - takesALongTime
+ - doesNotLikeToBeExecuted
+ fileSystemWatchingEnabled: true
+ maxNumberOfGradleWorkers: 4
+ offlineModeEnabled: true
+ parallelProjectExecutionEnabled: true
+ refreshDependenciesEnabled: true
+ rerunTasksEnabled: true
+ environment:
+ username: gradle
+ operatingSystem: macOS 12.2.1 (x86_64)
+ numberOfCpuCores: 16
+ jreVersion: AdoptOpenJDK OpenJDK Runtime Environment 11.0.11+9
+ jvmVersion: AdoptOpenJDK OpenJDK 64-Bit Server VM 11.0.11+9 (mixed mode)
+ jvmMaxMemoryHeapSize: 16777216
+ jvmCharset: UTF-8
+ jvmLocale: English (United States)
+ publicHostname: agent.gradle.com
+ localHostname: gradle
+ localIpAddresses:
+ - 192.168.1.126
+ - 192.168.1.128
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/maven-attributes:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the attributes of a Maven build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetMavenAttributes
+ summary: Get the attributes of a Maven build.
+ description: This model is Maven specific and cannot be requested for another build tool.
+ tags:
+ - Builds
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The attributes of a Maven build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/MavenAttributes'
+ example:
+ id: 9r4d13f0r3v3r
+ buildStartTime: 1637316480
+ buildDuration: 11000
+ mavenVersion: 3.8.4
+ extensionVersion: 1.11.1
+ topLevelProjectName: example-project
+ requestedGoals:
+ - clean
+ - verify
+ hasFailed: true
+ hasVerificationFailure: true
+ hasNonVerificationFailure: true
+ tags:
+ - CI
+ - feature-branch
+ values:
+ - name: branch
+ value: feature/one
+ - name: commitId
+ value: c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ links:
+ - label: CI job
+ url: https://ci.com/job1
+ - label: GIT commit
+ url: https://git.com/c874006021712affa4e7bd82d2ec4cd06beaa4f5
+ gradleEnterpriseSettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ goalInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ develocitySettings:
+ backgroundPublicationEnabled: true
+ buildOutputCapturingEnabled: true
+ goalInputsFileCapturingEnabled: true
+ testOutputCapturingEnabled: true
+ buildOptions:
+ batchModeEnabled: true
+ debugEnabled: true
+ errorsEnabled: true
+ failAtEndEnabled: true
+ failFastEnabled: true
+ failNeverEnabled: true
+ laxChecksumsEnabled: true
+ maxNumberOfThreads: 4
+ nonRecursiveEnabled: true
+ noSnapshotsUpdatesEnabled: true
+ offlineModeEnabled: true
+ quietEnabled: true
+ rerunGoals: false
+ strictChecksumsEnabled: true
+ updateSnapshotsEnabled: true
+ environment:
+ username: maven
+ operatingSystem: macOS 12.2.1 (x86_64)
+ numberOfCpuCores: 16
+ jreVersion: AdoptOpenJDK OpenJDK Runtime Environment 11.0.11+9
+ jvmVersion: AdoptOpenJDK OpenJDK 64-Bit Server VM 11.0.11+9 (mixed mode)
+ jvmMaxMemoryHeapSize: 16777216
+ jvmCharset: UTF-8
+ jvmLocale: English (United States)
+ publicHostname: agent.gradle.com
+ localHostname: maven
+ localIpAddresses:
+ - 192.168.1.126
+ - 192.168.1.128
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/gradle-build-cache-performance:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the build cache performance of a Gradle build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetGradleBuildCachePerformance
+ summary: Get the build cache performance of a Gradle build.
+ description: This model is Gradle specific and cannot be requested for another build tool.
+ tags:
+ - Builds
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The build cache performance of a Gradle build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GradleBuildCachePerformance'
+ example:
+ id: 9r4d13f0r3v3r
+ buildTime: 5000
+ effectiveTaskExecutionTime: 5000
+ effectiveWorkUnitExecutionTime: 5000
+ serialTaskExecutionTime: 10000
+ serialWorkUnitExecutionTime: 10000
+ serializationFactor: 2
+ taskExecution:
+ - taskPath: ':task'
+ taskType: org.gradle.api.tasks.Task
+ avoidanceOutcome: avoided_from_local_cache
+ duration: 5000
+ fingerprintingDuration: 5
+ avoidanceSavings: 6000
+ cacheArtifactSize: 3000
+ - taskPath: ':task2'
+ taskType: org.gradle.api.tasks.Task
+ avoidanceOutcome: avoided_from_remote_cache
+ duration: 3000
+ fingerprintingDuration: 3
+ avoidanceSavings: 4000
+ cacheArtifactSize: 3000
+ - taskPath: ':task3'
+ taskType: org.gradle.api.tasks.Task
+ avoidanceOutcome: executed_not_cacheable
+ duration: 2000
+ fingerprintingDuration: 6
+ nonCacheabilityCategory: cache-if_condition_not_matched
+ nonCacheabilityReason: '''Task outputs cacheable'' not satisfied'
+ - taskPath: ':task4'
+ taskType: org.gradle.api.tasks.Task
+ avoidanceOutcome: skipped
+ duration: 0
+ fingerprintingDuration: 0
+ skipReasonMessage: some skip reason message
+ taskFingerprintingSummary:
+ count: 1
+ serialDuration: 8
+ workUnitFingerprintingSummary:
+ count: 5
+ serialDuration: 20
+ avoidanceSavingsSummary:
+ total: 10000
+ ratio: 0.55556
+ upToDate: 0
+ localBuildCache: 6000
+ remoteBuildCache: 4000
+ taskAvoidanceSavingsSummary:
+ total: 10000
+ ratio: 0.55556
+ upToDate: 0
+ localBuildCache: 6000
+ remoteBuildCache: 4000
+ workUnitAvoidanceSavingsSummary:
+ total: 20000
+ ratio: 0.75556
+ upToDate: 1
+ localBuildCache: 9000
+ remoteBuildCache: 2000
+ buildCaches:
+ local:
+ isEnabled: true
+ isPushEnabled: true
+ isDisabledDueToError: false
+ remote:
+ type: HTTP
+ className: org.example.MyBuildCache
+ isEnabled: true
+ isPushEnabled: true
+ isDisabledDueToError: false
+ overhead:
+ uploading: 100
+ downloading: 200
+ packing: 50
+ unpacking: 25
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/maven-build-cache-performance:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the build cache performance of a Maven build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetMavenBuildCachePerformance
+ summary: Get the build cache performance of a Maven build.
+ description: This model is Maven specific and cannot be requested for another build tool.
+ tags:
+ - Builds
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The build cache performance of a Maven build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/MavenBuildCachePerformance'
+ example:
+ id: 9r4d13f0r3v3r
+ buildTime: 5000
+ effectiveProjectExecutionTime: 5000
+ serialProjectExecutionTime: 10000
+ serializationFactor: 2
+ goalExecution:
+ - goalName: clean:clean
+ mojoType: org.apache.maven.plugin.jar.JarMojo
+ goalExecutionId: default-clean
+ goalProjectName: myproject
+ avoidanceOutcome: executed_not_cacheable
+ duration: 2000
+ nonCacheabilityCategory: build_cache_disabled_by_user
+ nonCacheabilityReason: Neither the local or remote build cache were enabled in the configuration of the build.
+ - goalName: compiler:compile
+ mojoType: org.apache.maven.plugin.jar.JarMojo
+ goalExecutionId: default-compile
+ goalProjectName: myproject
+ avoidanceOutcome: avoided_from_local_cache
+ duration: 5000
+ fingerprintingDuration: 5
+ avoidanceSavings: 6000
+ cacheArtifactSize: 3000
+ - goalName: compiler:compile
+ mojoType: org.apache.maven.plugin.jar.JarMojo
+ goalExecutionId: default-compile
+ goalProjectName: myproject2
+ avoidanceOutcome: avoided_from_remote_cache
+ duration: 3000
+ fingerprintingDuration: 3
+ avoidanceSavings: 4000
+ cacheArtifactSize: 3000
+ goalFingerprintingSummary:
+ count: 1
+ serialDuration: 8
+ avoidanceSavingsSummary:
+ total: 10000
+ ratio: 0.55556
+ localBuildCache: 6000
+ remoteBuildCache: 4000
+ buildCaches:
+ local:
+ isEnabled: true
+ isDisabledDueToError: false
+ remote:
+ isEnabled: true
+ isPushEnabled: true
+ isDisabledDueToError: false
+ overhead:
+ uploading: 100
+ downloading: 200
+ packing: 50
+ unpacking: 25
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/gradle-projects:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the build structure of a Gradle build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetGradleProjects
+ summary: Get the projects of a Gradle build.
+ description: This model is Gradle specific and cannot be requested for another build tool.
+ tags:
+ - Builds
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The projects of a Gradle build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GradleProjects'
+ example:
+ - name: root project
+ path: ':'
+ - name: sub project
+ path: ':sub'
+ parent: 0
+ - name: included build root project
+ path: ':included'
+ - name: included build sub project
+ path: ':included:sub'
+ parent: 2
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/maven-modules:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the build structure of a Maven build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetMavenModules
+ summary: Get the modules of a Maven build.
+ description: This model is Maven specific and cannot be requested for another build tool.
+ tags:
+ - Builds
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The modules of a Maven build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/MavenModules'
+ example:
+ - name: top level project
+ groupId: com
+ artifactId: top-level
+ version: '1.0'
+ - name: sub project a
+ groupId: com
+ artifactId: sub-a
+ version: '1.1'
+ parent: 0
+ - name: sub project b
+ groupId: com
+ artifactId: sub-b
+ version: '2.0'
+ parent: 0
+ - name: sub project a 2
+ groupId: com
+ artifactId: sub-a-a
+ version: 2.1-SNAPSHOT
+ parent: 1
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/gradle-network-activity:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the network activity of a Gradle build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetGradleNetworkActivity
+ summary: Get the network activity of a Gradle build.
+ description: This model is Gradle specific and cannot be requested for another build tool. This model is only available starting with Gradle version 3.5 and Develocity Gradle Plugin version 1.6.
+ tags:
+ - Builds
+ - Develocity
+ responses:
+ '200':
+ description: The network activity of a Gradle build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GradleNetworkActivity'
+ example:
+ networkRequestCount: 20
+ serialNetworkRequestTime: 500
+ wallClockNetworkRequestTime: 25
+ fileDownloadCount: 18
+ fileDownloadSize: 2049
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/maven-dependency-resolution:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the dependency resolution of a Maven build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetMavenDependencyResolution
+ summary: Get information about the dependency resolution of a Maven build.
+ description: This model is Maven specific and cannot be requested for another build tool. This model is only available starting with the Develocity Maven Extension version 1.9.
+ tags:
+ - Builds
+ - Develocity
+ responses:
+ '200':
+ description: Information about the dependency resolution of a Maven build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/MavenDependencyResolution'
+ example:
+ networkRequestCount: 10
+ serialNetworkRequestTime: 1000
+ wallClockNetworkRequestTime: 50
+ fileDownloadSize: 1025
+ fileDownloadCount: 8
+ serialDependencyResolutionTime: 40
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/gradle-artifact-transform-executions:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the artifact transform execution list of a Gradle build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetGradleArtifactTransformExecutions
+ summary: Get the artifact transform execution list of a Gradle build.
+ description: This model is Gradle specific and cannot be requested for another build tool.
+ tags:
+ - Builds
+ - Develocity
+ responses:
+ '200':
+ description: The artifact transform execution list of a Gradle build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GradleArtifactTransformExecutions'
+ example:
+ artifactTransformExecutions:
+ - artifactTransformExecutionName: project :lib [color=green]
+ transformActionType: com.test.MakeColor
+ inputArtifactName: lib.jar
+ changedAttributes:
+ - name: color
+ from: blue
+ to: green
+ outcome: success
+ avoidanceOutcome: executed_cacheable
+ duration: 224
+ fingerprintingDuration: 1
+ cacheArtifactSize: 470
+ cacheKey: 34025cdc0be090f2901543d673b3c45e
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/builds/{id}/gradle-deprecations:
+ parameters:
+ - in: path
+ name: id
+ schema:
+ type: string
+ required: true
+ description: The Build Scan ID.
+ - in: query
+ name: BuildQuery
+ explode: true
+ description: The query parameters used to retrieve the deprecations for a Gradle build.
+ schema:
+ $ref: '#/components/schemas/BuildModelQuery'
+ get:
+ operationId: GetGradleDeprecations
+ summary: Get the Gradle Build Tool deprecations of a Gradle build.
+ description: This model is Gradle specific and cannot be requested for another build tool.
+ tags:
+ - Builds
+ - Develocity
+ responses:
+ '200':
+ description: The deprecation list of a Gradle build.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GradleDeprecations'
+ example:
+ deprecations:
+ - summary: Task deprecatedTask2 has been deprecated.
+ removalDetails: This is scheduled to be removed in Gradle 9.0.
+ advice: Do not trigger deprecatedTask2 task.
+ usages:
+ - owner:
+ location: core/core.gradle
+ type: script
+ - summary: CoorpPlugin has been deprecated.
+ removalDetails: This is scheduled to be removed in Gradle 9.0.
+ advice: Use non deprecated plugin instead.
+ documentationUrl: https://docs.gradle.org/8.5/userguide/coorpplugin2.html
+ usages:
+ - contextualAdvice: Use CoorpPlugin2 for build-with-deprecations instead.
+ owner:
+ location: org.acme.coorp-plugin
+ type: plugin
+ - contextualAdvice: Use CoorpPlugin2 for utils instead.
+ owner:
+ location: org.acme.coorp-plugin
+ type: plugin
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NotReadyError'
+ /api/build-cache/nodes/{name}:
+ parameters:
+ - in: path
+ name: name
+ schema:
+ type: string
+ required: true
+ description: The name of the Build Cache Node. To select the Built-in Build Cache Node, use `Built-in` as name.
+ get:
+ operationId: GetBuildCacheNode
+ summary: View the configuration of a Build Cache Node.
+ description: View the enablement status and replication configuration of a Build Cache Node.
+ tags:
+ - BuildCache
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The configuration of a Build Cache Node.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NodeConfiguration'
+ example:
+ enabled: false
+ replication:
+ source: parent-node-1
+ preemptive: true
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ put:
+ operationId: CreateOrUpdateBuildCacheNode
+ summary: Create or update a Build Cache Node.
+ description: |
+ Create a new Build Cache Node in Develocity or update the configuration of an existing one.
+ The Built-in Build Cache Node cannot be named as the target of this operation.
+ tags:
+ - BuildCache
+ - GradleEnterprise
+ - Develocity
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NodeConfiguration'
+ example:
+ enabled: false
+ replication:
+ source: parent-node-1
+ preemptive: true
+ responses:
+ '200':
+ description: The name referenced an existing Build Cache Node and that Build Cache Node’s configuration was updated successfully.
+ '201':
+ description: A new Build Cache Node was created with the configuration specified in the request.
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ /api/build-cache/nodes/{name}/secret:
+ parameters:
+ - in: path
+ name: name
+ schema:
+ type: string
+ required: true
+ description: The name of the Build Cache Node.
+ post:
+ operationId: RegenerateSecretOfBuildCacheNode
+ summary: Regenerate the secret of a Build Cache Node.
+ description: |
+ Regenerates the secret associated with the named Build Cache Node. The old secret expires immediately, causing the Build Cache Node to
+ disconnect from Develocity. The Built-in Build Cache Node cannot be named as the target of this operation.
+ tags:
+ - BuildCache
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The name referenced an existing Build Cache Node and that Build Cache Node's secret was regenerated.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/KeySecretPair'
+ example:
+ key: cvzxztkqkqxzc3vcruabpcr264
+ secret: e5ag76yp6abcc5jbxusboca313
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ /api/build-cache/nodes/{name}/purge:
+ parameters:
+ - in: path
+ name: name
+ schema:
+ type: string
+ required: true
+ description: The name of the Build Cache Node. To select the Built-in Build Cache Node, use `Built-in` as name.
+ post:
+ operationId: InitiatePurgeOfBuildCacheNode
+ summary: Deletes all entries from a Build Cache Node.
+ description: |
+ Triggers the deletion of all entries stored at the named Build Cache Node.
+ tags:
+ - BuildCache
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '202':
+ description: Purging the Build Cache Node was successfully initiated.
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ '503':
+ $ref: '#/components/responses/NodeNotSignedInError'
+ /api/projects:
+ get:
+ operationId: ListProjects
+ summary: Lists Projects.
+ description: |
+ **Beta:** Returns a paged list of all projects.
+ If there are a lot of projects, then all pages will need to be retrieved in order to retrieve the full list of projects.
+ The default number of projects per page is 1,000.
+ tags:
+ - Projects
+ - GradleEnterprise
+ - Develocity
+ parameters:
+ - in: query
+ name: PageQuery
+ explode: true
+ description: The page to fetch.
+ schema:
+ $ref: '#/components/schemas/PageQuery'
+ responses:
+ '200':
+ description: A list of projects known to Develocity.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProjectsPage'
+ example:
+ content:
+ - id: some-project
+ displayName: Some Project
+ description: An example project
+ - id: another-project
+ displayName: Another Project
+ description: Another example project
+ page:
+ number: 1
+ size: 100
+ totalPages: 4
+ totalElements: 351
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/projects/{projectId}:
+ parameters:
+ - in: path
+ name: projectId
+ example: a-project
+ schema:
+ $ref: '#/components/schemas/ProjectId'
+ required: true
+ description: The ID of the project.
+ get:
+ operationId: GetProject
+ summary: Get a project.
+ description: |
+ **Beta:** Gets a specific project.
+ tags:
+ - Projects
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The requested project.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Project'
+ example:
+ id: some-project
+ displayName: Some Project
+ description: An example project
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ put:
+ operationId: CreateOrUpdateProject
+ summary: Create or update a project.
+ description: |
+ **Beta:** Create a new project in Develocity or update an existing project.
+ When updating, any optional fields that are omitted from the request, but were previously set on the project, will be unset/removed.
+ An existing project's identifier cannot be updated.
+ If the update contains a id that does not match the current id, then the operation will fail with a Bad Request response.
+ tags:
+ - Projects
+ - GradleEnterprise
+ - Develocity
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Project'
+ example:
+ id: some-project
+ displayName: Some Project
+ description: An example project
+ responses:
+ '200':
+ description: The project was created or it was updated successfully.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Project'
+ example:
+ id: some-project
+ displayName: Some Project
+ description: An example project
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/project-groups:
+ get:
+ operationId: ListProjectGroups
+ summary: Lists project groups.
+ description: |
+ **Beta:** Returns a list of all project groups.
+ If there are a lot of project groups, then all pages will need to be retrieved in order to retrieve the full list of project groups.
+ The default number of project groups per page is 100.
+ tags:
+ - Projects
+ - GradleEnterprise
+ - Develocity
+ parameters:
+ - in: query
+ name: PageQuery
+ explode: true
+ description: The page to fetch.
+ schema:
+ $ref: '#/components/schemas/PageQuery'
+ responses:
+ '200':
+ description: A list of project groups.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProjectGroupsPage'
+ example:
+ content:
+ - id: some-project-group
+ displayName: Some Project Group
+ description: An example project group
+ projects:
+ - id: some-project
+ - id: another-project
+ - id: another-project-group
+ displayName: Another Project Group
+ description: Another example project group
+ projects:
+ - id: another-project
+ page:
+ number: 1
+ size: 50
+ totalPages: 4
+ totalElements: 151
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/project-groups/{projectGroupId}:
+ parameters:
+ - in: path
+ name: projectGroupId
+ example: a-project-group
+ schema:
+ $ref: '#/components/schemas/ProjectGroupId'
+ required: true
+ description: The ID of the project group.
+ get:
+ operationId: GetProjectGroup
+ summary: Get a project group
+ description: |
+ **Beta:** Gets a specific project group.
+ tags:
+ - Projects
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The requested project group.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProjectGroup'
+ example:
+ id: some-project-group
+ displayName: Some Project Group
+ description: An example project group
+ projects:
+ - id: some-project
+ - id: another-project
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ put:
+ operationId: CreateOrUpdateProjectGroup
+ summary: Create or update a project group.
+ description: |
+ **Beta:** Create a new project group in Develocity or update an existing project group.
+ When updating, any optional fields that are omitted from the request, but were previously set on the project group, will be unset/removed.
+ An existing project group's identifier cannot be updated.
+ If the update contains a id that does not match the current id, then the operation will fail with a Bad Request response.
+ tags:
+ - Projects
+ - GradleEnterprise
+ - Develocity
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProjectGroup'
+ example:
+ id: some-project-group
+ displayName: Some Project Group
+ description: An example project group
+ projects:
+ - id: some-project
+ - id: another-project
+ responses:
+ '200':
+ description: The project group was created or it was updated successfully.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProjectGroup'
+ example:
+ id: some-project-group
+ displayName: Some Project Group
+ description: An example project group
+ projects:
+ - id: some-project
+ - id: another-project
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ delete:
+ operationId: DeleteProjectGroup
+ summary: Delete a project group.
+ description: |
+ **Beta:** Delete a project group.
+ tags:
+ - Projects
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The projectId referenced an existing project group and it was deleted.
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/tests/containers:
+ description: |
+ The tests endpoint is used to retrieve the list of tests that have at least one instance of the given test outcomes in the given timeframe.
+ It works on test containers, such as test classes, and not individual tests cases.
+ get:
+ operationId: GetTestContainers
+ summary: Get a list of test containers.
+ description: Returns the list of test containers.
+ tags:
+ - Tests
+ - GradleEnterprise
+ - Develocity
+ parameters:
+ - in: query
+ name: query
+ explode: true
+ required: true
+ description: The query parameters used to retrieve the list of test containers.
+ schema:
+ $ref: '#/components/schemas/TestContainersQuery'
+ responses:
+ '200':
+ description: A list of test containers.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestsResponse'
+ example:
+ content:
+ - name: com.example.Test
+ workUnits:
+ - gradle:
+ projectName: acme
+ taskPath: ':test'
+ outcomeDistribution:
+ passed: 1
+ failed: 2
+ skipped: 3
+ flaky: 4
+ notSelected: 5
+ total: 15
+ buildScanIdsByOutcome:
+ passed:
+ - ssfohatb6uw2u
+ failed:
+ - qegl4bohhoy2i
+ - eo6lnhluzkbbg
+ skipped:
+ - 6jsgeu7deyisu
+ - nyg4nlhts6ez2
+ - 5qpe6oluq6nkm
+ flaky:
+ - milutmob6ayt6
+ - es5izuj3d3euw
+ - q7hrgly7txcoa
+ - lo7xqd74pkepk
+ notSelected:
+ - q3cz4ajrspqe4
+ - kpmkaegons4ls
+ - t53u7u63j35uq
+ - wifudssaudxyo
+ - k6cgdkvi574u4
+ - name: com.example.MavenTest
+ workUnits:
+ - maven:
+ groupId: com.example
+ artifactId: maven-test
+ goalName: surefire:test
+ executionId: default-execution
+ outcomeDistribution:
+ passed: 0
+ failed: 0
+ skipped: 0
+ flaky: 1
+ notSelected: 0
+ total: 1
+ buildScanIdsByOutcome:
+ passed: []
+ failed: []
+ skipped: []
+ flaky:
+ - rvta3gxepioxu
+ notSelected: []
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ /api/tests/cases:
+ description: |
+ The test cases endpoint is used to retrieve the list of test cases that have at least one instance of the given test outcomes in the given timeframe.
+ It returns information about the test cases inside the given container.
+ get:
+ operationId: GetTestCases
+ summary: Get a list of test cases.
+ description: Retrieves the list of test cases of a single container.
+ tags:
+ - Tests
+ - GradleEnterprise
+ - Develocity
+ parameters:
+ - in: query
+ name: query
+ explode: true
+ required: true
+ description: The query parameters used to retrieve the list of test cases.
+ schema:
+ $ref: '#/components/schemas/TestCasesQuery'
+ responses:
+ '200':
+ description: A list of test cases.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestsResponse'
+ example:
+ content:
+ - name: testCase1
+ workUnits:
+ - gradle:
+ projectName: acme
+ taskPath: ':test'
+ outcomeDistribution:
+ passed: 1
+ failed: 2
+ skipped: 3
+ flaky: 4
+ notSelected: 5
+ total: 15
+ buildScanIdsByOutcome:
+ passed:
+ - ssfohatb6uw2u
+ failed:
+ - qegl4bohhoy2i
+ - eo6lnhluzkbbg
+ skipped:
+ - 6jsgeu7deyisu
+ - nyg4nlhts6ez2
+ - 5qpe6oluq6nkm
+ flaky:
+ - milutmob6ayt6
+ - es5izuj3d3euw
+ - q7hrgly7txcoa
+ - lo7xqd74pkepk
+ notSelected:
+ - q3cz4ajrspqe4
+ - kpmkaegons4ls
+ - t53u7u63j35uq
+ - wifudssaudxyo
+ - k6cgdkvi574u4
+ '400':
+ $ref: '#/components/responses/BadRequestError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+ /api/test-distribution/agent-pools:
+ get:
+ operationId: ListTestDistributionAgentPools
+ summary: Lists Agent Pools.
+ description: Returns a list of all Agent Pools.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The response contains a listing of all Agent Pools.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolPage'
+ example:
+ content:
+ - id: m4yfaq4a
+ name: abc-agents-pool
+ minimumSize: 10
+ maximumSize: 20
+ capabilities:
+ - os=linux
+ - jdk=11
+ - team-abc
+ orderIndex: 1
+ restrictAccessToProjectGroups: false
+ projectGroupIds: []
+ - id: dwc4whvi
+ name: def-agents-pool
+ minimumSize: 0
+ maximumSize: 10
+ capabilities:
+ - os=windows
+ - jdk=11
+ orderIndex: 2
+ restrictAccessToProjectGroups: true
+ projectGroupIds:
+ - project-group-a
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ post:
+ operationId: CreateTestDistributionAgentPool
+ summary: Create an Agent Pool.
+ description: |
+ Create a new Agent Pool in Develocity.
+ The orderIndex element is optional and can be used to specify the priority order in which the Agent Pool is considered.
+ When not specified, the Agent Pool will be added last.
+ When specified, the Agent Pool will be added at the specified index and all other Agent Pools will be moved down.
+ If the specified index is out of bounds, the Agent Pool will be added last with the orderIndex adjusted accordingly.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolConfiguration'
+ example:
+ name: abc-agents-pool
+ minimumSize: 10
+ maximumSize: 20
+ capabilities:
+ - os=linux
+ - jdk=11
+ - team-abc
+ orderIndex: 1
+ restrictAccessToProjectGroups: false
+ projectGroupIds: []
+ responses:
+ '200':
+ description: A new Agent Pool was created with the configuration specified in the request.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolConfigurationWithId'
+ example:
+ id: m4yfaq4a
+ name: abc-agents-pool
+ minimumSize: 10
+ maximumSize: 20
+ capabilities:
+ - os=linux
+ - jdk=11
+ - team-abc
+ orderIndex: 1
+ restrictAccessToProjectGroups: false
+ projectGroupIds: []
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/test-distribution/agent-pools/{poolId}:
+ parameters:
+ - in: path
+ name: poolId
+ example: m4yfaq4a
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolId'
+ required: true
+ description: The ID of the pool to view.
+ get:
+ operationId: GetTestDistributionAgentPool
+ summary: View the properties of an Agent Pool
+ description: View the identifier, capabilities and size of an Agent Pool.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The poolId referenced an existing Agent Pool whose configuration is described in the response.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolConfigurationWithId'
+ example:
+ id: m4yfaq4a
+ name: abc-agents-pool
+ minimumSize: 10
+ maximumSize: 20
+ capabilities:
+ - os=linux
+ - jdk=11
+ - team-abc
+ orderIndex: 1
+ restrictAccessToProjectGroups: false
+ projectGroupIds: []
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ put:
+ operationId: CreateOrUpdateTestDistributionAgentPool
+ summary: Create or update an Agent Pool.
+ description: |
+ Create a new Agent Pool in Develocity or update the configuration of an existing one.
+ The orderIndex element is optional and can be used to specify the priority order in which the Agent Pool is considered.
+ When not specified, the Agent Pool will be either added last on creation, or will not change position on update.
+ When specified, the Agent Pool will be added at/moved to the specified index and all other Agent Pools will be moved down.
+ If the specified index is out of bounds, the Agent Pool will be added last with the orderIndex adjusted accordingly.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolConfiguration'
+ example:
+ name: abc-agents-pool
+ minimumSize: 10
+ maximumSize: 20
+ capabilities:
+ - os=linux
+ - jdk=11
+ - team-abc
+ orderIndex: 1
+ restrictAccessToProjectGroups: false
+ projectGroupIds: []
+ responses:
+ '200':
+ description: The Agent Pool was created or its configuration was updated successfully.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolConfigurationWithId'
+ example:
+ id: m4yfaq4a
+ name: abc-agents-pool
+ minimumSize: 10
+ maximumSize: 20
+ capabilities:
+ - os=linux
+ - jdk=11
+ - team-abc
+ orderIndex: 1
+ restrictAccessToProjectGroups: false
+ projectGroupIds: []
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ delete:
+ operationId: DeleteTestDistributionAgentPool
+ summary: Delete an Agent Pool.
+ description: Delete an existing Agent Pool.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The poolId referenced an existing Agent Pool and it was deleted.
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/test-distribution/agent-pools/{poolId}/status:
+ parameters:
+ - in: path
+ name: poolId
+ example: m4yfaq4a
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolId'
+ required: true
+ description: The ID of the pool to view.
+ get:
+ operationId: GetTestDistributionAgentPoolStatus
+ summary: View the status of an Agent Pool
+ description: |
+ View the status of an Agent Pool, such as its current size.
+ To access this endpoint the user requires the `Test Distribution` permission.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The poolId referenced an existing Agent Pool whose status is described in the response.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolStatus'
+ example:
+ id: m4yfaq4a
+ name: abc-agents-pool
+ minimumSize: 10
+ maximumSize: 20
+ connectedAgents: 15
+ idleAgents: 5
+ desiredAgents: 10
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/test-distribution/agent-pools/{poolId}/registration-keys:
+ parameters:
+ - in: path
+ name: poolId
+ example: m4yfaq4a
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolId'
+ required: true
+ description: The ID of the pool to view.
+ get:
+ operationId: ListTestDistributionAgentPoolRegistrationKeys
+ summary: Lists Test Distribution pool-specific agent registration keys.
+ description: Returns a list of all Test Distribution pool-specific agent registration key prefixes.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The response contains a listing of the requested type of (active or revoked) Test Distribution pool-specific agent registration key.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolRegistrationKeyPrefixPage'
+ example:
+ content:
+ - keyPrefix: am3mbm5kamztbmrmygym5kamct
+ createdAt: '2021-01-01T12:59:59Z'
+ lastUsedAt: '2021-05-03T10:11:02Z'
+ lastUsedBy: agent1.localhost
+ - keyPrefix: yw3zbwjtnwthbxp3ym6ybxlnew
+ createdAt: '2021-04-20T13:21:43Z'
+ revokedAt: '2022-10-12T11:22:33Z'
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ post:
+ operationId: GenerateTestDistributionAgentPoolRegistrationKey
+ summary: Generate a new Test Distribution pool-specific agent registration key.
+ description: Generate a new Test Distribution pool-specific agent registration key to connect agents and query the agent pool API.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ requestBody:
+ required: false
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolRegistrationKeyDescription'
+ example:
+ description: Created by user-x for testing
+ responses:
+ '200':
+ description: A new registration key was successfully generated and contained in the response.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolRegistrationKey'
+ example:
+ key: 46rhyue2hltfwcx36qw7gad74lar4f2clb6a4qo5a433zzx7aqwq
+ description: Created by user-x for testing
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/test-distribution/agent-pools/{poolId}/registration-keys/{keyPrefix}:
+ parameters:
+ - in: path
+ name: poolId
+ example: m4yfaq4a
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolId'
+ required: true
+ description: The ID of the pool to view.
+ - in: path
+ name: keyPrefix
+ example: riux3fkajs6ivtajxbrunelywk
+ schema:
+ type: string
+ minLength: 26
+ maxLength: 26
+ pattern: ^[a-z2-7]{26}$
+ required: true
+ description: The prefix of the Test Distribution pool-specific agent registration key.
+ get:
+ operationId: GetTestDistributionAgentPoolRegistrationKey
+ summary: Get a Test Distribution pool-specific agent registration keyPrefix information.
+ description: Returns information about a Test Distribution pool-specific agent registration keyPrefix.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The response contains information about the requested Test Distribution pool-specific agent registration keyPrefix.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolRegistrationKeyPrefix'
+ example:
+ keyPrefix: am3mbm5kamztbmrmygym5kamct
+ description: Created by user-x for testing
+ createdAt: '2021-01-01T12:59:59Z'
+ lastUsedAt: '2021-05-03T10:11:02Z'
+ lastUsedBy: agent1.localhost
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ put:
+ operationId: InsertTestDistributionAgentPoolRegistrationKey
+ summary: Insert a specific Test Distribution pool-specific agent registration key.
+ description: |
+ Inserts a specific Test Distribution pool-specific agent registration key to connect agents and query the agent pool API.
+ If a key with the same prefix but different key already exists (regardless of which pool it belongs to), it will return 400.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolRegistrationKey'
+ example:
+ key: 46rhyue2hltfwcx36qw7gad74lar4f2clb6a4qo5a433zzx7aqwq
+ description: Created by user-x for testing
+ responses:
+ '200':
+ description: The registration key was successfully inserted.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionAgentPoolRegistrationKeyPrefix'
+ example:
+ keyPrefix: am3mbm5kamztbmrmygym5kamct
+ description: Created by user-x for testing
+ createdAt: '2021-01-01T12:59:59Z'
+ lastUsedAt: '2021-05-03T10:11:02Z'
+ lastUsedBy: agent1.localhost
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ delete:
+ operationId: RevokeTestDistributionAgentPoolRegistrationKey
+ summary: Revoke a Test Distribution pool-specific agent registration key.
+ description: |
+ Revoke the Test Distribution pool-specific agent registration key for the given prefix which uniquely identifies a Test Distribution pool-specific agent registration key.
+ A revoked key can no longer be used to connect agents, but it will still be queryable and returned in the list.
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The registration key was revoked successfully.
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/test-distribution/api-keys:
+ get:
+ operationId: ListTestDistributionApiKeys
+ summary: Lists Test Distribution API keys.
+ description: |
+ **This operation is deprecated. Migrate to pool-specific agent registration keys instead.**
+ Returns a list of all Test Distribution API key prefixes.
+ deprecated: true
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The response contains a listing of the requested type of (active or revoked) Test Distribution API keys.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionApiKeyPrefixPage'
+ example:
+ content:
+ - keyPrefix: am3mbm5kamztbmrmygym5kamct
+ generatedAt: '2021-01-01T12:59:59Z'
+ lastUsedAt: '2021-05-03T10:11:02Z'
+ lastUsedBy: agent1.localhost
+ - keyPrefix: yw3zbwjtnwthbxp3ym6ybxlnew
+ generatedAt: '2021-04-20T13:21:43Z'
+ revokedAt: '2022-10-12T11:22:33Z'
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ post:
+ operationId: GenerateTestDistributionApiKey
+ summary: Generate a new Test Distribution API key.
+ description: |
+ **This operation is deprecated. Migrate to pool-specific agent registration keys instead.**
+ Generate a new Test Distribution API key to connect agents and query the agent pool API.
+ deprecated: true
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ requestBody:
+ required: false
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionApiKeyDescription'
+ example:
+ description: Used to authenticate agents in pool 'pool-id'.
+ responses:
+ '200':
+ description: A new API key was successfully generated and contained in the response.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionApiKey'
+ example:
+ key: 46rhyue2hltfwcx36qw7gad74lar4f2clb6a4qo5a433zzx7aqwq
+ description: Used to authenticate agents in pool 'pool-id'.
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/test-distribution/api-keys/{keyPrefix}:
+ parameters:
+ - in: path
+ name: keyPrefix
+ example: riux3fkajs6ivtajxbrunelywk
+ schema:
+ type: string
+ minLength: 26
+ maxLength: 26
+ pattern: ^[a-z2-7]{26}$
+ required: true
+ description: The prefix of the Test Distribution API key.
+ get:
+ operationId: GetTestDistributionApiKey
+ summary: Get a Test Distribution API keyPrefix information.
+ description: |
+ **This operation is deprecated. Migrate to pool-specific agent registration keys instead.**
+ Returns information about a Test Distribution API keyPrefix.
+ deprecated: true
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The response contains information about the requested Test Distribution API keyPrefix.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionApiKeyPrefix'
+ example:
+ keyPrefix: am3mbm5kamztbmrmygym5kamct
+ description: Created by user-x for testing
+ generatedAt: '2021-01-01T12:59:59Z'
+ lastUsedAt: '2021-05-03T10:11:02Z'
+ lastUsedBy: agent1.localhost
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ put:
+ operationId: InsertTestDistributionApiKey
+ summary: Insert a specific Test Distribution API key.
+ description: |
+ **This operation is deprecated. Migrate to pool-specific agent registration keys instead.**
+ Inserts a specific Test Distribution API key to connect agents and query the agent pool API.
+ If a key with the same prefix but different key already exists, it will return 400.
+ deprecated: true
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionApiKey'
+ example:
+ key: 46rhyue2hltfwcx36qw7gad74lar4f2clb6a4qo5a433zzx7aqwq
+ description: Used to authenticate agents in pool 'pool-id'.
+ responses:
+ '200':
+ description: The API key was successfully inserted.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TestDistributionApiKeyPrefix'
+ example:
+ keyPrefix: am3mbm5kamztbmrmygym5kamct
+ description: Created by user-x for testing
+ generatedAt: '2021-01-01T12:59:59Z'
+ lastUsedAt: '2021-05-03T10:11:02Z'
+ lastUsedBy: agent1.localhost
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ delete:
+ operationId: RevokeTestDistributionApiKey
+ summary: Revoke a Test Distribution API key.
+ description: |
+ **This operation is deprecated. Migrate to pool-specific agent registration keys instead.**
+ Revoke the Test Distribution API key for the given prefix which uniquely identifies a Test Distribution API key.
+ A revoked key can no longer be used to connect agents, but it will still be queryable and returned in the list.
+ deprecated: true
+ tags:
+ - TestDistribution
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ description: The API key was revoked successfully.
+ '403':
+ $ref: '#/components/responses/ForbiddenError'
+ '404':
+ $ref: '#/components/responses/UnauthorizedOrNotFoundError'
+ /api/version:
+ get:
+ operationId: GetVersion
+ summary: Provides the version of Develocity.
+ description: This endpoint can be accessed by any authenticated user.
+ tags:
+ - Meta
+ - GradleEnterprise
+ - Develocity
+ responses:
+ '200':
+ $ref: '#/components/responses/SuccessfulVersionResponse'
+ '404':
+ $ref: '#/components/responses/NotFoundError'
+ '500':
+ $ref: '#/components/responses/UnexpectedError'
+components:
+ securitySchemes:
+ DevelocityAccessKeyOrToken:
+ type: http
+ scheme: bearer
+ bearerFormat: Bearer <>
+ description: |
+ All requests require a Develocity access key or token as a bearer token.
+ Given an access key of `l3an7wk3j4ze5v4mi7rvgjf2p7g44nvlswg4cpvdonjs7rzd4kmq`, the required header is `Authorization: Bearer l3an7wk3j4ze5v4mi7rvgjf2p7g44nvlswg4cpvdonjs7rzd4kmq`.
+
+ Please consult the [Develocity API User Manual](https://gradle.com/help/api-access-control) for guidance on how to provision access keys or tokens and check user permissions.
+ responses:
+ ForbiddenError:
+ description: The authenticated user has insufficient permissions.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/ApiProblem'
+ examples:
+ ForbiddenUserResponse:
+ $ref: '#/components/examples/ForbiddenUserExample'
+ SuccessfulVersionResponse:
+ description: Successful version response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DevelocityVersion'
+ BadRequestError:
+ description: The request cannot be fulfilled due to a problem.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/ApiProblem'
+ examples:
+ RequestValidationApiProblemResponse:
+ $ref: '#/components/examples/RequestValidationApiProblemExample'
+ NotFoundError:
+ description: The referenced resource either does not exist or the permissions to know about it are missing.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/ApiProblem'
+ examples:
+ NotFoundResponse:
+ $ref: '#/components/examples/NotFoundApiProblemExample'
+ UnexpectedError:
+ description: The server encountered an unexpected error.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/ApiProblem'
+ examples:
+ UnexpectedErrorResponse:
+ $ref: '#/components/examples/UnexpectedErrorApiProblemExample'
+ NotReadyError:
+ description: The server is not ready to handle the request.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/ApiProblem'
+ examples:
+ IngestionNotCompletedResponse:
+ $ref: '#/components/examples/IngestionNotCompletedApiProblemExample'
+ NodeNotSignedInError:
+ description: The node was not signed in with Develocity.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/ApiProblem'
+ examples:
+ NodeNotSignedInResponse:
+ $ref: '#/components/examples/NodeNotSignedInProblemExample'
+ UnauthorizedOrNotFoundError:
+ description: No API key was specified in the request, the key has been revoked, or the user bearing the key lacks permissions for this operation.
+ AccessTokenForbidden:
+ description: The current user or authenticating access token does not have sufficient access or lifetime to create the requested access token.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/ApiProblem'
+ examples:
+ MissingPermissionResponse:
+ value:
+ type: urn:gradle:enterprise:api:problems:forbidden
+ title: Missing requested permission.
+ detail: The permissions [administerGe] were requested for the access token, but were not granted to this user.
+ status: 403
+ MissingProjectResponse:
+ value:
+ type: urn:gradle:enterprise:api:problems:forbidden
+ title: Missing requested projects.
+ detail: The projects [project-a, project-b] were requested for the access token, but were not assigned to this user.
+ status: 403
+ InsufficientLifetimeResponse:
+ value:
+ type: urn:gradle:enterprise:api:problems:forbidden
+ title: Requested expiration exceeds current.
+ detail: The access token used to authenticate this request expires at 2024-02-14T01:44:51.225701Z, which is sooner than the requested expiration time of PT12H from now.
+ status: 403
+ BadRequest:
+ description: The request body is malformed or contains invalid values for at least one of the properties.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/ApiProblem'
+ examples:
+ CapabilityValidationProblemResponse:
+ $ref: '#/components/examples/CapabilityValidationProblemExample'
+ schemas:
+ DevelocityVersion:
+ title: DevelocityVersion
+ type: object
+ allOf:
+ - $ref: '#/components/schemas/GradleEnterpriseVersion'
+ GradleEnterpriseVersion:
+ title: GradleEnterpriseVersion
+ type: object
+ description: |
+ **This object is deprecated, use `DevelocityVersion` instead.**
+ deprecated: true
+ required:
+ - string
+ - year
+ - release
+ - patch
+ properties:
+ string:
+ type: string
+ description: The complete version string of format `YEAR.RELEASE.PATCH`, where the patch component is omitted when `0` (e.g. `2022.3`, `2022.3.1`).
+ year:
+ type: integer
+ description: The gregorian calendar year of the release.
+ release:
+ type: integer
+ description: The sequence number of the release for that year, starting with 1.
+ minimum: 1
+ patch:
+ type: integer
+ description: The patch level of the release, starting with 0.
+ minimum: 0
+ example:
+ '2022.3':
+ value:
+ string: '2022.3'
+ year: 2022
+ release: 3
+ patch: 0
+ 2022.3.1:
+ value:
+ string: 2022.3.1
+ year: 2022
+ release: 3
+ patch: 1
+ ApiProblem:
+ type: object
+ description: |
+ Response detailing why a request was rejected.
+ Adheres to the [RFC-7807](https://datatracker.ietf.org/doc/html/rfc7807) standard (colloquially known as "Problem JSON") for the response format.
+ required:
+ - type
+ - title
+ - status
+ properties:
+ status:
+ type: integer
+ description: HTTP status code of the problem response.
+ type:
+ type: string
+ description: A URN (Uniform Resource Name) identifying the type of the problem.
+ title:
+ type: string
+ description: The underlying reason for the problem.
+ detail:
+ type: string
+ description: A longer and comprehensive description of the problem. May be `null` if not available.
+ nullable: true
+ ProjectId:
+ type: string
+ description: The unique identifier for the project. Must not contain whitespace.
+ minLength: 1
+ maxLength: 256
+ pattern: ^\S+$
+ Permission:
+ type: string
+ description: A permission [config value](https://gradle.com/help/helm-admin-permissions).
+ minLength: 1
+ maxLength: 256
+ pattern: ^\S+$
+ BuildModelName:
+ description: Build model names that can be requested when fetching builds.
+ type: string
+ enum:
+ - gradle-attributes
+ - gradle-build-cache-performance
+ - gradle-projects
+ - gradle-network-activity
+ - gradle-artifact-transform-executions
+ - gradle-deprecations
+ - maven-attributes
+ - maven-build-cache-performance
+ - maven-modules
+ - maven-dependency-resolution
+ BuildModelNames:
+ description: |
+ The list of build models to return in the response for each build.
+ If not provided, no models are returned.
+ type: array
+ items:
+ $ref: '#/components/schemas/BuildModelName'
+ BuildAttributesValue:
+ type: object
+ description: A Build Scan value.
+ required:
+ - name
+ properties:
+ name:
+ type: string
+ description: The name of the Build Scan value.
+ value:
+ type: string
+ description: The value of the Build Scan value. `null` if the Build Scan value is not set.
+ BuildAttributesLink:
+ type: object
+ description: A Build Scan link.
+ required:
+ - label
+ - url
+ properties:
+ label:
+ type: string
+ description: The label of the Build Scan link.
+ url:
+ type: string
+ description: The url of the Build Scan link.
+ GradleGradleEnterpriseSettings:
+ type: object
+ description: |
+ **This property is deprecated, use `develocitySettings` instead.**
+ Settings for Develocity.
+ deprecated: true
+ properties:
+ backgroundPublicationEnabled:
+ type: boolean
+ description: Indicates whether background Build Scan publication is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.4`. See https://gradle.com/help/gradle-plugin-configuring-background-uploading.
+ nullable: true
+ buildOutputCapturingEnabled:
+ type: boolean
+ description: Indicates whether build logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs.
+ nullable: true
+ taskInputsFileCapturingEnabled:
+ type: boolean
+ description: Indicates whether task input file snapshots capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`. See https://gradle.com/help/gradle-plugin-capturing-task-input-files.
+ nullable: true
+ testOutputCapturingEnabled:
+ type: boolean
+ description: Indicates whether test logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs.
+ nullable: true
+ GradleDevelocitySettings:
+ type: object
+ description: Settings for Develocity.
+ properties:
+ backgroundPublicationEnabled:
+ type: boolean
+ description: Indicates whether background Build Scan publication is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.4`. See https://gradle.com/help/gradle-plugin-configuring-background-uploading.
+ nullable: true
+ buildOutputCapturingEnabled:
+ type: boolean
+ description: Indicates whether build logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs.
+ nullable: true
+ fileFingerprintCapturingEnabled:
+ type: boolean
+ description: Indicates whether file fingerprint capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`. See https://docs.gradle.com/enterprise/gradle-plugin/#capturing_task_input_files.
+ nullable: true
+ taskInputsFileCapturingEnabled:
+ deprecated: true
+ type: boolean
+ description: |
+ Indicates whether task input file snapshots capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`. See https://gradle.com/help/gradle-plugin-capturing-task-input-files.
+ **This property is deprecated, use `fileFingerprintCapturingEnabled` instead.**
+ nullable: true
+ testOutputCapturingEnabled:
+ type: boolean
+ description: Indicates whether test logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs.
+ nullable: true
+ GradleBuildOptions:
+ type: object
+ description: Gradle build options for this build.
+ required:
+ - configurationOnDemandEnabled
+ - continuousBuildEnabled
+ - continueOnFailureEnabled
+ - daemonEnabled
+ - dryRunEnabled
+ - excludedTasks
+ - maxNumberOfGradleWorkers
+ - offlineModeEnabled
+ - parallelProjectExecutionEnabled
+ - refreshDependenciesEnabled
+ - rerunTasksEnabled
+ properties:
+ buildCacheEnabled:
+ type: boolean
+ description: Indicates whether the build cache is enabled for the build. `null` if Gradle version is < `3.1` or Develocity Gradle plugin version is < `1.3`. See https://docs.gradle.org/current/javadoc/org/gradle/StartParameter.html#isBuildCacheEnabled--.
+ nullable: true
+ configurationCacheEnabled:
+ type: boolean
+ description: Indicates whether the configuration cache is enabled for the build. `null` if Gradle version is < `6.6` or Develocity Gradle plugin version is < `3.4`. See https://docs.gradle.org/current/userguide/configuration_cache.html.
+ nullable: true
+ configurationOnDemandEnabled:
+ type: boolean
+ description: Indicates whether configuration on demand mode is enabled for the build. See https://docs.gradle.org/current/userguide/multi_project_configuration_and_execution.html#sec:configuration_on_demand.
+ continuousBuildEnabled:
+ type: boolean
+ description: Indicates whether continuous build mode is running for the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:continuous_build.
+ continueOnFailureEnabled:
+ type: boolean
+ description: Indicates whether continue on failure mode is set for the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:continue_build_on_failure.
+ daemonEnabled:
+ type: boolean
+ description: Indicates whether the build is run with the Gradle Daemon. See https://docs.gradle.org/current/userguide/gradle_daemon.html.
+ dryRunEnabled:
+ type: boolean
+ description: Indicates whether the dry run flag is set for the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:command_line_execution_options.
+ excludedTasks:
+ type: array
+ items:
+ type: string
+ description: The list of excluded tasks. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:excluding_tasks_from_the_command_line.
+ fileSystemWatchingEnabled:
+ type: boolean
+ description: Indicates whether file system watching is enabled for the build. `null` if Gradle version is < `6.6` or Develocity Gradle plugin version is < `3.4`. See https://docs.gradle.org/current/userguide/file_system_watching.html.
+ nullable: true
+ maxNumberOfGradleWorkers:
+ type: integer
+ description: The maximum number of build workers used to run the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:command_line_performance.
+ offlineModeEnabled:
+ type: boolean
+ description: Indicates whether the offline mode is set for the build. See https://docs.gradle.org/current/userguide/dynamic_versions.html#sec:offline-mode.
+ parallelProjectExecutionEnabled:
+ type: boolean
+ description: Indicates whether parallel project execution is enabled for the build. See https://docs.gradle.org/current/userguide/multi_project_configuration_and_execution.html#sec:parallel_execution.
+ refreshDependenciesEnabled:
+ type: boolean
+ description: Indicates whether the build is set to refresh all dependencies in the dependency cache. See https://docs.gradle.org/current/userguide/dynamic_versions.html#sec:refreshing-dependencies.
+ rerunTasksEnabled:
+ type: boolean
+ description: Indicates whether the build is forced to run all the tasks, ignoring any up-to-date checks. https://docs.gradle.org/current/userguide/command_line_interface.html#sec:rerun_tasks.
+ BuildAttributesEnvironment:
+ type: object
+ description: The environment where the build is executed.
+ required:
+ - operatingSystem
+ - numberOfCpuCores
+ - jreVersion
+ - jvmVersion
+ - jvmMaxMemoryHeapSize
+ - jvmLocale
+ properties:
+ username:
+ type: string
+ description: Operating system username of the build user. `null` if no username is captured.
+ nullable: true
+ operatingSystem:
+ type: string
+ description: Operating system of the build machine.
+ numberOfCpuCores:
+ type: integer
+ description: Number of cores available to the build JVM.
+ jreVersion:
+ type: string
+ description: Version of the Java runtime executing the build.
+ jvmVersion:
+ type: string
+ description: Version of the Java Virtual Machine executing the build.
+ jvmMaxMemoryHeapSize:
+ type: integer
+ format: int64
+ description: Maximum heap memory available to the build JVM in bytes.
+ jvmCharset:
+ type: string
+ description: The default charset of the JVM executing the build. `null` if capturing is not possible.
+ nullable: true
+ jvmLocale:
+ type: string
+ description: The locale of the JVM executing the build.
+ publicHostname:
+ type: string
+ description: The hostname of the build machine, as seen on the network. `null` if capturing is not possible.
+ nullable: true
+ localHostname:
+ type: string
+ description: The hostname of the build machine, as specified by itself. `null` if capturing is not possible.
+ nullable: true
+ localIpAddresses:
+ type: array
+ items:
+ type: string
+ description: The local IP addresses of the build machine. `null` if capturing is not possible.
+ nullable: true
+ GradleAttributes:
+ type: object
+ description: The attributes of a Gradle build.
+ required:
+ - id
+ - buildStartTime
+ - buildDuration
+ - gradleVersion
+ - pluginVersion
+ - requestedTasks
+ - hasFailed
+ - tags
+ - values
+ - links
+ - gradleEnterpriseSettings
+ - develocitySettings
+ - buildOptions
+ - environment
+ properties:
+ id:
+ type: string
+ description: The Build Scan ID.
+ buildStartTime:
+ type: integer
+ format: int64
+ description: The time when the build starts, as milliseconds since Epoch.
+ buildDuration:
+ type: integer
+ format: int64
+ description: The duration of the build, as milliseconds since Epoch.
+ gradleVersion:
+ type: string
+ description: The Gradle version used.
+ pluginVersion:
+ type: string
+ description: The Develocity Gradle plugin version used.
+ rootProjectName:
+ type: string
+ description: The root project name. `null` in case of very early build failure.
+ nullable: true
+ requestedTasks:
+ type: array
+ items:
+ type: string
+ description: The list of requested tasks.
+ hasFailed:
+ type: boolean
+ description: True when the build fails, false otherwise.
+ hasVerificationFailure:
+ type: boolean
+ description: |
+ Set only if the build fails: true when the build has at least one failure classified as "Verification", false otherwise. The Verification classification is meant for failures that are expected within a standard application development lifecycle. They typically represent a problem with the developer’s inputs to the build such as the source code.
+ hasNonVerificationFailure:
+ type: boolean
+ description: |
+ Set only if the build failed: true when the build has at least one failure classified as "Non-verification", false otherwise. The Non-verification classification is meant for failures that are typically not expected within a standard application development lifecycle, such as build configuration failures, dependency resolution failures, and infrastructure failures.
+ tags:
+ type: array
+ items:
+ type: string
+ description: The list of Build Scan tags.
+ values:
+ type: array
+ items:
+ $ref: '#/components/schemas/BuildAttributesValue'
+ description: The list of Build Scan values.
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/BuildAttributesLink'
+ description: The list of Build Scan links.
+ gradleEnterpriseSettings:
+ $ref: '#/components/schemas/GradleGradleEnterpriseSettings'
+ description: |
+ **This property is deprecated, use `develocitySettings` instead.**
+ Settings for Develocity.
+ deprecated: true
+ develocitySettings:
+ $ref: '#/components/schemas/GradleDevelocitySettings'
+ buildOptions:
+ $ref: '#/components/schemas/GradleBuildOptions'
+ environment:
+ $ref: '#/components/schemas/BuildAttributesEnvironment'
+ GradleBuildCachePerformanceTaskExecutionEntry:
+ type: object
+ required:
+ - taskPath
+ - taskType
+ - avoidanceOutcome
+ - duration
+ properties:
+ taskPath:
+ type: string
+ description: The full task path.
+ taskType:
+ type: string
+ description: The fully qualified class name of the task.
+ avoidanceOutcome:
+ type: string
+ enum:
+ - avoided_up_to_date
+ - avoided_from_local_cache
+ - avoided_from_remote_cache
+ - executed_cacheable
+ - executed_not_cacheable
+ - executed_unknown_cacheability
+ - avoided_unknown_reason
+ - lifecycle
+ - no-source
+ - skipped
+ description: |
+ The avoidance outcome of this task with respect to performance:
+ * `avoided_up_to_date` - Task whose execution is avoided due to build incrementalism
+ * `avoided_from_local_cache` - Task whose execution is avoided due to reusing a local build cache entry
+ * `avoided_from_remote_cache` - Task whose execution is avoided due to reusing a remote build cache entry
+ * `executed_cacheable` - Task which is executed but is cacheable
+ * `executed_not_cacheable` - Task which is executed but is not cacheable
+ * `executed_unknown_cacheability` - Task which is executed and whose cacheability can not be determined
+ * `avoided_unknown_reason` - Task which was avoided for an unknown reason
+ * `lifecycle` - Lifecycle task
+ * `no-source` - No-source task
+ * `skipped` - Skipped task
+ duration:
+ type: integer
+ format: int64
+ description: The task duration in milliseconds.
+ fingerprintingDuration:
+ type: integer
+ format: int64
+ description: The task fingerprinting duration in milliseconds. This duration is part of the complete task execution duration. `null` if the task is not fingerprinted, or the information is not available.
+ nullable: true
+ avoidanceSavings:
+ type: integer
+ format: int64
+ description: The task avoidance savings in milliseconds, which can be negative. Negative values indicate that it takes more time to reuse outputs than it did to create them originally. `null` if the information is not available.
+ nullable: true
+ nonCacheabilityCategory:
+ type: string
+ enum:
+ - build_cache_not_enabled
+ - cache-if_condition_not_matched
+ - disabled_to_ensure_correctness
+ - do-not-cache-if_condition_matched
+ - multiple_outputs_declared
+ - no_outputs_declared
+ - non_cacheable_inputs
+ - non_cacheable_task_action
+ - non_cacheable_task_implementation
+ - non_cacheable_tree_output
+ - overlapping_outputs
+ - task_has_no_actions
+ - task_output_caching_not_enabled
+ - unknown
+ description: |
+ The category of the non-cacheability reason:
+ * `build_cache_not_enabled` - Caching is not enabled for the build
+ * `cache-if_condition_not_matched` - Caching is disabled for the task via `org.gradle.api.tasks.TaskOutputs#cacheIf`
+ * `disabled_to_ensure_correctness` - The task failed validation. Available since Gradle 7.0
+ * `do-not-cache-if_condition_matched` - Caching is disabled for the task via `org.gradle.api.tasks.TaskOutputs#doNotCacheIf`
+ * `multiple_outputs_declared` - The task declares multiple outputs
+ * `no_outputs_declared` - The task has no outputs declared
+ * `non_cacheable_inputs` - One of the task inputs is not cacheable, either because some type used as an input to the task is loaded via a custom classloader, or a Java lambda is used as an input. Available since Gradle 5.0 and before Gradle 7.5
+ * `non_cacheable_task_action` - One of the task actions is not cacheable, either because it is loaded via a custom classloader, or a Java lambda is used to implement it. Available since Gradle 5.0 and before Gradle 7.5
+ * `non_cacheable_task_implementation` - The task implementation is not cacheable, either because it is loaded via a custom classloader, or a Java lambda is used to implement it. Available since Gradle 5.0 and before Gradle 7.5
+ * `non_cacheable_tree_output` - The task has a `org.gradle.api.file.FileTree` or a `org.gradle.api.internal.file.collections.DirectoryFileTree` as an output. Available since Gradle 5.0
+ * `overlapping_outputs` - The tasks outputs overlaps with another task. As Gradle cannot safely determine which task each output file belongs to, it disables caching
+ * `task_has_no_actions` - The task does not declare any actions
+ * `task_output_caching_not_enabled` - Caching is not enabled for the task
+ * `unknown` - Reason for disabled caching is not known
+
+ `null` when the task is cacheable or if the information is not available.
+ nullable: true
+ nonCacheabilityReason:
+ type: string
+ description: The human-readable reason for a non-cacheable task. `null` when the task is cacheable or if the information is not available.
+ nullable: true
+ skipReasonMessage:
+ type: string
+ description: The detailed reason why the task is skipped. `null` if the task is not skipped or Gradle versions <7.6 are used.
+ nullable: true
+ cacheArtifactSize:
+ type: integer
+ format: int64
+ description: |
+ The number of bytes of the produced or consumed cache artifact.
+ For a task execution where the outputs are successfully stored to a local or remote cache, this is the size of the stored cache artifact. For a task execution where the outputs are successfully loaded from a local or remote cache, this is the size of the loaded cache artifact.
+ `null` if the task is not cacheable, or if the attempt to store or load the artifact from cache does not succeed.
+ nullable: true
+ cacheArtifactRejectedReason:
+ description: |
+ The reason why the cache artifact is rejected:
+ * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept.
+
+ The value is `null` if the task is not cacheable, or if the attempt to store the artifact does not succeed.
+ nullable: true
+ type: string
+ enum:
+ - artifact_size_too_large
+ cacheKey:
+ type: string
+ description: The build cache key. `null` if no build cache key was computed (e.g. when the task is skipped).
+ nullable: true
+ GradleBuildCachePerformanceTaskExecution:
+ type: array
+ description: A list of executed tasks with performance related information.
+ items:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceTaskExecutionEntry'
+ GradleBuildCachePerformanceTaskFingerprintingSummary:
+ type: object
+ description: A summary of task fingerprinting. Fingerprinted tasks are part of the `taskExecution.avoidedTasks` or `taskExecution.executedTasks`, or `taskExecution.noSourceTasks` buckets. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`.
+ nullable: true
+ required:
+ - count
+ - serialDuration
+ properties:
+ count:
+ type: integer
+ description: Count of fingerprinted tasks.
+ serialDuration:
+ type: integer
+ format: int64
+ description: Sum of all fingerprinting times of fingerprinted tasks in milliseconds.
+ GradleBuildCachePerformanceWorkUnitFingerprintingSummary:
+ type: object
+ description: A summary of task and artifact transform fingerprinting. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`.
+ nullable: true
+ required:
+ - count
+ - serialDuration
+ properties:
+ count:
+ type: integer
+ description: Count of fingerprinted work units.
+ serialDuration:
+ type: integer
+ format: int64
+ description: Sum of all fingerprinting times of fingerprinted work units in milliseconds.
+ GradleBuildCachePerformanceAvoidanceSavingsSummary:
+ type: object
+ description: |
+ **This is deprecated, use `GradleBuildCachePerformanceTaskAvoidanceSavingsSummary` instead.**
+ A breakdown of avoidance savings.
+ deprecated: true
+ required:
+ - total
+ - ratio
+ - upToDate
+ - localBuildCache
+ - remoteBuildCache
+ properties:
+ total:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the tasks due to their outputs being reused in milliseconds.
+ ratio:
+ type: number
+ format: double
+ description: The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build.
+ upToDate:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the tasks due to build incrementalism in milliseconds.
+ localBuildCache:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the tasks due to their outputs being reused from the local build cache in milliseconds.
+ remoteBuildCache:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the tasks due to their outputs being reused from the remote build cache in milliseconds.
+ GradleBuildCachePerformanceTaskAvoidanceSavingsSummary:
+ type: object
+ description: A breakdown of avoidance savings for tasks.
+ required:
+ - total
+ - ratio
+ - upToDate
+ - localBuildCache
+ - remoteBuildCache
+ properties:
+ total:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the tasks due to their outputs being reused in milliseconds.
+ ratio:
+ type: number
+ format: double
+ description: The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build.
+ upToDate:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the tasks due to build incrementalism in milliseconds.
+ localBuildCache:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the tasks due to their outputs being reused from the local build cache in milliseconds.
+ remoteBuildCache:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the tasks due to their outputs being reused from the remote build cache in milliseconds.
+ GradleBuildCachePerformanceWorkUnitAvoidanceSavingsSummary:
+ type: object
+ description: A breakdown of avoidance savings for tasks and artifact transforms.
+ required:
+ - total
+ - ratio
+ - upToDate
+ - localBuildCache
+ - remoteBuildCache
+ properties:
+ total:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the work units due to their outputs being reused in milliseconds.
+ ratio:
+ type: number
+ format: double
+ description: The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build.
+ upToDate:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the work units due to build incrementalism in milliseconds.
+ localBuildCache:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the work units due to their outputs being reused from the local build cache in milliseconds.
+ remoteBuildCache:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the work units due to their outputs being reused from the remote build cache in milliseconds.
+ GradleBuildCachePerformanceBuildCacheLocalInfo:
+ type: object
+ description: Information about the local build cache used in the build.
+ required:
+ - isEnabled
+ properties:
+ isEnabled:
+ type: boolean
+ description: Indicates whether the local build cache is enabled.
+ isPushEnabled:
+ type: boolean
+ description: Indicates whether pushing to the local build cache is enabled. `null` if the local build cache is disabled.
+ nullable: true
+ isDisabledDueToError:
+ type: boolean
+ description: Indicates whether the local cache is disabled due to an error occurring in loading or storing local build cache entries. `null` if the local build cache is disabled.
+ directory:
+ type: string
+ description: Location of the local build cache. Can be relative or absolute depending on its value. `null` if the local build cache is disabled.
+ nullable: true
+ GradleBuildCachePerformanceBuildCacheRemoteInfo:
+ type: object
+ description: Information about the remote build cache used in the build.
+ required:
+ - isEnabled
+ properties:
+ type:
+ type: string
+ description: The type of the connector used to communicate with the remote build cache. `null` if the remote build cache is disabled.
+ nullable: true
+ className:
+ type: string
+ description: The class name of the connector. `null` if the remote build cache is disabled.
+ nullable: true
+ isEnabled:
+ type: boolean
+ description: Indicates whether the remote build cache is enabled.
+ isPushEnabled:
+ type: boolean
+ description: Indicates whether pushing to the remote build cache is enabled. `null` if the remote build cache is disabled.
+ nullable: true
+ isDisabledDueToError:
+ type: boolean
+ description: Indicates whether the remote build cache is disabled during the build due to an error occurring in loading or storing remote build cache entries. `null` if the remote build cache is disabled.
+ url:
+ type: string
+ description: URL of the remote build cache. `null` if the remote build cache is disabled or if the given type is not supported or it doesn't have the concept of a URL.
+ nullable: true
+ GradleBuildCachePerformanceBuildCacheOverhead:
+ type: object
+ description: Information about the build cache overhead in this build.
+ required:
+ - uploading
+ - downloading
+ - packing
+ - unpacking
+ properties:
+ uploading:
+ type: integer
+ format: int64
+ description: Overhead of upload operations in milliseconds.
+ downloading:
+ type: integer
+ format: int64
+ description: Overhead of download operations in milliseconds.
+ packing:
+ type: integer
+ format: int64
+ description: Overhead of pack operations in milliseconds.
+ unpacking:
+ type: integer
+ format: int64
+ description: Overhead of unpack operations in milliseconds.
+ GradleBuildCachePerformanceBuildCaches:
+ type: object
+ description: Information about the local and remote build caches used in the build. `null` if the build cache is globally disabled.
+ nullable: true
+ required:
+ - local
+ - remote
+ - overhead
+ properties:
+ local:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceBuildCacheLocalInfo'
+ remote:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceBuildCacheRemoteInfo'
+ overhead:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceBuildCacheOverhead'
+ GradleBuildCachePerformance:
+ type: object
+ description: The build cache performance of a Gradle build.
+ required:
+ - id
+ - buildTime
+ - effectiveTaskExecutionTime
+ - effectiveWorkUnitExecutionTime
+ - serialTaskExecutionTime
+ - serialWorkUnitExecutionTime
+ - serializationFactor
+ - taskExecution
+ - avoidanceSavingsSummary
+ - taskAvoidanceSavingsSummary
+ - workUnitAvoidanceSavingsSummary
+ properties:
+ id:
+ type: string
+ description: The Build Scan ID.
+ buildTime:
+ type: integer
+ format: int64
+ description: Wall clock duration of the build in milliseconds.
+ effectiveTaskExecutionTime:
+ type: integer
+ format: int64
+ description: Wall clock time spent executing tasks in milliseconds. It is the time spent between the start of the first task in the execution phase and the end of the last task of the execution phase, removing any interval where no task is being executed.
+ effectiveWorkUnitExecutionTime:
+ type: integer
+ format: int64
+ description: Wall clock time spent executing work units (tasks and artifact transforms) in milliseconds. It is the time spent between the start of the first work unit in the execution phase and the end of the last work unit of the execution phase, removing any interval where no work unit is being executed.
+ serialTaskExecutionTime:
+ type: integer
+ format: int64
+ description: Wall clock time of all task executions in milliseconds. It is the sum of all individual task durations.
+ serialWorkUnitExecutionTime:
+ type: integer
+ format: int64
+ description: Wall clock time of all work unit executions (tasks and artifact transforms) in milliseconds. It is the sum of all individual work unit durations.
+ serializationFactor:
+ type: number
+ format: double
+ description: The ratio of `serialWorkUnitExecutionTime` over the `effectiveWorkUnitExecutionTime`. Quantifies the effect of work unit parallelization. A value equal to `1` means that no parallelization occurred. A value greater than `1` means that work units are executed faster due to parallelization.
+ taskExecution:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceTaskExecution'
+ taskFingerprintingSummary:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceTaskFingerprintingSummary'
+ workUnitFingerprintingSummary:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceWorkUnitFingerprintingSummary'
+ avoidanceSavingsSummary:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceAvoidanceSavingsSummary'
+ taskAvoidanceSavingsSummary:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceTaskAvoidanceSavingsSummary'
+ workUnitAvoidanceSavingsSummary:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceWorkUnitAvoidanceSavingsSummary'
+ buildCaches:
+ $ref: '#/components/schemas/GradleBuildCachePerformanceBuildCaches'
+ GradleProject:
+ type: object
+ description: A Gradle project.
+ required:
+ - name
+ - path
+ properties:
+ name:
+ type: string
+ description: The name of the project.
+ path:
+ type: string
+ description: The path of the project.
+ parent:
+ type: integer
+ nullable: true
+ description: The index of the parent of this Gradle project in the GradleProjects array. `null` if this project has no parent (i.e. root project of a build).
+ GradleProjects:
+ type: array
+ items:
+ $ref: '#/components/schemas/GradleProject'
+ description: List of Gradle projects including structural relationships.
+ GradleNetworkActivity:
+ type: object
+ description: Information about the network activity of the build. It includes network activity during dependency resolution, java toolchain downloads, etc. For a comprehensive list see the Build Scan.
+ required:
+ - networkRequestCount
+ - serialNetworkRequestTime
+ - fileDownloadSize
+ - fileDownloadCount
+ properties:
+ networkRequestCount:
+ description: This represents the total count of network requests.
+ format: int64
+ type: integer
+ minimum: 0
+ serialNetworkRequestTime:
+ description: The duration in milliseconds representing the sum of times for potentially parallel network requests. It does not reflect wall clock time but offers a rough estimation of network activity.
+ format: int64
+ type: integer
+ minimum: 0
+ wallClockNetworkRequestTime:
+ description: |
+ The estimate in milliseconds representing the wall clock time spent on network requests during the current build. It is calculated by comparing the critical path within non-execution and execution phases with and without network requests, converted to wall clock time. This is null when Gradle version is lower than 6.2 or the Develocity plugin version is lower than 3.12.
+ format: int64
+ type: integer
+ minimum: 0
+ fileDownloadSize:
+ type: integer
+ format: int64
+ minimum: 0
+ description: The total number of bytes downloaded for dependencies. It accounts only for the bytes of the files (e.g. POMs, JARs) downloaded and not the total network transfer.
+ fileDownloadCount:
+ type: integer
+ format: int64
+ minimum: 0
+ description: The total number of successfully downloaded files.
+ GradleArtifactTransformAttribute:
+ type: object
+ required:
+ - name
+ - from
+ - to
+ properties:
+ name:
+ type: string
+ description: The name of the attribute.
+ from:
+ type: string
+ description: The input attribute value.
+ to:
+ type: string
+ description: The requested attributed value.
+ GradleArtifactTransformExecutionEntry:
+ type: object
+ required:
+ - artifactTransformExecutionName
+ - transformActionType
+ - inputArtifactName
+ - changedAttributes
+ - outcome
+ - avoidanceOutcome
+ - duration
+ properties:
+ artifactTransformExecutionName:
+ type: string
+ description: Artifact transform execution name.
+ transformActionType:
+ type: string
+ description: The fully qualified class name of the artifact transform action.
+ inputArtifactName:
+ type: string
+ description: The name of the input artifact transformed by this transform.
+ changedAttributes:
+ type: array
+ description: The list of changed attributes merged from all transform execution requests.
+ items:
+ $ref: '#/components/schemas/GradleArtifactTransformAttribute'
+ outcome:
+ type: string
+ enum:
+ - failed
+ - success
+ - from_cache
+ - up_to_date
+ - unknown
+ - skipped
+ description: |
+ The outcome of this artifact transform execution:
+ * `failed` - Artifact transform execution which failed
+ * `success` - Artifact transform execution which was successfully executed
+ * `from_cache` - Artifact transform execution which was taken from cache
+ * `up_to_date` - Artifact transform execution which was up-to-date
+ * `unknown` - Artifact transform execution whose outcome is unknown
+ * `skipped` - Artifact transform execution which was skipped. **This is not emitted anymore, replaced by `up_to_date`.**
+ avoidanceOutcome:
+ type: string
+ enum:
+ - avoided_up_to_date
+ - avoided_from_local_cache
+ - avoided_from_remote_cache
+ - executed_cacheable
+ - executed_not_cacheable
+ - executed_unknown_cacheability
+ - avoided_unknown_cachebility
+ - avoided_unknown_reason
+ - skipped
+ description: |
+ The avoidance outcome of this artifact transform execution with respect to performance:
+ * `avoided_up_to_date` - Artifact transform execution whose execution is avoided due to build incrementalism
+ * `avoided_from_local_cache` - Artifact transform execution whose execution is avoided due to reusing a local build cache entry
+ * `avoided_from_remote_cache` - Artifact transform execution whose execution is avoided due to reusing a remote build cache entry
+ * `executed_cacheable` - Artifact transform execution which is executed but is cacheable
+ * `executed_not_cacheable` - Artifact transform execution which is executed but is not cacheable
+ * `executed_unknown_cacheability` - Artifact transform execution which is executed and whose cacheability can not be determined
+ * `avoided_unknown_reason` - Artifact transform execution which was avoided for an unknown reason
+ * `skipped` - Skipped artifact transform execution. **This is not emitted anymore, replaced by `up_to_date`.**
+ duration:
+ type: integer
+ format: int64
+ description: The artifact transform execution duration in milliseconds.
+ fingerprintingDuration:
+ type: integer
+ format: int64
+ description: The artifact transform execution fingerprinting duration in milliseconds. This duration is part of the complete artifact transform execution duration. `null` if the artifact transform is not fingerprinted.
+ avoidanceSavings:
+ type: integer
+ format: int64
+ description: The artifact transform execution avoidance savings in milliseconds, which can be negative. Negative values indicate that it takes more time to reuse outputs than it did to create them originally. `null` if the information is not available.
+ nonCacheabilityCategory:
+ type: string
+ enum:
+ - build_cache_not_enabled
+ - disabled_to_ensure_correctness
+ - not_cacheable
+ - unknown
+ description: |
+ The category of the non-cacheability reason:
+ * `build_cache_not_enabled` - Caching is not enabled for the build
+ * `disabled_to_ensure_correctness` - The artifact transform failed validation
+ * `not_cacheable` - Caching is not enabled for this artifact transform
+ * `unknown` - Reason for disabled caching is not known
+
+ `null` when the artifact transform execution is cacheable
+ nullable: true
+ nonCacheabilityReason:
+ type: string
+ description: The human-readable reason for a non-cacheable artifact transform execution. `null` when the artifact transform execution is cacheable.
+ nullable: true
+ cacheArtifactSize:
+ type: integer
+ format: int64
+ description: |
+ The number of bytes of the produced or consumed cache artifact.
+ For an artifact transform execution where the outputs are successfully stored to a local or remote cache, this is the size of the stored cache artifact. For an artifact transform execution execution where the outputs are successfully loaded from a local or remote cache, this is the size of the loaded cache artifact.
+ `null` if the an artifact transform execution is not cacheable, or if the attempt to store or load the artifact from cache does not succeed.
+ nullable: true
+ cacheArtifactRejectedReason:
+ description: |
+ The reason why the cache artifact is rejected:
+ * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept.
+
+ The value is `null` if the transform execution is not cacheable, or if the attempt to store the artifact does not succeed.
+ enum:
+ - artifact_size_too_large
+ nullable: true
+ type: string
+ skipReasonMessage:
+ type: string
+ description: The detailed reason why the transform execution is skipped. `null` if the transform execution is not skipped.
+ nullable: true
+ cacheKey:
+ type: string
+ description: The build cache key. `null` if no build cache key was computed.
+ nullable: true
+ GradleArtifactTransformExecutions:
+ type: object
+ properties:
+ artifactTransformExecutions:
+ type: array
+ description: A list of executed artifact transforms with performance related information. `null` if artifact transform execution capturing is not supported.
+ nullable: true
+ items:
+ $ref: '#/components/schemas/GradleArtifactTransformExecutionEntry'
+ GradleDeprecationOwner:
+ type: object
+ required:
+ - type
+ properties:
+ location:
+ type: string
+ description: The location of the deprecation usage. Can be a plugin id, task path, script file path, script URI. `null` if the owner type is unknown.
+ nullable: true
+ type:
+ type: string
+ enum:
+ - plugin
+ - script
+ - task
+ - unknown
+ description: |
+ The type of the deprecation owner:
+ * `plugin` - The owner of the deprecation is a plugin.
+ * `script` - The owner of the deprecation is a script.
+ * `task` - The owner of the deprecation is a task.
+ * `unknown` - Unknown deprecation owner type when none of the other options match.
+ GradleDeprecationUsage:
+ type: object
+ required:
+ - owner
+ properties:
+ contextualAdvice:
+ type: string
+ description: Advice on how to avoid using the deprecated feature, that is specific to this particular usage. `null` when no advice is available.
+ nullable: true
+ owner:
+ $ref: '#/components/schemas/GradleDeprecationOwner'
+ description: Owner of the deprecation usage. `null` when no owner is available.
+ GradleDeprecationEntry:
+ type: object
+ required:
+ - summary
+ - removalDetails
+ - usages
+ properties:
+ summary:
+ type: string
+ description: The description of the deprecation.
+ removalDetails:
+ type: string
+ description: The details about when the deprecated feature will be removed from Gradle.
+ advice:
+ type: string
+ description: The advice on how to avoid using the deprecated feature. `null` when no advice is available.
+ nullable: true
+ documentationUrl:
+ type: string
+ description: The external url pointing to some documentation about the deprecation. `null` for older Gradle/plugin combination or certain deprecation notices.
+ nullable: true
+ usages:
+ type: array
+ description: List of usages of this deprecation.
+ items:
+ $ref: '#/components/schemas/GradleDeprecationUsage'
+ GradleDeprecations:
+ type: object
+ properties:
+ deprecations:
+ type: array
+ description: A list of Gradle Build Tool deprecations with details and usage information. `null` if deprecation capturing is not supported.
+ nullable: true
+ items:
+ $ref: '#/components/schemas/GradleDeprecationEntry'
+ MavenGradleEnterpriseSettings:
+ type: object
+ description: |
+ **This property is deprecated, use `develocitySettings` instead.**
+ Settings for Develocity.
+ deprecated: true
+ properties:
+ backgroundPublicationEnabled:
+ type: boolean
+ description: Indicates whether background Build Scan publication is enabled for the build. `null` if Develocity Maven extension version is < `1.6`. See https://gradle.com/help/maven-extension-configuring-background-uploading.
+ nullable: true
+ buildOutputCapturingEnabled:
+ type: boolean
+ description: Indicates whether to capture build logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs.
+ nullable: true
+ goalInputsFileCapturingEnabled:
+ type: boolean
+ description: Indicates whether to capture goal input file snapshots for the build. `null` if Develocity Maven extension version is < `1.1`. See https://gradle.com/help/maven-extension-capturing-goal-input-files.
+ nullable: true
+ testOutputCapturingEnabled:
+ type: boolean
+ description: Indicates whether to capture test logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs.
+ nullable: true
+ MavenDevelocitySettings:
+ type: object
+ description: Settings for Develocity.
+ properties:
+ backgroundPublicationEnabled:
+ type: boolean
+ description: Indicates whether background Build Scan publication is enabled for the build. `null` if Develocity Maven extension version is < `1.6`. See https://gradle.com/help/maven-extension-configuring-background-uploading.
+ nullable: true
+ buildOutputCapturingEnabled:
+ type: boolean
+ description: Indicates whether to capture build logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs.
+ nullable: true
+ fileFingerprintCapturingEnabled:
+ type: boolean
+ description: Indicates whether file fingerprint capturing is enabled for the build. `null` if Develocity Maven extension version is < `1.1`. See https://docs.gradle.com/enterprise/maven-extension/current/#capturing_goal_input_files.
+ nullable: true
+ goalInputsFileCapturingEnabled:
+ type: boolean
+ description: |
+ Indicates whether to capture goal input file snapshots for the build. `null` if Develocity Maven extension version is < `1.1`. See https://gradle.com/help/maven-extension-capturing-goal-input-files.
+ **This property is deprecated, use `fileFingerprintCapturingEnabled` instead.**
+ nullable: true
+ testOutputCapturingEnabled:
+ type: boolean
+ description: Indicates whether to capture test logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs.
+ nullable: true
+ MavenBuildOptions:
+ type: object
+ description: Maven build options for this build.
+ required:
+ - errorsEnabled
+ - maxNumberOfThreads
+ - nonRecursiveEnabled
+ - noSnapshotsUpdatesEnabled
+ - offlineModeEnabled
+ - updateSnapshotsEnabled
+ properties:
+ batchModeEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to run in non-interactive (batch) mode. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#batch-mode.
+ nullable: true
+ debugEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to produce execution debug output. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#debug.
+ nullable: true
+ errorsEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to produce execution error messages. See https://maven.apache.org/ref/current/maven-embedder/cli.html#errors.
+ failAtEndEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to only fail at the end. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#fail-at-end.
+ nullable: true
+ failFastEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to fail at the first error. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#fail-fast.
+ nullable: true
+ failNeverEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to never fail, regardless of errors produced. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#fail-never.
+ nullable: true
+ laxChecksumsEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to only warn if checksums don't match. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#lax-checksums.
+ nullable: true
+ maxNumberOfThreads:
+ type: integer
+ description: Maximum number of threads used when executing the build. See https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3.
+ nonRecursiveEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to not recurse into sub-projects. See https://maven.apache.org/ref/current/maven-embedder/cli.html#non-recursive.
+ rerunGoals:
+ type: boolean
+ description: |
+ **This property is deprecated, use `rerunGoalsEnabled` instead.**
+ Indicates whether the build is configured to rerun goals without checking the build cache. `null` if Develocity Maven extension version is < `1.13`. See https://gradle.com/help/maven-extension-rerunning-goals.
+ nullable: true
+ deprecated: true
+ rerunGoalsEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to rerun goals without checking the build cache. `null` if Develocity Maven extension version is < `1.13`. See https://gradle.com/help/maven-extension-rerunning-goals.
+ nullable: true
+ noSnapshotsUpdatesEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to suppress snapshot updates. See https://maven.apache.org/ref/current/maven-embedder/cli.html#no-snapshot-updates.
+ offlineModeEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to run offline. See https://maven.apache.org/ref/current/maven-embedder/cli.html#offline.
+ quietEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to run in quiet mode. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#quiet.
+ nullable: true
+ strictChecksumsEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to fail if checksums don't match. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#strict-checksums.
+ nullable: true
+ updateSnapshotsEnabled:
+ type: boolean
+ description: Indicates whether the build is configured to force a check for missing releases and updated snapshots on remote repositories. See https://maven.apache.org/ref/current/maven-embedder/cli.html#update-snapshots.
+ MavenAttributes:
+ type: object
+ description: The attributes of a Maven build.
+ required:
+ - id
+ - buildStartTime
+ - buildDuration
+ - mavenVersion
+ - extensionVersion
+ - requestedGoals
+ - hasFailed
+ - tags
+ - values
+ - links
+ - gradleEnterpriseSettings
+ - develocitySettings
+ - buildOptions
+ - environment
+ properties:
+ id:
+ type: string
+ description: The Build Scan ID.
+ buildStartTime:
+ type: integer
+ format: int64
+ description: The time when the build starts, as milliseconds since Epoch.
+ buildDuration:
+ type: integer
+ format: int64
+ description: The duration of the build, as milliseconds since Epoch.
+ mavenVersion:
+ type: string
+ description: The Maven version used.
+ extensionVersion:
+ type: string
+ description: The Develocity Maven extension version used.
+ topLevelProjectName:
+ type: string
+ description: The top level project name. `null` in case of very early build failure.
+ nullable: true
+ requestedGoals:
+ type: array
+ items:
+ type: string
+ description: The list of requested goals.
+ hasFailed:
+ type: boolean
+ description: True when the build fails, false otherwise.
+ hasVerificationFailure:
+ type: boolean
+ description: |
+ Set only if the build fails: true when the build has at least one failure classified as "Verification", false otherwise. The Verification classification is meant for failures that are expected within a standard application development lifecycle. They typically represent a problem with the developer’s inputs to the build such as the source code.
+ hasNonVerificationFailure:
+ type: boolean
+ description: |
+ Set only if the build fails: true when the build has at least one failure classified as "Non-verification", false otherwise. The Non-verification classification is meant for failures that are typically not expected within a standard application development lifecycle, such as build configuration failures, dependency resolution failures, and infrastructure failures.
+ tags:
+ type: array
+ items:
+ type: string
+ description: The list of Build Scan tags.
+ values:
+ type: array
+ items:
+ $ref: '#/components/schemas/BuildAttributesValue'
+ description: The list of Build Scan values.
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/BuildAttributesLink'
+ description: The list of Build Scan links.
+ gradleEnterpriseSettings:
+ $ref: '#/components/schemas/MavenGradleEnterpriseSettings'
+ description: |
+ **This property is deprecated, use `develocitySettings` instead.**
+ Settings for Develocity.
+ deprecated: true
+ develocitySettings:
+ $ref: '#/components/schemas/MavenDevelocitySettings'
+ buildOptions:
+ $ref: '#/components/schemas/MavenBuildOptions'
+ environment:
+ $ref: '#/components/schemas/BuildAttributesEnvironment'
+ MavenBuildCachePerformanceGoalExecutionEntry:
+ type: object
+ required:
+ - goalName
+ - mojoType
+ - goalExecutionId
+ - goalProjectName
+ - avoidanceOutcome
+ - duration
+ properties:
+ goalName:
+ type: string
+ description: The goal name.
+ mojoType:
+ type: string
+ description: The fully qualified class name of the Mojo that provides the implementation of this goal.
+ goalExecutionId:
+ type: string
+ description: The goal execution ID.
+ goalProjectName:
+ type: string
+ description: The goal project name.
+ avoidanceOutcome:
+ type: string
+ enum:
+ - avoided_from_local_cache
+ - avoided_from_remote_cache
+ - executed_cacheable
+ - executed_not_cacheable
+ - executed_unknown_cacheability
+ - skipped
+ description: |
+ The avoidance outcome of this task with respect to performance:
+ * `avoided_from_local_cache` - Goal whose execution is avoided due to reusing a local build cache entry
+ * `avoided_from_remote_cache` - Goal whose execution is avoided due to reusing a remote build cache entry
+ * `executed_cacheable` - Goal which is executed but is cacheable
+ * `executed_not_cacheable` - Goal which is executed but is not cacheable
+ * `executed_unknown_cacheability` - Goal which is executed and whose cacheability cannot be determined
+ * `skipped` - Skipped goal
+ duration:
+ type: integer
+ format: int64
+ description: The goal duration in milliseconds.
+ fingerprintingDuration:
+ type: integer
+ format: int64
+ description: The goal fingerprinting duration in milliseconds. This duration is part of the complete task execution duration. `null` if the goal is not fingerprinted.
+ nullable: true
+ avoidanceSavings:
+ type: integer
+ format: int64
+ description: The goal avoidance savings in milliseconds, which can be negative. Negative values indicate that it takes more time to reuse outputs than it did to create them originally. `null` if the information is not available.
+ nullable: true
+ nonCacheabilityCategory:
+ type: string
+ enum:
+ - build_cache_disabled_by_user
+ - goal_execution_marked_non_cacheable
+ - goal_not_supported
+ - no_gradle_enterprise_server_configured
+ - no_develocity_server_configured
+ - non_clean_build
+ - not_entitled
+ - offline_build
+ - unknown
+ - unknown_entitlements
+ description: |
+ The category of the non-cacheability reason:
+ * `build_cache_disabled_by_user` - The build cache is disabled by the user
+ * `goal_execution_marked_non_cacheable` - The goal execution is marked as non-cacheable
+ * `goal_not_supported` - The goal does not support build caching
+ * `no_gradle_enterprise_server_configured` - No Develocity server is configured **Deprecated, use `no_develocity_server_configured` instead**
+ * `no_develocity_server_configured` - No Develocity server is configured
+ * `non_clean_build` - The `clean` lifecycle is not executed
+ * `not_entitled` - The Develocity license entitlements does not allow Maven build caching
+ * `offline_build` - The build is run in offline mode
+ * `unknown` - Reason for disabled caching is not known
+ * `unknown_entitlements` - The Develocity license entitlements cannot be checked
+
+ `null` when the goal execution is cacheable or if the information is not available.
+ nullable: true
+ nonCacheabilityReason:
+ type: string
+ description: The human-readable reason for a non-cacheable goal execution. `null` when the goal execution is cacheable or if the information is not available.
+ nullable: true
+ cacheArtifactSize:
+ type: integer
+ format: int64
+ description: |
+ The number of bytes of the produced or consumed cache artifact.
+ For a goal execution where the outputs are successfully stored to a local or remote cache, this is the size of the stored cache artifact. For a goal execution where the outputs are successfully loaded from a local or remote cache, this is the size of the loaded cache artifact.
+ `null` if the goal execution is not cacheable, or if the attempt to store or load the artifact from cache does not succeed.
+ nullable: true
+ cacheArtifactRejectedReason:
+ description: |
+ The reason why the cache artifact has been rejected:
+ * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept.
+
+ `null` if the goal is not cacheable, or if the attempt to store the artifact does not succeed.
+ nullable: true
+ type: string
+ enum:
+ - artifact_size_too_large
+ cacheKey:
+ type: string
+ description: Build cache key. `null` if no build cache key was computed (e.g. when fingerprinting failed).
+ nullable: true
+ MavenBuildCachePerformanceGoalExecution:
+ type: array
+ description: A list of executed goals with performance related information.
+ items:
+ $ref: '#/components/schemas/MavenBuildCachePerformanceGoalExecutionEntry'
+ MavenBuildCachePerformanceGoalFingerprintingSummary:
+ type: object
+ description: A summary of goal fingerprinting. Fingerprinted goals are part of the `goalExecution.avoidedGoals` or `goalExecution.executedGoals` buckets.
+ required:
+ - count
+ - serialDuration
+ properties:
+ count:
+ type: integer
+ description: Count of fingerprinted goals.
+ serialDuration:
+ type: integer
+ format: int64
+ description: Sum of all fingerprinting times of fingerprinted goals in milliseconds.
+ MavenBuildCachePerformanceAvoidanceSavingsSummary:
+ type: object
+ description: A breakdown of avoidance savings.
+ required:
+ - total
+ - ratio
+ - localBuildCache
+ - remoteBuildCache
+ properties:
+ total:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the goals due to their outputs being reused in milliseconds.
+ ratio:
+ type: number
+ format: double
+ description: The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build.
+ localBuildCache:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the goals due to their outputs being reused from the local build cache in milliseconds.
+ remoteBuildCache:
+ type: integer
+ format: int64
+ description: The estimated reduction in serial execution time of the goals due to their outputs being reused from the remote build cache in milliseconds.
+ MavenBuildCachePerformanceBuildCacheLocalInfo:
+ type: object
+ description: Information about the local build cache used in the build, if it is configured in the build. `null` if the local build cache is not configured.
+ nullable: true
+ required:
+ - isEnabled
+ properties:
+ isEnabled:
+ type: boolean
+ description: Indicates whether the local build cache is enabled.
+ isPushEnabled:
+ type: boolean
+ description: Indicates whether pushing to the local build cache is enabled. `null` if the local build cache is disabled.
+ nullable: true
+ isDisabledDueToError:
+ type: boolean
+ description: Indicates whether the local cache is disabled due to an error occurring in loading or storing local build cache entries. `null` if the local build cache is disabled.
+ directory:
+ type: string
+ description: Location of the local build cache. Can be relative or absolute depending on its value. `null` if the local build cache is disabled.
+ nullable: true
+ MavenBuildCachePerformanceBuildCacheRemoteInfo:
+ type: object
+ description: Information about the remote build cache used in the build, if it is configured in the build. `null` if the remote build cache is not configured.
+ nullable: true
+ required:
+ - isEnabled
+ properties:
+ isEnabled:
+ type: boolean
+ description: Indicates whether the remote build cache is enabled.
+ isPushEnabled:
+ type: boolean
+ description: Indicates whether pushing to the remote build cache is enabled. `null` if the remote build cache is disabled.
+ nullable: true
+ isDisabledDueToError:
+ type: boolean
+ description: Indicates whether the remote build cache is disabled during the build due to an error occurring in loading or storing remote build cache entries. `null` if the remote build cache is disabled.
+ url:
+ type: string
+ description: URL of the remote build cache. `null` if the remote build cache is disabled.
+ nullable: true
+ MavenBuildCachePerformanceBuildCacheOverhead:
+ type: object
+ description: Information about the build cache overhead in this build.
+ required:
+ - uploading
+ - downloading
+ - packing
+ - unpacking
+ properties:
+ uploading:
+ type: integer
+ format: int64
+ description: Overhead of upload operations in milliseconds.
+ downloading:
+ type: integer
+ format: int64
+ description: Overhead of download operations in milliseconds.
+ packing:
+ type: integer
+ format: int64
+ description: Overhead of pack operations in milliseconds.
+ unpacking:
+ type: integer
+ format: int64
+ description: Overhead of unpack operations in milliseconds.
+ MavenBuildCachePerformanceBuildCaches:
+ type: object
+ description: Information about the local and remote build caches used in the build, if it is configured in the build. `null` if the build cache configuration cannot be captured (e.g. very early build failure).
+ nullable: true
+ required:
+ - overhead
+ properties:
+ local:
+ $ref: '#/components/schemas/MavenBuildCachePerformanceBuildCacheLocalInfo'
+ remote:
+ $ref: '#/components/schemas/MavenBuildCachePerformanceBuildCacheRemoteInfo'
+ overhead:
+ $ref: '#/components/schemas/MavenBuildCachePerformanceBuildCacheOverhead'
+ MavenBuildCachePerformance:
+ type: object
+ description: The build cache performance of a Maven build.
+ required:
+ - id
+ - buildTime
+ - effectiveProjectExecutionTime
+ - serialProjectExecutionTime
+ - serializationFactor
+ - goalExecution
+ - goalFingerprintingSummary
+ - avoidanceSavingsSummary
+ properties:
+ id:
+ type: string
+ description: The Build Scan ID.
+ buildTime:
+ type: integer
+ format: int64
+ description: Wall clock duration of the build in milliseconds.
+ effectiveProjectExecutionTime:
+ type: integer
+ format: int64
+ description: Wall clock time spent executing projects in milliseconds. It is the time spent between the start of the first project execution and the end of the last project execution, removing any interval where no project is being executed.
+ serialProjectExecutionTime:
+ type: integer
+ format: int64
+ description: Wall clock time of all project executions in milliseconds. It is the sum of all individual project durations.
+ serializationFactor:
+ type: number
+ format: double
+ description: The ratio of `serialProjectExecutionTime` over the `effectiveProjectExecutionTime`. Quantifies the effect of project parallelization. A value equal to `1` means that no parallelization occurs. A value greater than `1` means that projects are executed faster due to parallelization.
+ goalExecution:
+ $ref: '#/components/schemas/MavenBuildCachePerformanceGoalExecution'
+ goalFingerprintingSummary:
+ $ref: '#/components/schemas/MavenBuildCachePerformanceGoalFingerprintingSummary'
+ avoidanceSavingsSummary:
+ $ref: '#/components/schemas/MavenBuildCachePerformanceAvoidanceSavingsSummary'
+ buildCaches:
+ $ref: '#/components/schemas/MavenBuildCachePerformanceBuildCaches'
+ MavenModule:
+ type: object
+ description: A Maven module.
+ required:
+ - name
+ - groupId
+ - artifactId
+ - version
+ properties:
+ name:
+ type: string
+ description: The name of the module.
+ groupId:
+ type: string
+ description: The group ID of the module.
+ artifactId:
+ type: string
+ description: The artifact ID of the module.
+ version:
+ type: string
+ description: The version of the module.
+ parent:
+ type: integer
+ nullable: true
+ description: The index of the parent of this Maven module in the MavenModules array. `null` if this module has no parent (i.e. top level project).
+ MavenModules:
+ type: array
+ items:
+ $ref: '#/components/schemas/MavenModule'
+ description: List of Maven modules including structural relationships.
+ MavenDependencyResolution:
+ type: object
+ description: Information about dependency resolution.
+ required:
+ - serialDependencyResolutionTime
+ - networkRequestCount
+ - serialNetworkRequestTime
+ - wallClockNetworkRequestTime
+ - fileDownloadSize
+ - fileDownloadCount
+ properties:
+ serialDependencyResolutionTime:
+ description: The total cumulative time, in milliseconds, spent resolving dependencies. The process of resolving a dependency involves fetching metadata from remote repositories, determining the appropriate version to use, and ultimately fetching the dependency artifact.
+ format: int64
+ type: integer
+ minimum: 0
+ networkRequestCount:
+ description: This represents the total count of network requests made during configuration resolution.
+ format: int64
+ type: integer
+ serialNetworkRequestTime:
+ description: The duration in milliseconds representing the sum of times for potentially parallel network requests. It does not reflect wall clock time but offers a rough estimation of network activity.
+ format: int64
+ type: integer
+ minimum: 0
+ wallClockNetworkRequestTime:
+ description: The estimate in milliseconds representing the wall clock time spent on network requests during the current build. It is calculated by comparing the critical path of project executions with and without network requests, converted to wall clock time.
+ format: int64
+ type: integer
+ minimum: 0
+ fileDownloadSize:
+ type: integer
+ format: int64
+ minimum: 0
+ description: The total number of bytes downloaded for dependencies. It accounts only for the bytes of the files (e.g. POMs, JARs) downloaded and not the total network transfer.
+ fileDownloadCount:
+ type: integer
+ format: int64
+ minimum: 0
+ description: The total number of successfully downloaded files.
+ BuildModels:
+ type: object
+ description: Optional requested models associated with the build.
+ properties:
+ gradleAttributes:
+ description: The attributes of a Gradle build, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/GradleAttributes'
+ gradleBuildCachePerformance:
+ description: The build cache performance of a Gradle build, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/GradleBuildCachePerformance'
+ gradleProjects:
+ description: List of Gradle projects, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/GradleProjects'
+ gradleNetworkActivity:
+ description: Information about the network activity of the build, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/GradleNetworkActivity'
+ gradleArtifactTransformExecutions:
+ description: The artifact transform execution list of a Gradle build, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/GradleArtifactTransformExecutions'
+ gradleDeprecations:
+ description: The deprecation list of a Gradle build, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/GradleDeprecations'
+ mavenAttributes:
+ description: The attributes of a Maven build, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/MavenAttributes'
+ mavenBuildCachePerformance:
+ description: The build cache performance of a Maven build, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/MavenBuildCachePerformance'
+ mavenModules:
+ description: List of Maven modules, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/MavenModules'
+ mavenDependencyResolution:
+ description: Information about dependency resolution, or a report of a problem encountered.
+ properties:
+ problem:
+ $ref: '#/components/schemas/ApiProblem'
+ model:
+ $ref: '#/components/schemas/MavenDependencyResolution'
+ Build:
+ type: object
+ description: A build with common attributes.
+ required:
+ - id
+ - availableAt
+ - buildToolType
+ - buildToolVersion
+ - buildAgentVersion
+ properties:
+ id:
+ type: string
+ description: The Build Scan ID.
+ availableAt:
+ type: integer
+ format: int64
+ description: A unix-epoch-time in milliseconds referring to the instant that Develocity completed receiving and processing the build.
+ buildToolType:
+ type: string
+ description: The build tool type of the build.
+ buildToolVersion:
+ type: string
+ description: The build tool version used.
+ buildAgentVersion:
+ type: string
+ description: The build agent version used.
+ models:
+ $ref: '#/components/schemas/BuildModels'
+ Builds:
+ type: array
+ items:
+ $ref: '#/components/schemas/Build'
+ description: List of builds with common attributes.
+ AvailabilityWaitTimeoutSecs:
+ type: integer
+ minimum: 0
+ description: The time in seconds the server should wait for ingestion before returning a wait timeout response.
+ BuildQuery:
+ type: object
+ properties:
+ models:
+ $ref: '#/components/schemas/BuildModelNames'
+ allModels:
+ type: boolean
+ default: false
+ description: |
+ Whether to include all build models for the build.
+ If set to `true`, the value of the `models` parameter is ignored.
+ availabilityWaitTimeoutSecs:
+ $ref: '#/components/schemas/AvailabilityWaitTimeoutSecs'
+ BuildModelQuery:
+ type: object
+ properties:
+ availabilityWaitTimeoutSecs:
+ $ref: '#/components/schemas/AvailabilityWaitTimeoutSecs'
+ ReplicationConfiguration:
+ description: Cached data replication configuration description. May be `null` if replication is not configured.
+ type: object
+ nullable: true
+ required:
+ - source
+ - preemptive
+ properties:
+ source:
+ type: string
+ description: The name of the Build Cache Node which is the source of data.
+ preemptive:
+ type: boolean
+ description: Indicates if preemptive replication is enabled from the source.
+ NodeConfiguration:
+ description: A Build Cache Node configuration description.
+ type: object
+ required:
+ - enabled
+ properties:
+ enabled:
+ type: boolean
+ description: Indicates if the Build Cache Node is enabled.
+ replication:
+ $ref: '#/components/schemas/ReplicationConfiguration'
+ KeySecretPair:
+ description: A Build Cache Node key and secret pair.
+ type: object
+ required:
+ - key
+ - secret
+ properties:
+ key:
+ type: string
+ description: A unique identifier for the Build Cache Node in Develocity.
+ secret:
+ type: string
+ description: The secret associated with the Build Cache Node.
+ PageQuery:
+ type: object
+ properties:
+ pageNumber:
+ type: integer
+ format: int32
+ description: |
+ The index of the page to retrieve.
+ The first page's index is zero.
+ minimum: 0
+ default: 0
+ pageSize:
+ type: integer
+ format: in32
+ description: The maximum number of elements to include in the fetched page.
+ minimum: 0
+ Project:
+ type: object
+ description: A project.
+ required:
+ - id
+ properties:
+ id:
+ $ref: '#/components/schemas/ProjectId'
+ displayName:
+ type: string
+ description: The label used when displaying the project.
+ maxLength: 266
+ description:
+ type: string
+ description: The description of the project group.
+ maxLength: 1024
+ PageMetadata:
+ type: object
+ description: |
+ Information about the current and available page of elements.
+ Pages are returned from list operations which could contain a lot of elements.
+ One page contains a subset of the available elements.
+ API users can retrieve all pages in order to retrieve all of the available elements.
+ required:
+ - number
+ - size
+ - totalElements
+ - totalPages
+ properties:
+ number:
+ type: integer
+ format: int32
+ description: The index of the current page. Page indexes start at zero.
+ minimum: 0
+ size:
+ type: integer
+ format: int32
+ description: The number of elements in the current page.
+ minimum: 0
+ totalPages:
+ type: integer
+ format: int32
+ description: The total number of pages.
+ minimum: 0
+ totalElements:
+ type: integer
+ format: int32
+ description: The total number of elements across all pages.
+ minimum: 0
+ ProjectsPage:
+ type: object
+ description: A paged list of projects.
+ required:
+ - content
+ - page
+ properties:
+ content:
+ type: array
+ description: A list of projects.
+ items:
+ $ref: '#/components/schemas/Project'
+ page:
+ $ref: '#/components/schemas/PageMetadata'
+ ProjectGroupId:
+ type: string
+ description: The unique identifier for the project group. Must not contain whitespace.
+ minLength: 1
+ maxLength: 215
+ pattern: ^\S+$
+ ProjectReference:
+ type: object
+ description: A container for a project ID.
+ required:
+ - id
+ properties:
+ id:
+ $ref: '#/components/schemas/ProjectId'
+ ProjectGroup:
+ type: object
+ description: A group of projects that can be assigned to users.
+ required:
+ - id
+ properties:
+ id:
+ $ref: '#/components/schemas/ProjectGroupId'
+ displayName:
+ type: string
+ description: The label used when displaying the project group.
+ maxLength: 266
+ description:
+ type: string
+ description: The description of the project group.
+ maxLength: 1024
+ identityProviderAttributeValue:
+ type: string
+ description: |
+ The value of an identity provider attribute this project group is associated with.
+ Users who have this value in the identity provider attribute will be assigned this project group.
+ minLength: 1
+ maxLength: 256
+ projects:
+ type: array
+ items:
+ $ref: '#/components/schemas/ProjectReference'
+ ProjectGroupsPage:
+ type: object
+ description: A paged list of project groups.
+ required:
+ - content
+ - page
+ properties:
+ content:
+ type: array
+ description: A list of project groups.
+ items:
+ $ref: '#/components/schemas/ProjectGroup'
+ page:
+ $ref: '#/components/schemas/PageMetadata'
+ TestOutcome:
+ type: string
+ enum:
+ - passed
+ - failed
+ - skipped
+ - flaky
+ - notSelected
+ TestIncludeFields:
+ type: string
+ enum:
+ - buildScanIds
+ - workUnits
+ x-enum-varnames:
+ - BUILD_SCAN_IDS
+ - WORK_UNITS
+ TestContainersQuery:
+ type: object
+ required:
+ - container
+ - testOutcomes
+ - query
+ properties:
+ container:
+ type: string
+ description: Allows restricting the search to parts of the test container hierarchy. You can use wildcards to match a specific subpackage.
+ default: '*'
+ testOutcomes:
+ type: array
+ description: Allows restricting the search to tests that had at least one instance of the given outcome.
+ items:
+ $ref: '#/components/schemas/TestOutcome'
+ minItems: 1
+ query:
+ type: string
+ description: |
+ A query for filtering tests, written in the Develocity advanced search query language
+ See: https://gradle.com/help/advanced-search
+ include:
+ type: array
+ description: Controls which optional fields are included in the response.
+ nullable: true
+ items:
+ $ref: '#/components/schemas/TestIncludeFields'
+ BazelWorkUnit:
+ type: object
+ description: A Bazel work unit.
+ required:
+ - packageName
+ - targetName
+ properties:
+ packageName:
+ type: string
+ description: The name of the Bazel package.
+ targetName:
+ type: string
+ description: The name of the Bazel target.
+ GradleWorkUnit:
+ type: object
+ description: A Gradle work unit.
+ required:
+ - projectName
+ - taskPath
+ properties:
+ projectName:
+ type: string
+ description: The name of the Gradle project.
+ taskPath:
+ type: string
+ description: The path of the Gradle task.
+ MavenWorkUnit:
+ type: object
+ description: A Maven work unit.
+ required:
+ - groupId
+ - artifactId
+ - goalName
+ - executionId
+ properties:
+ groupId:
+ type: string
+ description: The Maven groupId.
+ artifactId:
+ type: string
+ description: The Maven artifactId.
+ goalName:
+ type: string
+ description: The Maven goal name.
+ executionId:
+ type: string
+ description: The execution id of the goal.
+ TestWorkUnit:
+ type: object
+ description: |
+ Contains a work unit.
+
+ Only one of the properties is set, representing the build tool used for the build.
+ minProperties: 1
+ maxProperties: 1
+ properties:
+ bazel:
+ $ref: '#/components/schemas/BazelWorkUnit'
+ gradle:
+ $ref: '#/components/schemas/GradleWorkUnit'
+ maven:
+ $ref: '#/components/schemas/MavenWorkUnit'
+ TestOutcomeDistribution:
+ type: object
+ description: A distribution of outcomes.
+ required:
+ - passed
+ - failed
+ - skipped
+ - flaky
+ - notSelected
+ - total
+ properties:
+ passed:
+ type: integer
+ description: The number of 'Passed' outcomes.
+ failed:
+ type: integer
+ description: The number of 'Failed' outcomes.
+ skipped:
+ type: integer
+ description: The number of 'Skipped' outcomes.
+ flaky:
+ type: integer
+ description: The number of 'Flaky' outcomes.
+ notSelected:
+ type: integer
+ description: The number of 'Not Selected' outcomes.
+ total:
+ type: integer
+ description: The total number of outcomes.
+ BuildScanIdsByOutcome:
+ type: object
+ description: Build Scan IDs for builds that contain tests with outcomes.
+ required:
+ - passed
+ - failed
+ - skipped
+ - flaky
+ - notSelected
+ properties:
+ passed:
+ type: array
+ description: The BuildIds of 'Passed' outcomes.
+ items:
+ type: string
+ failed:
+ type: array
+ description: The Build Scan IDs of 'Failed' outcomes.
+ items:
+ type: string
+ skipped:
+ type: array
+ description: The BuildIds of 'Skipped' outcomes.
+ items:
+ type: string
+ flaky:
+ type: array
+ description: The BuildIds of 'Flaky' outcomes.
+ items:
+ type: string
+ notSelected:
+ type: array
+ description: The BuildIds of 'Not Selected' outcomes.
+ items:
+ type: string
+ TestOrContainer:
+ type: object
+ description: A test or test container.
+ required:
+ - name
+ - outcomeDistribution
+ properties:
+ name:
+ type: string
+ description: The name of the test or test container.
+ workUnits:
+ type: array
+ nullable: true
+ items:
+ $ref: '#/components/schemas/TestWorkUnit'
+ outcomeDistribution:
+ $ref: '#/components/schemas/TestOutcomeDistribution'
+ buildScanIdsByOutcome:
+ $ref: '#/components/schemas/BuildScanIdsByOutcome'
+ TestsResponse:
+ type: object
+ description: A list of test containers or test cases.
+ required:
+ - content
+ properties:
+ content:
+ type: array
+ description: A list of test containers.
+ items:
+ $ref: '#/components/schemas/TestOrContainer'
+ TestCasesQuery:
+ x-all-of-name: TestCasesQuery
+ type: object
+ required:
+ - container
+ - testOutcomes
+ - query
+ properties:
+ container:
+ type: string
+ description: Must be the fully qualified name of the test container to query. May not contain any wildcards.
+ testOutcomes:
+ type: array
+ description: Allows restricting the search to tests that had at least one instance of the given outcome.
+ items:
+ $ref: '#/components/schemas/TestOutcome'
+ minItems: 1
+ limit:
+ description: The maximum number of test outcomes to query.
+ type: integer
+ format: int32
+ default: 100
+ minimum: 1
+ maximum: 1000
+ query:
+ type: string
+ description: |
+ A query for filtering tests, written in the Develocity advanced search query language
+ See: https://gradle.com/help/advanced-search
+ include:
+ type: array
+ description: Controls which optional fields are included in the response.
+ nullable: true
+ items:
+ $ref: '#/components/schemas/TestIncludeFields'
+ TestDistributionAgentPoolId:
+ description: The unique identifier of the agent pool.
+ type: string
+ minLength: 8
+ maxLength: 8
+ pattern: ^[a-z2-7]{8}$
+ TestDistributionAgentPoolConfigurationWithId:
+ description: An agent pool configuration.
+ type: object
+ required:
+ - id
+ - name
+ - minimumSize
+ - maximumSize
+ - capabilities
+ - orderIndex
+ properties:
+ id:
+ $ref: '#/components/schemas/TestDistributionAgentPoolId'
+ name:
+ type: string
+ description: The alias or display name of the agent pool.
+ minLength: 1
+ example: functional-test-agents
+ minimumSize:
+ type: integer
+ format: int32
+ minimum: 0
+ maximumSize:
+ type: integer
+ format: int32
+ minimum: 0
+ orderIndex:
+ description: The order in which the agent pool is considered for allocation. Lower values are considered first.
+ type: integer
+ format: int32
+ minimum: 0
+ capabilities:
+ type: array
+ items:
+ type: string
+ pattern: ^([-\w.]+)(?:=([-\w.]+))?$
+ example:
+ - jdk=17
+ - os=linux
+ - functional-test
+ restrictAccessToProjectGroups:
+ type: boolean
+ description: |
+ Controls whether this pool can be used by everyone, or only the assigned project groups.
+ A `true` value implies that `projectGroupIds` is present and has at least one entry.
+ Conversely, a `false` value implies that `projectGroupIds` is empty.
+ default: false
+ projectGroupIds:
+ type: array
+ description: |
+ Controls which project groups can use this pool.
+ If it is empty, then `restrictAccessToProjectGroups` must be `false`.
+ Conversely, if it has values then `restrictAccessToProjectGroups` must be `true`.
+ items:
+ type: string
+ pattern: ^[^\\s]{1,215}$
+ example: project-group-a
+ TestDistributionAgentPoolPage:
+ description: A list of agent pools.
+ type: object
+ required:
+ - content
+ properties:
+ content:
+ type: array
+ description: A list of agent pool IDs.
+ items:
+ $ref: '#/components/schemas/TestDistributionAgentPoolConfigurationWithId'
+ TestDistributionAgentPoolConfiguration:
+ description: An agent pool configuration.
+ type: object
+ required:
+ - name
+ - minimumSize
+ - maximumSize
+ - capabilities
+ properties:
+ name:
+ type: string
+ description: The alias or display name of the agent pool.
+ minLength: 1
+ example: functional-test-agents
+ minimumSize:
+ type: integer
+ format: int32
+ minimum: 0
+ maximumSize:
+ type: integer
+ format: int32
+ minimum: 0
+ orderIndex:
+ description: The order in which the agent pool is considered for allocation. Lower values are considered first.
+ type: integer
+ format: int32
+ nullable: true
+ minimum: 0
+ capabilities:
+ type: array
+ items:
+ type: string
+ pattern: ^([-\w.]+)(?:=([-\w.]+))?$
+ example:
+ - jdk=17
+ - os=linux
+ - functional-test
+ restrictAccessToProjectGroups:
+ type: boolean
+ description: |
+ Controls whether this pool can be used by everyone, or only the assigned project groups.
+ A `true` value implies that `projectGroupIds` is present and has at least one entry.
+ Conversely, a `false` value implies that `projectGroupIds` is empty.
+ default: false
+ projectGroupIds:
+ type: array
+ description: |
+ Controls which project groups can use this pool.
+ If it is empty, then `restrictAccessToProjectGroups` must be `false`.
+ Conversely, if it has values then `restrictAccessToProjectGroups` must be `true`.
+ items:
+ type: string
+ pattern: ^[^\\s]{1,215}$
+ example: project-group-a
+ TestDistributionAgentPoolStatus:
+ description: The status of an agent pool.
+ type: object
+ required:
+ - id
+ - name
+ - minimumSize
+ - maximumSize
+ - connectedAgents
+ - idleAgents
+ - desiredAgents
+ properties:
+ id:
+ $ref: '#/components/schemas/TestDistributionAgentPoolId'
+ name:
+ type: string
+ description: The alias or display name of the agent pool.
+ minLength: 1
+ minimumSize:
+ type: integer
+ format: int32
+ maximumSize:
+ type: integer
+ format: int32
+ connectedAgents:
+ type: integer
+ format: int32
+ idleAgents:
+ type: integer
+ format: int32
+ desiredAgents:
+ type: integer
+ format: int32
+ TestDistributionAgentPoolRegistrationKeyPrefix:
+ description: A Test Distribution pool-specific agent registration key prefix.
+ type: object
+ required:
+ - keyPrefix
+ - createdAt
+ properties:
+ keyPrefix:
+ type: string
+ minLength: 26
+ maxLength: 26
+ pattern: ^[a-z2-7]{26}$
+ description: The registration key prefix.
+ description:
+ type: string
+ maxLength: 100
+ description: Description of the registration key to help identify it later.
+ example: Used by xyz
+ createdAt:
+ type: string
+ format: date-time
+ description: When the key was created
+ lastUsedAt:
+ type: string
+ format: date-time
+ nullable: true
+ description: When the key was last used
+ lastUsedBy:
+ type: string
+ nullable: true
+ description: Who used the key last
+ revokedAt:
+ type: string
+ format: date-time
+ nullable: true
+ description: When the key was revoked, a non-null value implies that the key is revoked and can no longer be used to authenticate.
+ TestDistributionAgentPoolRegistrationKeyPrefixPage:
+ description: A list of Test Distribution pool-specific agent registration key prefixes.
+ type: object
+ required:
+ - content
+ properties:
+ content:
+ type: array
+ items:
+ $ref: '#/components/schemas/TestDistributionAgentPoolRegistrationKeyPrefix'
+ TestDistributionAgentPoolRegistrationKeyDescription:
+ description: Optional description of a Test Distribution pool-specific agent registration key.
+ type: object
+ properties:
+ description:
+ type: string
+ maxLength: 100
+ description: Description of the registration key to help identify it later.
+ example: Used by xyz
+ TestDistributionAgentPoolRegistrationKey:
+ description: A Test Distribution pool-specific agent registration key.
+ type: object
+ required:
+ - key
+ properties:
+ key:
+ type: string
+ minLength: 52
+ maxLength: 52
+ pattern: ^[a-z2-7]{52}$
+ description: The agent API key.
+ description:
+ type: string
+ maxLength: 100
+ description: Description of the registration key to help identify it later.
+ example: Used by xyz
+ TestDistributionApiKeyPrefix:
+ description: |
+ **This class is deprecated. Migrate to pool-specific agent registration keys instead.**
+ A Test Distribution agent API key prefix.
+ deprecated: true
+ type: object
+ required:
+ - keyPrefix
+ - generatedAt
+ properties:
+ keyPrefix:
+ type: string
+ minLength: 26
+ maxLength: 26
+ pattern: ^[a-z2-7]{26}$
+ description: The agent API key.
+ description:
+ type: string
+ maxLength: 100
+ description: Description of the API key, such as the agent pool where it will be used, to help identify it later.
+ example: Used to authenticate agents in pool 'pool-id'.
+ generatedAt:
+ type: string
+ format: date-time
+ lastUsedAt:
+ type: string
+ format: date-time
+ nullable: true
+ lastUsedBy:
+ type: string
+ nullable: true
+ revokedAt:
+ type: string
+ format: date-time
+ nullable: true
+ TestDistributionApiKeyPrefixPage:
+ description: |
+ **This class is deprecated. Migrate to pool-specific agent registration keys instead.**
+ A list of Test Distribution agent API key prefixes.
+ deprecated: true
+ type: object
+ required:
+ - content
+ properties:
+ content:
+ type: array
+ items:
+ $ref: '#/components/schemas/TestDistributionApiKeyPrefix'
+ TestDistributionApiKeyDescription:
+ description: |
+ **This class is deprecated. Migrate to pool-specific agent registration keys instead.**
+ Optional description of a Test Distribution agent API key.
+ deprecated: true
+ type: object
+ properties:
+ description:
+ type: string
+ maxLength: 100
+ description: Description of the API key, such as the agent pool where it will be used, to help identify it later.
+ example: Used to authenticate agents in pool 'pool-id'.
+ TestDistributionApiKey:
+ description: |
+ **This class is deprecated. Migrate to pool-specific agent registration keys instead.**
+ A Test Distribution agent API key.
+ deprecated: true
+ type: object
+ required:
+ - key
+ properties:
+ key:
+ type: string
+ minLength: 52
+ maxLength: 52
+ pattern: ^[a-z2-7]{52}$
+ description: The agent API key.
+ description:
+ type: string
+ maxLength: 100
+ description: Description of the API key, such as the agent pool where it will be used, to help identify it later.
+ example: Used to authenticate agents in pool 'pool-id'.
+ examples:
+ RequestValidationApiProblemExample:
+ value:
+ type: urn:gradle:enterprise:api:problems:validation
+ title: Request validation failed.
+ detail: |
+ Numeric instance is lower than the required minimum (minimum: 1, found: 0) (Additional info: Query parameter: maxWaitSecs).
+ status: 400
+ NotFoundApiProblemExample:
+ value:
+ type: urn:gradle:enterprise:api:problems:not-found
+ title: The requested resource is not found or the permissions to know about it are missing.
+ status: 404
+ UnexpectedErrorApiProblemExample:
+ value:
+ type: urn:gradle:enterprise:api:problems:unexpected-error
+ title: Encountered an internal server error.
+ detail: |
+ The ingestion of build 9r4d13f0r3v3r failed.
+ status: 500
+ IngestionNotCompletedApiProblemExample:
+ value:
+ type: urn:gradle:enterprise:api:problems:build-processing-incomplete
+ title: Build processing is incomplete.
+ detail: |
+ The data of build 9r4d13f0r3v3r is not yet available for viewing. Please try again later.
+ status: 503
+ NodeNotSignedInProblemExample:
+ value:
+ type: urn:gradle:enterprise:api:problems:node-not-signed-in
+ title: Node with name not-signed-in-node1 must be signed-in before this operation can be performed.
+ status: 503
+ ForbiddenUserExample:
+ value:
+ type: urn:gradle:enterprise:forbidden
+ title: Insufficient permissions
+ detail: User must have the Administer Projects permission to access this endpoint.
+ status: 403
+ CapabilityValidationProblemExample:
+ value:
+ type: urn:gradle:enterprise:validation
+ title: Invalid request parameters
+ detail: One or more capabilities have an invalid format.
+ status: 400
diff --git a/sample/.gitignore b/sample/.gitignore
new file mode 100644
index 0000000..2410e8e
--- /dev/null
+++ b/sample/.gitignore
@@ -0,0 +1,19 @@
+build
+bin
+gen
+captures
+local.properties
+/*/build.xml
+/*/tests/build.xml
+.DS_Store
+*/usage.txt
+*/dump.txt
+
+# Android Studio
+/.idea/*
+!/.idea/codeStyles
+!/.idea/runConfigurations/
+.gradle
+gradle/wrapper
+*.iws
+*.iml
diff --git a/sample/README.md b/sample/README.md
new file mode 100644
index 0000000..be5f418
--- /dev/null
+++ b/sample/README.md
@@ -0,0 +1,4 @@
+# Metrics for Develocity Plugin Sample Application
+
+Simple project which is useful to quickly test changes to the Metrics for Develocity Plugin.
+
diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts
new file mode 100644
index 0000000..ce8d5b5
--- /dev/null
+++ b/sample/build.gradle.kts
@@ -0,0 +1,32 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
+
+plugins {
+ `embedded-kotlin`
+ id("com.ebay.metrics-for-develocity")
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+}
+
+project.tasks.withType(KotlinJvmCompile::class.java) {
+ compilerOptions {
+ allWarningsAsErrors.set(true)
+ freeCompilerArgs.addAll(listOf("-Xjvm-default=all", "-opt-in=kotlin.RequiresOptIn"))
+ jvmTarget.set(JvmTarget.JVM_11)
+ }
+}
+
+develocityMetrics {
+ // The following could be used to change the time zone used by the plugin:
+ // zoneId.set("UTC")
+
+ // An additional filter may also be supplied:
+ // develocityQueryFilter.set("project:andr_core tag:Local")
+}
+
+project.tasks.withType(Test::class.java) {
+ useTestNG()
+}
\ No newline at end of file
diff --git a/sample/gradle b/sample/gradle
new file mode 120000
index 0000000..3337596
--- /dev/null
+++ b/sample/gradle
@@ -0,0 +1 @@
+../gradle
\ No newline at end of file
diff --git a/sample/gradle.properties b/sample/gradle.properties
new file mode 100644
index 0000000..01ae2e7
--- /dev/null
+++ b/sample/gradle.properties
@@ -0,0 +1,7 @@
+org.gradle.daemon=true
+org.gradle.caching=true
+org.gradle.parallel=true
+org.gradle.configuration-cache=true
+
+# These args need to match the ones in the root project's gradle.properties file
+kotlin.daemon.jvmargs=-Xmx8g -XX:+UseParallelGC
\ No newline at end of file
diff --git a/sample/gradlew b/sample/gradlew
new file mode 100755
index 0000000..5dae840
--- /dev/null
+++ b/sample/gradlew
@@ -0,0 +1,2 @@
+#!/bin/bash
+exec ../gradlew "${@}"
diff --git a/sample/settings.gradle.kts b/sample/settings.gradle.kts
new file mode 100644
index 0000000..797e384
--- /dev/null
+++ b/sample/settings.gradle.kts
@@ -0,0 +1,19 @@
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ }
+ includeBuild("..")
+}
+
+dependencyResolutionManagement {
+ repositories {
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+
+rootProject.name = "metrics-for-develocity-sample"
+
+enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
+
+include(":subproj1")
diff --git a/sample/subproj1/build.gradle.kts b/sample/subproj1/build.gradle.kts
new file mode 100644
index 0000000..4eb72ba
--- /dev/null
+++ b/sample/subproj1/build.gradle.kts
@@ -0,0 +1,24 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
+
+plugins {
+ `embedded-kotlin`
+ id("com.ebay.metrics-for-develocity")
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+}
+
+project.tasks.withType(KotlinJvmCompile::class.java) {
+ compilerOptions {
+ allWarningsAsErrors.set(true)
+ freeCompilerArgs.addAll(listOf("-Xjvm-default=all", "-opt-in=kotlin.RequiresOptIn"))
+ jvmTarget.set(JvmTarget.JVM_11)
+ }
+}
+
+project.tasks.withType(Test::class.java) {
+ useTestNG()
+}
diff --git a/settings.gradle.kts b/settings.gradle.kts
new file mode 100644
index 0000000..cb5a7e8
--- /dev/null
+++ b/settings.gradle.kts
@@ -0,0 +1,16 @@
+@file:Suppress("UnstableApiUsage")
+
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ }
+}
+
+dependencyResolutionManagement {
+ repositories {
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+
+rootProject.name = "metrics-for-develocity-plugin"
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/CurrentDayWithHourParameters.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/CurrentDayWithHourParameters.kt
new file mode 100644
index 0000000..ed7b85c
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/CurrentDayWithHourParameters.kt
@@ -0,0 +1,14 @@
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.provider.Property
+import org.gradle.api.provider.ValueSourceParameters
+
+/**
+ * [ValueSourceParameters] for the [CurrentDayWithHourParameters] value source.
+ */
+abstract class CurrentDayWithHourParameters : ValueSourceParameters {
+ /**
+ * Timezone ID to use when determining the boundaries of the "current day".
+ */
+ abstract val zoneId: Property
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/CurrentDayWithHourValueSource.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/CurrentDayWithHourValueSource.kt
new file mode 100644
index 0000000..cb118c5
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/CurrentDayWithHourValueSource.kt
@@ -0,0 +1,14 @@
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.provider.ValueSource
+import java.time.Instant
+
+/**
+ * [ValueSource] implementation which determines what the current day and hour is.
+ */
+abstract class CurrentDayWithHourValueSource : ValueSource {
+ override fun obtain(): String {
+ val dateHelper = DateHelper(parameters.zoneId)
+ return dateHelper.toHourlyString(Instant.now())
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/DateHelper.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DateHelper.kt
new file mode 100644
index 0000000..1a316db
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DateHelper.kt
@@ -0,0 +1,48 @@
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.provider.Provider
+import java.time.Instant
+import java.time.LocalDate
+import java.time.ZoneId
+import java.time.format.DateTimeFormatter
+
+/**
+ * Utility class for working with datetime values, pre-configured with a reference timezone.
+ */
+class DateHelper(
+ private val zoneIdProvider: Provider
+) {
+ private val zoneId by lazy {
+ ZoneId.of(zoneIdProvider.get())
+ }
+
+ fun toHourlyString(instant: Instant): String {
+ return DATETIME_HOURLY_FORMATTER
+ .withZone(zoneId)
+ .format(instant)
+ }
+
+ fun fromHourlyString(value: String): Instant {
+ val result = DATETIME_HOURLY_FORMATTER
+ .withZone(zoneId)
+ .parse(value)
+ return Instant.from(result)
+ }
+
+ fun toDailyString(instant: Instant): String {
+ return DATETIME_DAILY_FORMATTER
+ .withZone(zoneId)
+ .format(instant)
+ }
+
+ fun fromDailyString(value: String): Instant {
+ return LocalDate.parse(value).atStartOfDay(zoneId).toInstant()
+ }
+
+ companion object {
+ private val DATETIME_HOURLY_FORMATTER = DateTimeFormatter
+ .ofPattern("yyyy-MM-dd'T'HH")
+ private val DATETIME_DAILY_FORMATTER = DateTimeFormatter
+ .ofPattern("yyyy-MM-dd")
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricSummarizer.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricSummarizer.kt
new file mode 100644
index 0000000..a29bac8
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricSummarizer.kt
@@ -0,0 +1,44 @@
+package com.ebay.plugins.metrics.develocity
+
+import com.ebay.plugins.metrics.develocity.service.model.Build
+import com.ebay.plugins.metrics.develocity.service.model.BuildModelName
+import org.gradle.api.file.RegularFile
+
+/**
+ * Build data summarizer which can be used to process build data into an intermediate form,
+ * allowing the data to be aggregated/reduced over windows of time.
+ */
+abstract class DevelocityMetricSummarizer {
+ /**
+ * A unique identifier for the summarizer. This will also become the filename for the intermediate
+ * data file within the output directory of the metric gathering and aggregation tasks.
+ */
+ open val id: String = javaClass.simpleName
+
+ /**
+ * The set of build model types which the summarizer needs to process in order to produce its
+ * intermediate data.
+ */
+ open val modelsNeeded: Set = emptySet()
+
+ /**
+ * Reads intermediate data from a file. If the file provided does not exist then the
+ * method should return an empty intermediate data object.
+ */
+ abstract fun read(file: RegularFile): Intermediate
+
+ /**
+ * Writes an intermediate data object to the file specified.
+ */
+ abstract fun write(intermediate: Intermediate, file: RegularFile)
+
+ /**
+ * Processes a single build and produces an intermediate representation.
+ */
+ abstract fun extract(build: Build): Intermediate
+
+ /**
+ * Reduces two intermediate data objects into a single intermediate data object.
+ */
+ abstract fun reduce(left: Intermediate, right: Intermediate): Intermediate
+}
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsExtension.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsExtension.kt
new file mode 100644
index 0000000..a8eb59d
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsExtension.kt
@@ -0,0 +1,51 @@
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.plugins.ExtensionAware
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.provider.Property
+
+/**
+ * Gradle extension used to configure the [DevelocityMetricsPlugin].
+ */
+abstract class DevelocityMetricsExtension : ExtensionAware {
+ /**
+ * The zone ID to use for reporting purposes. The time zone provided controls the boundaries
+ * of what is considered to be the "current day". By default, assumes the system's time zone.
+ */
+ abstract val zoneId: Property
+
+ /**
+ * Filter to apply to the Develocity query to narrow the scope of the builds to be processed
+ * (optional). This filter is expressed using the Develocity's advanced search syntax:
+ * https://docs.gradle.com/enterprise/api-manual/#advanced_search_syntax
+ */
+ abstract val develocityQueryFilter: Property
+
+ /**
+ * The Develocity server URL. If the Gradle Develocity or Gradle Enterprise plugins are
+ * applied, this will be auto-configured by using the values applied to their respective
+ * extensions.
+ */
+ abstract val develocityServerUrl: Property
+
+ /**
+ * The Develocity server access key. If the Gradle Develocity or Gradle Enterprise plugins are
+ * applied, this will be auto-configured by using the values applied to their respective
+ * extensions.
+ */
+ abstract val develocityAccessKey: Property
+
+ /**
+ * The maximum number of concurrent requests to make to the Develocity API. Since the
+ * data models are large, higher levels of concurrency will have an impact on memory
+ * pressure.
+ */
+ abstract val develocityMaxConcurrency: Property
+
+ /**
+ * Custom build data summarizers to apply to the build data. These capture the details
+ * of the build that are important to report upon and summarize them in a way that can
+ * be aggregated/reduced.
+ */
+ abstract val summarizers: ListProperty>
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsIntermediateTask.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsIntermediateTask.kt
new file mode 100644
index 0000000..ce94bef
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsIntermediateTask.kt
@@ -0,0 +1,24 @@
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.Task
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.tasks.Internal
+import org.gradle.api.tasks.OutputDirectory
+
+/**
+ * Properties which are common to the tasks which gather and process the metric data.
+ */
+interface DevelocityMetricsIntermediateTask : Task {
+ /**
+ * List of summarizers to use when processing the metric data.
+ */
+ @get:Internal
+ val summarizersProperty: ListProperty>
+
+ /**
+ * The output directory where the summarizer results should be stored.
+ */
+ @get:OutputDirectory
+ val outputDirectoryProperty: DirectoryProperty
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsInternalExtension.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsInternalExtension.kt
new file mode 100644
index 0000000..ed7f4e9
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsInternalExtension.kt
@@ -0,0 +1,28 @@
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.tasks.TaskProvider
+
+/**
+ * Gradle extension used to expose plugin internals to the task providers used by the
+ * end user.
+ */
+internal open class DevelocityMetricsInternalExtension(
+ private val hourlyTaskProvider: (timeSpec: String) -> TaskProvider,
+ private val dailyTaskProvider: (timeSpec: String) -> TaskProvider,
+ private val durationTaskProvider: (durationSpec: String) -> TaskProvider,
+) {
+ /**
+ * Create a task provider for gathering hourly metric data, given a time specification.
+ */
+ fun createHourlyTask(timeSpec: String): TaskProvider = hourlyTaskProvider(timeSpec)
+
+ /**
+ * Create a task provider for gathering daily metric data, given a time specification.
+ */
+ fun createDailyTask(timeSpec: String): TaskProvider = dailyTaskProvider(timeSpec)
+
+ /**
+ * Create a task provider for gathering metric data over a duration, given a duration specification.
+ */
+ fun createDurationTask(durationSpec: String): TaskProvider = durationTaskProvider(durationSpec)
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsPlugin.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsPlugin.kt
new file mode 100644
index 0000000..c4b0cd6
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/DevelocityMetricsPlugin.kt
@@ -0,0 +1,334 @@
+package com.ebay.plugins.metrics.develocity
+
+import com.ebay.plugins.metrics.develocity.service.DevelocityBuildService
+import com.gradle.develocity.agent.gradle.DevelocityConfiguration
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.provider.ProviderFactory
+import org.gradle.api.tasks.TaskProvider
+import java.time.Duration
+import java.time.Instant
+import java.time.ZoneId
+import java.time.ZonedDateTime
+import java.time.temporal.ChronoUnit
+import javax.inject.Inject
+
+/**
+ * Plugin implementation which defines tasks and configurations artifacts which are used to
+ * generate aggregate metric data based upon Develocity build scans.
+ */
+@Suppress("unused") // False positive
+internal class DevelocityMetricsPlugin @Inject constructor(
+ private val providerFactory: ProviderFactory
+) : Plugin {
+
+ override fun apply(project: Project) {
+ // Everything after this point is to be done only by the root project
+ if (project.parent != null) {
+ return
+ }
+
+ // Create the extension which will be used to configure the plugin behavior
+ val ext = project.extensions.create(EXTENSION_NAME, DevelocityMetricsExtension::class.java)
+ .apply {
+ zoneId.convention(ZoneId.systemDefault().id)
+ develocityMaxConcurrency.convention(24)
+ develocityQueryFilter.convention(providerFactory.gradleProperty(QUERY_FILTER_PROPERTY))
+ }
+
+ // Auto-configure the Gradle Enterprise access if the plugin is applied and has been
+ // directly configured with a server URL and/or access key.
+ project.plugins.withId("com.gradle.enterprise") {
+ @Suppress("DEPRECATION") // GradleEnterpriseExtension is deprecated
+ project.extensions.configure(com.gradle.enterprise.gradleplugin.GradleEnterpriseExtension::class.java) { ge ->
+ ge.server?.let { server -> ext.develocityServerUrl.convention(server) }
+ ge.accessKey?.let { key -> ext.develocityAccessKey.convention(key) }
+ }
+ }
+ project.plugins.withId("com.gradle.develocity") {
+ project.extensions.configure(DevelocityConfiguration::class.java) { ge ->
+ ge.server?.let { server -> ext.develocityServerUrl.convention(server) }
+ ge.accessKey?.let { key -> ext.develocityAccessKey.convention(key) }
+ }
+ }
+
+ // Register the build service used to query Develocity for build data
+ val buildServiceProvider = project.gradle.sharedServices.registerIfAbsent(
+ "develocityMetricsBuildService",
+ DevelocityBuildService::class.java
+ ) { spec ->
+ with(spec.parameters) {
+ serverUrlProperty.set(ext.develocityServerUrl)
+ accessKeyProperty.set(ext.develocityAccessKey)
+ accessKeyFileProperty.set(project.file(project.gradle.gradleUserHomeDir).resolve("develocity/keys.properties"))
+ legacyAccessKeyFileProperty.set(project.file(project.gradle.gradleUserHomeDir).resolve("enterprise/keys.properties"))
+ maxConcurrency.set(ext.develocityMaxConcurrency)
+ }
+ /*
+ * Although the build service can be configured with a higher level of concurrency,
+ * we limit the number of parallel usages here to a single task. This is because:
+ * - Each task may resolve into many builds
+ * - If we run more than one task at a time, the execution time of the all tasks will
+ * be artificially extended due to Develocity API concurrency contention. We want
+ * execution times of each task to be as accurate as possible.
+ * - Should the build fail or be aborted, we want the build cache to be able to avoid
+ * re-running a task. Completing individual tasks as rapidly as possible helps to
+ * achieve this.
+ */
+ spec.maxParallelUsages.set(1)
+ }
+
+ // Create a "current day" value source, configured with the proper time zone
+ val dateHelper = DateHelper(ext.zoneId)
+ val currentDayWithHourProvider =
+ providerFactory.of(CurrentDayWithHourValueSource::class.java) { spec ->
+ spec.parameters { params ->
+ params.zoneId.set(ext.zoneId)
+ }
+ }
+
+ /*
+ * Function to register an hourly gather task. This function must be re-entrant and allow for
+ * the same task to be registered multiple times without error.
+ */
+ val registerHourly: (timeSpec: String) -> TaskProvider = { timeSpec ->
+ val taskName = "$TASK_PREFIX-$timeSpec"
+ if (project.tasks.names.contains(taskName)) {
+ // task already exists. Return its TaskProvider.
+ project.tasks.named(taskName, GatherHourlyTask::class.java)
+ } else {
+ // Task does not exist, so we need to create it.
+ project.tasks.register(taskName, GatherHourlyTask::class.java)
+ .also { gatherTaskProvider ->
+ gatherTaskProvider.configure { task ->
+ with(task) {
+ // Never cache the current hour so that we get up-to-date data:
+ val currentDayWithHour = currentDayWithHourProvider.get()
+ if (timeSpec == currentDayWithHour) {
+ with(outputs) {
+ cacheIf("The current hour is never cached to ensure we have all data") { false }
+ upToDateWhen { false }
+ }
+ }
+
+ val start = dateHelper.fromHourlyString(timeSpec)
+ startProperty.set(start.toEpochMilli())
+ endExclusiveProperty.set(
+ start.plus(1, ChronoUnit.HOURS).toEpochMilli()
+ )
+ zoneIdProperty.set(ext.zoneId)
+ queryProperty.set(ext.develocityQueryFilter)
+ summarizersProperty.set(ext.summarizers)
+ develocityServiceProperty.set(buildServiceProvider)
+ outputDirectoryProperty.set(PathUtil.hourlyOutputDir(project.layout, timeSpec))
+ usesService(buildServiceProvider)
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * Function to register an daily aggregation task. This function must be re-entrant and allow for
+ * the same task to be registered multiple times without error.
+ */
+ val registerDaily: (dateString: String) -> TaskProvider = { dateString ->
+ val taskName = "$TASK_PREFIX-$dateString"
+ if (project.tasks.names.contains(taskName)) {
+ // task already exists. Return its TaskProvider.
+ project.tasks.named(taskName, GatherAggregateTask::class.java)
+ } else {
+ // Task does not exist, so we need to create it.
+ project.tasks.register(taskName, GatherAggregateTask::class.java).also { taskProvider ->
+ taskProvider.configure { task ->
+ with(task) {
+ val currentDayWithHour = currentDayWithHourProvider.get()
+ val day = dateHelper.fromDailyString(dateString)
+ for (interval in 0 until 24) {
+ val hourInstant = day.plus(interval.toLong(), ChronoUnit.HOURS)
+ val timeSpec = dateHelper.toHourlyString(hourInstant)
+
+ dependsOn(project.provider {
+ registerHourly(timeSpec).also { hourlyProvider ->
+ sourceOutputDirectories.from(hourlyProvider.flatMap { it.outputDirectoryProperty })
+ }.name
+ })
+
+ if (timeSpec == currentDayWithHour) {
+ // We are processing the current day and have reached the current hour. Stop here.
+ break
+ }
+ }
+ zoneOffset.set(ext.zoneId)
+ summarizersProperty.set(ext.summarizers)
+ outputDirectoryProperty.set(PathUtil.dailyOutputDir(project.layout, dateString))
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * Rule to register a task for a specific date and optionally hour.
+ */
+ project.tasks.addRule(
+ "Pattern: $TASK_PREFIX---T[] " +
+ "Gathers Develocity metrics for the date (and optionally hour) specified."
+ ) { taskName ->
+ val matcher = DATETIME_TASK_PATTERN.matcher(taskName)
+ if (!matcher.matches()) return@addRule
+
+ val date = matcher.group(2)
+ val timeSpec: String = matcher.group(1)
+ val hour: String? = matcher.group(3)
+
+ if (hour == null ) {
+ // Daily task
+ registerDaily(date)
+ } else {
+ // Hourly task
+ registerHourly(timeSpec)
+ }
+ }
+
+ /*
+ * Function to register an duration aggregation task. This function must be re-entrant and allow for
+ * the same task to be registered multiple times without error.
+ */
+ val registerDurationAggregation: (durationStr: String) -> TaskProvider = { durationStr ->
+ val duration = Duration.parse(durationStr)
+ val currentDayWithHour = currentDayWithHourProvider.get()
+ val endTime = dateHelper.fromHourlyString(currentDayWithHour)
+ val startTime = endTime.minus(duration).truncatedTo(ChronoUnit.HOURS)
+ val inputTaskProviders = generateTimeSequence(ext.zoneId.get(), startTime, endTime).map { (isHourly, dateTime) ->
+ val dateStr = dateHelper.toDailyString(dateTime.toInstant())
+ if (isHourly) {
+ val timeSpec = dateHelper.toHourlyString(dateTime.toInstant())
+ registerHourly(timeSpec)
+ } else {
+ registerDaily(dateStr)
+ }
+ }.toList()
+
+ val taskName = "$TASK_PREFIX-last-$durationStr"
+ if (project.tasks.names.contains(taskName)) {
+ // task already exists. Return its TaskProvider.
+ project.tasks.named(taskName, GatherAggregateTask::class.java)
+ } else {
+ // Task does not exist, so we need to create it.
+ project.tasks.register(taskName, GatherAggregateTask::class.java).also { taskProvider ->
+ taskProvider.configure { task ->
+ with(task) {
+ inputTaskProviders.forEach { taskProvider ->
+ sourceOutputDirectories.from(taskProvider.flatMap {
+ if (it is DevelocityMetricsIntermediateTask) {
+ it.outputDirectoryProperty
+ } else {
+ throw IllegalStateException("Unexpected task type: ${it::class.java}")
+ }
+ })
+ }
+ zoneOffset.set(ext.zoneId)
+ summarizersProperty.set(ext.summarizers)
+ outputDirectoryProperty.set(PathUtil.durationOutputDir(project.layout, durationStr))
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * Rule to register a task for a time window / duration, relative to the current day and hour.
+ */
+ project.tasks.addRule(
+ "Pattern: $TASK_PREFIX-last- " +
+ "Aggregates Develocity metrics for the current date back in time for the " +
+ "specified duration."
+ ) { taskName ->
+ val matcher = DURATION_TASK_PATTERN.matcher(taskName)
+ if (!matcher.matches()) return@addRule
+
+ val durationStr: String = matcher.group(1)
+ registerDurationAggregation(durationStr)
+ }
+
+ ext.extensions.create(
+ INTERNAL_EXTENSION_NAME,
+ DevelocityMetricsInternalExtension::class.java,
+ registerHourly,
+ registerDaily,
+ registerDurationAggregation,
+ )
+ }
+
+ /**
+ * Generates a sequence of date time instances between the start and end times.
+ *
+ * The sequence will return hourly intervals for the start day and end days and daily
+ * intervals for everything else in between.
+ *
+ * If the start time is more than 7 days in the past, the sequence will return a daily
+ * reference for the start of the time range, sacrificing some accuracy in order to improve
+ * the chances that the data will still exist in the build cache.
+ *
+ * @return pair of boolean indicating if the instant is an hourly interval and the date
+ * time instance itself
+ */
+ private fun generateTimeSequence(timeZoneId: String, startTime: Instant, endTime: Instant) : Sequence> {
+ val zone = ZoneId.of(timeZoneId)
+ val zonedStartTime = startTime.atZone(zone)
+ val startDay = startTime.atZone(zone).truncatedTo(ChronoUnit.DAYS)
+ val endDay = endTime.atZone(zone).truncatedTo(ChronoUnit.DAYS)
+
+ // If we get this far in the past then we retain daily rollup-use, sacrificing some
+ // precision at the start-end of the range but making it more likely that we won't
+ // be requesting data that has been evicted from the cache.
+ val dailyCutOffThreshold = endTime.atZone(zone)
+ .minus(7, ChronoUnit.DAYS)
+ .truncatedTo(ChronoUnit.DAYS)
+
+ return sequence {
+ var dateTime = endTime.atZone(zone)
+ while (dateTime >= zonedStartTime) {
+ val timeDay = dateTime.truncatedTo(ChronoUnit.DAYS)
+ if ((timeDay == startDay && timeDay.isAfter(dailyCutOffThreshold)) || timeDay == endDay) {
+ yield(Pair(true, dateTime.truncatedTo(ChronoUnit.HOURS)))
+ dateTime = dateTime.minus(1, ChronoUnit.HOURS)
+ } else {
+ val currentDay = dateTime.truncatedTo(ChronoUnit.DAYS)
+ yield(Pair(false, currentDay))
+ val nextDay = dateTime.minus(1, ChronoUnit.DAYS)
+ dateTime = if (nextDay == startDay) {
+ // start at the end hour of the day
+ nextDay.plus(23, ChronoUnit.HOURS)
+ } else {
+ dateTime.minus(1, ChronoUnit.DAYS)
+ }
+ }
+ }
+ }
+ }
+
+ companion object {
+ const val EXTENSION_NAME = "develocityMetrics"
+ const val INTERNAL_EXTENSION_NAME = "develocityMetricsInternal"
+ const val TASK_PREFIX = "develocityMetrics"
+ const val TASK_GROUP = "develocity metrics"
+ const val QUERY_FILTER_PROPERTY = "develocityMetricsQueryFilter"
+
+ private val DATETIME_TASK_PATTERN = Regex(
+ // Examples:
+ // develocityMetrics-2024-06-01
+ // develocityMetrics-2024-06-01T05
+ "^\\Q$TASK_PREFIX-\\E((\\d{4}-\\d{2}-\\d{2})(?:T(\\d{2}))?)$"
+ ).toPattern()
+
+ private val DURATION_TASK_PATTERN = Regex(
+ // Examples:
+ // develocityMetrics-last-P7D
+ // develocityMetrics-last-PT8H
+ // develocityMetrics-last-P2DT8H
+ "^\\Q$TASK_PREFIX-last-\\E(\\w+)$"
+ ).toPattern()
+ }
+}
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/GatherAggregateTask.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/GatherAggregateTask.kt
new file mode 100644
index 0000000..9e8142b
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/GatherAggregateTask.kt
@@ -0,0 +1,81 @@
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.DefaultTask
+import org.gradle.api.GradleException
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.model.ObjectFactory
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.Internal
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import javax.inject.Inject
+
+/**
+ * Task implementation which aggregates the metric data from multiple sources and produces
+ * a reduced set of intermediate data.
+ */
+@CacheableTask
+open class GatherAggregateTask @Inject constructor(
+ private val objectFactory: ObjectFactory,
+): DefaultTask(), DevelocityMetricsIntermediateTask {
+ /**
+ * The set of source directories to aggregate. Each directory added to this collection
+ * should be an output directory of a [DevelocityMetricsIntermediateTask] instance.
+ */
+ @get:InputFiles
+ @get:PathSensitive(PathSensitivity.NONE)
+ val sourceOutputDirectories: ConfigurableFileCollection = objectFactory.fileCollection()
+
+ /**
+ * Time zone offset to use when processing the metric data. This is here only to ensure that
+ * cached data is invalidated if the confiugure time zone changes.
+ */
+ @get:Input
+ val zoneOffset: Property = objectFactory.property(String::class.java)
+
+ @get:Internal
+ override val summarizersProperty: ListProperty> = objectFactory.listProperty(DevelocityMetricSummarizer::class.java)
+
+ @get:OutputDirectory
+ override val outputDirectoryProperty: DirectoryProperty = objectFactory.directoryProperty()
+
+ @TaskAction
+ fun gather() {
+ val inputs = sourceOutputDirectories.files
+ .sorted()
+ .joinToString(prefix = "Aggregating sources:\n\t", separator = "\n\t") { it.name }
+ outputDirectoryProperty.file("inputs").get().asFile.writeText(inputs)
+
+ val summarizerStates = summarizersProperty.get().map { MetricSummarizerState(it) }
+ sourceOutputDirectories.files.forEach { input ->
+ summarizerStates.forEach { state ->
+ // We should be receiving directories as inputs. This is just a safeguard to ensure
+ // that this is upheld.
+ if (!input.isDirectory) {
+ throw GradleException("Unexpected non-directory input: $input")
+ }
+
+ // NOTE: The `ingestFile` API consumes a `RegularFile` Gradle API instance but we are starting
+ // with a `File` instance. This is a bit of a hack to convert the `File` to a `RegularFile`:
+ val directory = objectFactory.directoryProperty().apply {
+ set(input)
+ }.get()
+ val inputFile = PathUtil.summarizerFile(directory, state.summarizer)
+
+ state.ingestFile(inputFile)
+ }
+ }
+
+ summarizerStates.forEach { state ->
+ val outputFile = PathUtil.summarizerFile(outputDirectoryProperty.get(), state.summarizer)
+ state.write(outputFile)
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/GatherHourlyTask.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/GatherHourlyTask.kt
new file mode 100644
index 0000000..b65c9a2
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/GatherHourlyTask.kt
@@ -0,0 +1,160 @@
+package com.ebay.plugins.metrics.develocity
+
+import com.ebay.plugins.metrics.develocity.service.DevelocityService
+import com.ebay.plugins.metrics.develocity.service.model.BuildQuery
+import com.ebay.plugins.metrics.develocity.service.model.BuildsQuery
+import io.ktor.client.statement.HttpResponse
+import io.ktor.client.statement.bodyAsText
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.toList
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.gradle.api.DefaultTask
+import org.gradle.api.GradleException
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.model.ObjectFactory
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.Internal
+import org.gradle.api.tasks.Optional
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.TaskAction
+import java.time.Instant
+import java.time.OffsetDateTime
+import java.time.ZoneId
+import java.time.ZoneOffset
+import java.time.format.DateTimeFormatter
+import javax.inject.Inject
+
+/**
+ * Task implementation which queries Develocity to gather build data for a single hour. The data
+ * is then processed by the metric summarizers and aggregated into a single file per summarizer.
+ */
+@CacheableTask
+open class GatherHourlyTask @Inject constructor(
+ objectFactory: ObjectFactory,
+): DefaultTask(), DevelocityMetricsIntermediateTask {
+ /**
+ * The start time of the hour to gather data for, in milliseconds since the epoch.
+ */
+ @get:Input
+ val startProperty: Property = objectFactory.property(Long::class.java)
+
+ /**
+ * The end time of the hour to gather data for, in milliseconds since the epoch. All build
+ * data to process will have completed before this time.
+ */
+ @get:Input
+ val endExclusiveProperty: Property = objectFactory.property(Long::class.java)
+
+ /**
+ * The reference time zone for use when converting instants into times.
+ */
+ @get:Input
+ val zoneIdProperty: Property = objectFactory.property(String::class.java)
+
+ /**
+ * An additional query filter to apply to the Develocity query to narrow the scope of the
+ * builds to be processed. This filter is expressed using the Develocity's advanced search
+ * syntax: https://docs.gradle.com/enterprise/api-manual/#advanced_search_syntax
+ */
+ @get:Input
+ @get:Optional
+ val queryProperty: Property = objectFactory.property(String::class.java)
+
+ /**
+ * Develocity build service instance.
+ */
+ @get:Internal
+ val develocityServiceProperty: Property = objectFactory.property(
+ DevelocityService::class.java)
+
+ @get:Internal
+ override val summarizersProperty: ListProperty> = objectFactory.listProperty(DevelocityMetricSummarizer::class.java)
+
+ @get:OutputDirectory
+ override val outputDirectoryProperty: DirectoryProperty = objectFactory.directoryProperty()
+
+ @TaskAction
+ fun gather() {
+ val zone = ZoneId.of(zoneIdProperty.get())
+ val startPretty = OffsetDateTime.ofInstant(Instant.ofEpochMilli(startProperty.get()), zone)
+ val endPretty = OffsetDateTime.ofInstant(Instant.ofEpochMilli(endExclusiveProperty.get()).minusMillis(1), zone)
+ val service = develocityServiceProperty.get()
+ val summarizers = summarizersProperty.get()
+
+ // Build an advanced syntax filter query
+ val dateFormatter = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.of(ZoneOffset.UTC.id))
+ val fromFormatted = dateFormatter.format(startPretty)
+ val toFormatted = dateFormatter.format(endPretty)
+ val timeQuery = "buildStartTime:[$fromFormatted to $toFormatted]"
+ val queryFilter = queryProperty.get()
+ val queryString = if (queryFilter.isNullOrBlank()) {
+ timeQuery
+ } else {
+ "$timeQuery and ($queryFilter)"
+ }
+
+ // Fail task execution if we receive any error responses
+ val errorHandler: (response: HttpResponse) -> Unit = {
+ runBlocking {
+ throw GradleException("Failed to get builds: ${it.call.response.status}\n\t${it.call.response.bodyAsText()}")
+ }
+ }
+
+ // Determine the complete set of models that the summarizers will need
+ val modelsNeeded = summarizers
+ .flatMap { it.modelsNeeded }
+ .toSet()
+ .toList()
+ .takeIf { it.isNotEmpty() }
+
+ runBlocking(Dispatchers.Default) {
+ // First, query for all the builds but don't return any details
+ val buildsQuery = BuildsQuery(
+ fromInstant = startProperty.get(),
+ maxBuilds = 1000,
+ query = queryString,
+ )
+ service.builds(buildsQuery, errorHandler)
+ val buildRefs = service.builds(buildsQuery, errorHandler).toList().also {
+ if (it.size == 1000) {
+ throw GradleException("Too many builds! Need to implement paging-based querying!")
+ }
+ }
+
+ // Initialize our summarizers
+ val summarizerStates = summarizers.map { MetricSummarizerState(it) }
+
+ buildRefs
+ .map { buildRef ->
+ // Process each build in parallel
+ launch {
+ val detailsQuery = BuildQuery(
+ models = modelsNeeded
+ )
+ // NOTE: The concurrency here is limited by the [DevelocityService]
+ // implementation and is how we control memory utilization.
+ service.build(buildRef.id, detailsQuery, errorHandler) { build ->
+ summarizerStates.forEach { state ->
+ state.ingestBuild(build)
+ }
+ }
+ }
+ }
+ .map {
+ // Wait for all jobs to complete
+ it.join()
+ }
+
+ // Write the reduced results to disk
+ val outputDirectory = outputDirectoryProperty.get()
+ summarizerStates.forEach { state ->
+ val outputFile = PathUtil.hourlySummarizerOutputFile(outputDirectory, state.summarizer)
+ state.write(outputFile)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/MetricSummarizerState.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/MetricSummarizerState.kt
new file mode 100644
index 0000000..0550e8c
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/MetricSummarizerState.kt
@@ -0,0 +1,61 @@
+package com.ebay.plugins.metrics.develocity
+
+import com.ebay.plugins.metrics.develocity.service.model.Build
+import org.gradle.api.file.RegularFile
+import java.util.concurrent.atomic.AtomicReference
+
+/**
+ * Helper which manages the state of a single summarizer.
+ *
+ * This helps us work around generic erasure issues by consolidating the type of all
+ * calls made to a single sumamrizer into a single class.
+ */
+internal class MetricSummarizerState(
+ val summarizer: DevelocityMetricSummarizer,
+) {
+ private val stateRef = AtomicReference()
+
+ /**
+ * Update the current state with the given intermediate data.
+ */
+ tailrec fun update(intermediate: T) {
+ val state = stateRef.get()
+ val success = if (state == null) {
+ stateRef.compareAndSet(null, intermediate)
+ } else {
+ val reduced = summarizer.reduce(state, intermediate)
+ stateRef.compareAndSet(state, reduced)
+ }
+ if (success) return
+ update(intermediate)
+ }
+
+ /**
+ * Update the current state by adding a new build's data. This will cause the summarizer
+ * to extract the intermediate data from the build and then reduce it with the current state.
+ */
+ fun ingestBuild(build: Build) {
+ val intermediate = summarizer.extract(build)
+ update(intermediate)
+ }
+
+ /**
+ * Update the current state by reading the intermediate data from the given file and then
+ * reducing it with the current state.
+ */
+ fun ingestFile(file: RegularFile) {
+ summarizer.read(file).let { intermediate ->
+ update(intermediate)
+ }
+ }
+
+ /**
+ * Writes the current state to the file location specified. If no data has been accumulated
+ * then the file will not be written.
+ */
+ fun write(file: RegularFile) {
+ stateRef.get()?.let {
+ summarizer.write(it, file)
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/MetricSummarizerTask.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/MetricSummarizerTask.kt
new file mode 100644
index 0000000..1cb9f61
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/MetricSummarizerTask.kt
@@ -0,0 +1,16 @@
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.Task
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+
+/**
+ * Task properties which must exist on tasks which consume the summarizer output.
+ */
+interface MetricSummarizerTask : Task {
+ @get:InputFile
+ @get:PathSensitive(PathSensitivity.NONE)
+ val summarizerDataProperty: RegularFileProperty
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/PathUtil.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/PathUtil.kt
new file mode 100644
index 0000000..852b642
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/PathUtil.kt
@@ -0,0 +1,94 @@
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.file.Directory
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.file.ProjectLayout
+import org.gradle.api.file.RegularFile
+import org.gradle.api.provider.Provider
+
+/**
+ * Utility to help consolidate all path-related logic for the develocity metrics plugin.
+ */
+object PathUtil {
+ private fun summarizerFileName(summarizer: DevelocityMetricSummarizer<*>) = summarizer.id
+
+ /**
+ * The base directory of all daily tasks.
+ */
+ private fun dailyBaseDir(
+ projectLayout: ProjectLayout,
+ ): Provider = projectLayout.buildDirectory.dir("$BASE_DIR/daily")
+
+ /**
+ * The output directory for a daily task.
+ */
+ fun dailyOutputDir(
+ projectLayout: ProjectLayout,
+ dateStr: String,
+ ): Provider = dailyBaseDir(projectLayout).map { dailyBaseDir ->
+ dailyBaseDir.dir(dateStr)
+ }
+
+ /**
+ * The base directory for all hourly outputs.
+ */
+ private fun hourlyBaseDir(
+ projectLayout: ProjectLayout,
+ ): Provider = projectLayout.buildDirectory.dir("$BASE_DIR/hourly")
+
+ /**
+ * The output directory for an hourly task with the given time spec.
+ */
+ fun hourlyOutputDir(
+ projectLayout: ProjectLayout,
+ timeSpec: String,
+ ): Provider = hourlyBaseDir(projectLayout).map { hourlyBaseDir ->
+ hourlyBaseDir.dir(timeSpec)
+ }
+
+ /**
+ * The output file for a summarizer's intermediate data file within an hourly task's
+ * output directory.
+ */
+ fun hourlySummarizerOutputFile(
+ hourlyDir: Directory,
+ summarizer: DevelocityMetricSummarizer<*>,
+ ): RegularFile = summarizerFile(hourlyDir, summarizer)
+
+ /**
+ * The base directory for all duration-specific tasks.
+ */
+ private fun durationBaseDir(
+ projectLayout: ProjectLayout,
+ ): Provider = projectLayout.buildDirectory.dir("$BASE_DIR/last")
+
+ /**
+ * The output directory for a duration-specific task with the given duration spec.
+ */
+ fun durationOutputDir(
+ projectLayout: ProjectLayout,
+ durationSpec: String,
+ ): Provider = durationBaseDir(projectLayout).map { durationBaseDir ->
+ durationBaseDir.dir(durationSpec)
+ }
+
+ /**
+ * The output file location for a summarizer's intermediate data file within an
+ * output directory.
+ */
+ fun summarizerFile(
+ directory: Directory,
+ summarizer: DevelocityMetricSummarizer<*>
+ ): RegularFile = directory.file(summarizerFileName(summarizer))
+
+ /**
+ * The output file location for a summarizer's intermediate data file within an
+ * output directory.
+ */
+ fun summarizerFile(
+ directory: DirectoryProperty,
+ summarizerId: String
+ ): Provider = directory.file(summarizerId)
+
+ private const val BASE_DIR = "develocity-metrics"
+}
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/TaskProviderExtensions.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/TaskProviderExtensions.kt
new file mode 100644
index 0000000..80ff356
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/TaskProviderExtensions.kt
@@ -0,0 +1,77 @@
+@file:Suppress("unused") // Public API
+
+package com.ebay.plugins.metrics.develocity
+
+import org.gradle.api.Project
+import org.gradle.api.tasks.TaskProvider
+
+/**
+ * Helper function to configure a task's inputs to use the outputs of of metric summarizer,
+ * with the summary data spanning the duration specified.
+ */
+fun TaskProvider.inputsFromHourly(
+ project: Project,
+ timeSpec: String,
+ summarizerId: String,
+) {
+ val inputTask = project.internalExt().createHourlyTask(timeSpec)
+ configureInputs(inputTask, summarizerId)
+}
+
+/**
+ * Helper function to configure a task's inputs to use the outputs of of metric summarizer,
+ * with the summary data spanning the duration specified.
+ */
+fun TaskProvider.inputsFromDaily(
+ project: Project,
+ timeSpec: String,
+ summarizerId: String,
+) {
+ val inputTask = project.internalExt().createDailyTask(timeSpec)
+ configureInputs(inputTask, summarizerId)
+}
+
+/**
+ * Helper function to configure a task's inputs to use the outputs of of metric summarizer,
+ * with the summary data spanning the duration specified.
+ */
+fun TaskProvider.inputsFromDuration(
+ project: Project,
+ durationSpec: String,
+ summarizerId: String,
+) {
+ val inputTask = project.internalExt().createDurationTask(durationSpec)
+ configureInputs(inputTask, summarizerId)
+}
+
+/**
+ * Get the internal extension for a given project.
+ */
+private fun Project.internalExt(): DevelocityMetricsInternalExtension {
+ /*
+ * NOTE: This is a bit of a project isolation violation. We could likely avoid this if task
+ * rules applied to programmatically created tasks as well as those created on the command
+ * line. This works for now...
+ */
+ // NTVARCH-20906: This violates project isolation
+ val ext = project.rootProject.extensions.getByType(DevelocityMetricsExtension::class.java)
+ return ext.extensions.getByType(DevelocityMetricsInternalExtension::class.java)
+}
+
+/**
+ * Common helper configuration for tasks which consume the summarizer output.
+ */
+private fun TaskProvider.configureInputs(
+ inputTask: TaskProvider,
+ summarizerId: String,
+) {
+ configure { self ->
+ with(self) {
+ dependsOn(inputTask)
+ val inputFileProvider = inputTask.flatMap { aggregateTask ->
+ PathUtil.summarizerFile(aggregateTask.outputDirectoryProperty, summarizerId)
+ }
+ summarizerDataProperty.set(inputFileProvider)
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/DevelocityBuildService.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/DevelocityBuildService.kt
new file mode 100644
index 0000000..d496f4e
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/DevelocityBuildService.kt
@@ -0,0 +1,208 @@
+package com.ebay.plugins.metrics.develocity.service
+
+import com.ebay.plugins.metrics.develocity.service.model.Build
+import com.ebay.plugins.metrics.develocity.service.model.BuildQuery
+import com.ebay.plugins.metrics.develocity.service.model.BuildsQuery
+import io.ktor.client.HttpClient
+import io.ktor.client.call.body
+import io.ktor.client.engine.okhttp.OkHttp
+import io.ktor.client.plugins.auth.Auth
+import io.ktor.client.plugins.auth.providers.BearerTokens
+import io.ktor.client.plugins.auth.providers.bearer
+import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
+import io.ktor.client.request.get
+import io.ktor.client.statement.HttpResponse
+import io.ktor.client.statement.request
+import io.ktor.http.isSuccess
+import io.ktor.serialization.kotlinx.json.json
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.emitAll
+import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.withContext
+import kotlinx.serialization.json.Json
+import okhttp3.Dispatcher
+import org.gradle.api.GradleException
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.logging.Logging
+import org.gradle.api.provider.ProviderFactory
+import org.gradle.api.services.BuildService
+import java.net.URI
+import java.util.Properties
+import javax.inject.Inject
+import kotlin.time.Duration.Companion.minutes
+import kotlin.time.toJavaDuration
+
+/**
+ * Gradle shared build service implementation which provides access to the Develocity API.
+ *
+ * This allows for the HTTP client to be centrally managed, centrally mananaging request
+ * parallelism.
+ */
+abstract class DevelocityBuildService @Inject constructor(
+ private val providerFactory: ProviderFactory
+): BuildService, DevelocityService, AutoCloseable {
+ private val logger = Logging.getLogger(javaClass.simpleName)
+
+ private val serverUrl by lazy { resolveServer() }
+
+ private val accessKey by lazy { resolveAccessKey(serverUrl) }
+
+ private val baseUrl = serverUrl.removeSuffix("/")
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ private val dispatcher by lazy {
+ Dispatchers.IO.limitedParallelism(parameters.maxConcurrency.get())
+ }
+
+ private val client by lazy {
+ HttpClient(OkHttp) {
+ engine {
+ config {
+ dispatcher(Dispatcher().apply {
+ // This controls the total concurrency of processing samples
+ maxRequestsPerHost = parameters.maxConcurrency.get()
+ })
+ connectTimeout(5.minutes.toJavaDuration())
+ readTimeout(5.minutes.toJavaDuration())
+ writeTimeout(5.minutes.toJavaDuration())
+ }
+ }
+ install(Auth) {
+ bearer {
+ loadTokens {
+ BearerTokens(accessKey, accessKey)
+ }
+ }
+ }
+ install(ContentNegotiation) {
+ json(Json {
+ ignoreUnknownKeys = true
+ })
+ }
+ }
+ }
+
+ override fun close() {
+ client.close()
+ }
+
+ override suspend fun builds(
+ params: BuildsQuery,
+ errorHandler: (response: HttpResponse) -> Unit
+ ): Flow = withContext(dispatcher) {
+ return@withContext flow {
+ val response = client.get("$baseUrl/api/builds") {
+ url {
+ params.fromInstant?.let { parameters.append("fromInstant", it.toString()) }
+ params.fromBuild?.let { parameters.append("fromBuild", it) }
+ params.reverse?.let { parameters.append("reverse", it.toString()) }
+ params.maxBuilds?.let { parameters.append("maxBuilds", it.toString()) }
+ params.maxWaitSecs?.let { parameters.append("maxWaitSecs", it.toString()) }
+ params.query?.let { parameters.append("query", it) }
+ params.models?.let { modelName -> parameters.appendAll("models", modelName.map { it.value }) }
+ params.allModels?.let { parameters.append("allModels", it.toString()) }
+ }
+ }
+ logResponse(response)
+ if (response.status.isSuccess()) {
+ val builds: List = response.body()
+ logger.debug("\t${builds.size} build(s) returned")
+ builds.forEach { emit(it) }
+ params.maxBuilds?.let { max ->
+ if (builds.size == max) {
+ emitAll(builds(params.copy(fromBuild = builds.last().id), errorHandler))
+ }
+ }
+ } else {
+ errorHandler.invoke(response)
+ }
+ }
+ }
+
+ override suspend fun build(
+ buildId: String,
+ params: BuildQuery,
+ errorHandler: (response: HttpResponse) -> Unit,
+ transform: (Build) -> T,
+ ): T? = withContext(dispatcher) {
+ val response = client.get("$baseUrl/api/builds/$buildId") {
+ url {
+ params.models?.let { modelName -> parameters.appendAll("models", modelName.map { it.value }) }
+ params.allModels?.let { parameters.append("allModels", it.toString()) }
+ }
+ }
+ logResponse(response)
+ return@withContext if (response.status.isSuccess()) {
+ transform.invoke(response.body())
+ } else {
+ errorHandler.invoke(response)
+ null
+ }
+ }
+
+ private fun logResponse(response: HttpResponse) {
+ logger.info(
+ "HTTP {} {} {}",
+ response.request.method.value,
+ response.request.url,
+ response.status
+ )
+ }
+
+ private fun resolveServer(): String {
+ return parameters.serverUrlProperty.orNull ?: throw GradleException("Develocity server URL must be set")
+ }
+
+ private fun resolveAccessKey(serverUrl: String): String {
+ val host = URI(serverUrl).host
+ val token = sequence {
+ yield(parameters.accessKeyProperty.orNull)
+ yield(getTokenFromEnvVar("DEVELOCITY_ACCESS_KEY", host))
+ yield(getTokenFromEnvVar("GRADLE_ENTERPRISE_ACCESS_KEY", host))
+ yield(getTokenFromFile(parameters.accessKeyFileProperty, host))
+ yield(getTokenFromFile(parameters.legacyAccessKeyFileProperty, host))
+ }.filterNotNull().firstOrNull()
+
+ if (token.isNullOrBlank()) {
+ throw GradleException("Unable to resolve the Develocity access key for host: $host")
+ }
+
+ return token
+ }
+
+ // xref: https://docs.gradle.com/develocity/gradle-plugin/current/#via_environment_variable
+ private fun getTokenFromEnvVar(varName: String, host: String): String? {
+ providerFactory.environmentVariable(varName).orNull?.let { envVar ->
+ return envVar.split(';')
+ .firstNotNullOfOrNull { hostEqToken ->
+ val split = hostEqToken.split('=')
+ if (split.size == 2) {
+ val (tokenHost, token) = split
+ if (tokenHost == host) {
+ token
+ } else {
+ null
+ }
+ } else {
+ null
+ }
+ }
+ }
+ return null
+ }
+
+ private fun getTokenFromFile(fileProperty: RegularFileProperty, host: String): String? {
+ val file = fileProperty.get().asFile
+ if (file.exists()) {
+ val props = Properties()
+ file.reader().use { reader ->
+ props.load(reader)
+ }
+
+ return props.getProperty(host) ?: null
+ }
+ return null
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/DevelocityBuildServiceParameters.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/DevelocityBuildServiceParameters.kt
new file mode 100644
index 0000000..27d5fd6
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/DevelocityBuildServiceParameters.kt
@@ -0,0 +1,44 @@
+package com.ebay.plugins.metrics.develocity.service
+
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.services.BuildServiceParameters
+
+/**
+ * Build service parameters for the [DevelocityBuildService].
+ */
+abstract class DevelocityBuildServiceParameters : BuildServiceParameters {
+ /**
+ * The maximum number of concurrent requests to make to the Develocity API. Since these
+ * data models are large, higher levels of concurrency will have an impact on memory
+ * pressude.
+ */
+ abstract val maxConcurrency : Property
+
+ /**
+ * The develocity server URL.
+ */
+ abstract val serverUrlProperty : Property
+
+ /**
+ * Develocity access key file from the user's gradle home directory. This is the location
+ * where the automatically provisioned key will be stored, as the the documentation:
+ * https://docs.gradle.com/develocity/gradle-plugin/current/#automated_access_key_provisioning
+ *
+ * It may also be manually provisioned via this file:
+ * https://docs.gradle.com/develocity/gradle-plugin/current/#via_file
+ */
+ abstract val accessKeyFileProperty : RegularFileProperty
+
+ /**
+ * Gradle Enterprise access key file from the user's gradle home directory. This is the older
+ * location prior to the develocity rename.
+ */
+ abstract val legacyAccessKeyFileProperty : RegularFileProperty
+
+ /**
+ * Develocity access key, when directly configured/specified via the Develocity plugin:
+ * https://docs.gradle.com/develocity/gradle-plugin/current/#via_settings_file
+ */
+ abstract val accessKeyProperty : Property
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/DevelocityService.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/DevelocityService.kt
new file mode 100644
index 0000000..04d41a9
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/DevelocityService.kt
@@ -0,0 +1,30 @@
+package com.ebay.plugins.metrics.develocity.service
+
+import com.ebay.plugins.metrics.develocity.service.model.Build
+import com.ebay.plugins.metrics.develocity.service.model.BuildQuery
+import com.ebay.plugins.metrics.develocity.service.model.BuildsQuery
+import io.ktor.client.statement.HttpResponse
+import kotlinx.coroutines.flow.Flow
+
+/**
+ * Simple interface to separate the API for interacting with the Develocity API from the implementation.
+ */
+interface DevelocityService {
+ /**
+ * Get a list of builds. This call handles the pagination of the results automatically.
+ *
+ * https://docs.gradle.com/enterprise/api-manual/ref/2022.4.html#operation/GetBuilds
+ */
+ suspend fun builds(params: BuildsQuery, errorHandler: (response: HttpResponse) -> Unit = { _ -> }): Flow
+
+ /**
+ * Get build details for the build with the given ID.
+ */
+ suspend fun build(
+ buildId: String,
+ params: BuildQuery,
+ errorHandler: (response: HttpResponse) -> Unit = { _ -> },
+ transform: (Build) -> T,
+ ): T?
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ApiProblem.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ApiProblem.kt
new file mode 100644
index 0000000..355dd27
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ApiProblem.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Response detailing why a request was rejected. Adheres to the [RFC-7807](https://datatracker.ietf.org/doc/html/rfc7807) standard (colloquially known as \"Problem JSON\") for the response format.
+ *
+ * @param status HTTP status code of the problem response.
+ * @param type A URN (Uniform Resource Name) identifying the type of the problem.
+ * @param title The underlying reason for the problem.
+ * @param detail A longer and comprehensive description of the problem. May be `null` if not available.
+ */
+@Serializable
+
+data class ApiProblem (
+
+ /* HTTP status code of the problem response. */
+ @SerialName(value = "status")
+ val status: kotlin.Int,
+
+ /* A URN (Uniform Resource Name) identifying the type of the problem. */
+ @SerialName(value = "type")
+ val type: kotlin.String,
+
+ /* The underlying reason for the problem. */
+ @SerialName(value = "title")
+ val title: kotlin.String,
+
+ /* A longer and comprehensive description of the problem. May be `null` if not available. */
+ @SerialName(value = "detail")
+ val detail: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BazelWorkUnit.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BazelWorkUnit.kt
new file mode 100644
index 0000000..98ef8fd
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BazelWorkUnit.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Bazel work unit.
+ *
+ * @param packageName The name of the Bazel package.
+ * @param targetName The name of the Bazel target.
+ */
+@Serializable
+
+data class BazelWorkUnit (
+
+ /* The name of the Bazel package. */
+ @SerialName(value = "packageName")
+ val packageName: kotlin.String,
+
+ /* The name of the Bazel target. */
+ @SerialName(value = "targetName")
+ val targetName: kotlin.String
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/Build.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/Build.kt
new file mode 100644
index 0000000..c0bd449
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/Build.kt
@@ -0,0 +1,59 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A build with common attributes.
+ *
+ * @param id The Build Scan ID.
+ * @param availableAt A unix-epoch-time in milliseconds referring to the instant that Develocity completed receiving and processing the build.
+ * @param buildToolType The build tool type of the build.
+ * @param buildToolVersion The build tool version used.
+ * @param buildAgentVersion The build agent version used.
+ * @param models
+ */
+@Serializable
+
+data class Build (
+
+ /* The Build Scan ID. */
+ @SerialName(value = "id")
+ val id: kotlin.String,
+
+ /* A unix-epoch-time in milliseconds referring to the instant that Develocity completed receiving and processing the build. */
+ @SerialName(value = "availableAt")
+ val availableAt: kotlin.Long,
+
+ /* The build tool type of the build. */
+ @SerialName(value = "buildToolType")
+ val buildToolType: kotlin.String,
+
+ /* The build tool version used. */
+ @SerialName(value = "buildToolVersion")
+ val buildToolVersion: kotlin.String,
+
+ /* The build agent version used. */
+ @SerialName(value = "buildAgentVersion")
+ val buildAgentVersion: kotlin.String,
+
+ @SerialName(value = "models")
+ val models: BuildModels? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildAttributesEnvironment.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildAttributesEnvironment.kt
new file mode 100644
index 0000000..e8b99b5
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildAttributesEnvironment.kt
@@ -0,0 +1,86 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The environment where the build is executed.
+ *
+ * @param operatingSystem Operating system of the build machine.
+ * @param numberOfCpuCores Number of cores available to the build JVM.
+ * @param jreVersion Version of the Java runtime executing the build.
+ * @param jvmVersion Version of the Java Virtual Machine executing the build.
+ * @param jvmMaxMemoryHeapSize Maximum heap memory available to the build JVM in bytes.
+ * @param jvmLocale The locale of the JVM executing the build.
+ * @param username Operating system username of the build user. `null` if no username is captured.
+ * @param jvmCharset The default charset of the JVM executing the build. `null` if capturing is not possible.
+ * @param publicHostname The hostname of the build machine, as seen on the network. `null` if capturing is not possible.
+ * @param localHostname The hostname of the build machine, as specified by itself. `null` if capturing is not possible.
+ * @param localIpAddresses The local IP addresses of the build machine. `null` if capturing is not possible.
+ */
+@Serializable
+
+data class BuildAttributesEnvironment (
+
+ /* Operating system of the build machine. */
+ @SerialName(value = "operatingSystem")
+ val operatingSystem: kotlin.String,
+
+ /* Number of cores available to the build JVM. */
+ @SerialName(value = "numberOfCpuCores")
+ val numberOfCpuCores: kotlin.Int,
+
+ /* Version of the Java runtime executing the build. */
+ @SerialName(value = "jreVersion")
+ val jreVersion: kotlin.String,
+
+ /* Version of the Java Virtual Machine executing the build. */
+ @SerialName(value = "jvmVersion")
+ val jvmVersion: kotlin.String,
+
+ /* Maximum heap memory available to the build JVM in bytes. */
+ @SerialName(value = "jvmMaxMemoryHeapSize")
+ val jvmMaxMemoryHeapSize: kotlin.Long,
+
+ /* The locale of the JVM executing the build. */
+ @SerialName(value = "jvmLocale")
+ val jvmLocale: kotlin.String,
+
+ /* Operating system username of the build user. `null` if no username is captured. */
+ @SerialName(value = "username")
+ val username: kotlin.String? = null,
+
+ /* The default charset of the JVM executing the build. `null` if capturing is not possible. */
+ @SerialName(value = "jvmCharset")
+ val jvmCharset: kotlin.String? = null,
+
+ /* The hostname of the build machine, as seen on the network. `null` if capturing is not possible. */
+ @SerialName(value = "publicHostname")
+ val publicHostname: kotlin.String? = null,
+
+ /* The hostname of the build machine, as specified by itself. `null` if capturing is not possible. */
+ @SerialName(value = "localHostname")
+ val localHostname: kotlin.String? = null,
+
+ /* The local IP addresses of the build machine. `null` if capturing is not possible. */
+ @SerialName(value = "localIpAddresses")
+ val localIpAddresses: kotlin.collections.List? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildAttributesLink.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildAttributesLink.kt
new file mode 100644
index 0000000..e470c80
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildAttributesLink.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Build Scan link.
+ *
+ * @param label The label of the Build Scan link.
+ * @param url The url of the Build Scan link.
+ */
+@Serializable
+
+data class BuildAttributesLink (
+
+ /* The label of the Build Scan link. */
+ @SerialName(value = "label")
+ val label: kotlin.String,
+
+ /* The url of the Build Scan link. */
+ @SerialName(value = "url")
+ val url: kotlin.String
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildAttributesValue.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildAttributesValue.kt
new file mode 100644
index 0000000..c8d3440
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildAttributesValue.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Build Scan value.
+ *
+ * @param name The name of the Build Scan value.
+ * @param `value` The value of the Build Scan value. `null` if the Build Scan value is not set.
+ */
+@Serializable
+
+data class BuildAttributesValue (
+
+ /* The name of the Build Scan value. */
+ @SerialName(value = "name")
+ val name: kotlin.String,
+
+ /* The value of the Build Scan value. `null` if the Build Scan value is not set. */
+ @SerialName(value = "value")
+ val `value`: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelName.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelName.kt
new file mode 100644
index 0000000..a3e2ef2
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelName.kt
@@ -0,0 +1,86 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Build model names that can be requested when fetching builds.
+ *
+ * Values: GRADLE_MINUS_ATTRIBUTES,GRADLE_MINUS_BUILD_MINUS_CACHE_MINUS_PERFORMANCE,GRADLE_MINUS_PROJECTS,GRADLE_MINUS_NETWORK_MINUS_ACTIVITY,GRADLE_MINUS_ARTIFACT_MINUS_TRANSFORM_MINUS_EXECUTIONS,GRADLE_MINUS_DEPRECATIONS,MAVEN_MINUS_ATTRIBUTES,MAVEN_MINUS_BUILD_MINUS_CACHE_MINUS_PERFORMANCE,MAVEN_MINUS_MODULES,MAVEN_MINUS_DEPENDENCY_MINUS_RESOLUTION
+ */
+@Serializable
+enum class BuildModelName(val value: kotlin.String) {
+
+ @SerialName(value = "gradle-attributes")
+ GRADLE_MINUS_ATTRIBUTES("gradle-attributes"),
+
+ @SerialName(value = "gradle-build-cache-performance")
+ GRADLE_MINUS_BUILD_MINUS_CACHE_MINUS_PERFORMANCE("gradle-build-cache-performance"),
+
+ @SerialName(value = "gradle-projects")
+ GRADLE_MINUS_PROJECTS("gradle-projects"),
+
+ @SerialName(value = "gradle-network-activity")
+ GRADLE_MINUS_NETWORK_MINUS_ACTIVITY("gradle-network-activity"),
+
+ @SerialName(value = "gradle-artifact-transform-executions")
+ GRADLE_MINUS_ARTIFACT_MINUS_TRANSFORM_MINUS_EXECUTIONS("gradle-artifact-transform-executions"),
+
+ @SerialName(value = "gradle-deprecations")
+ GRADLE_MINUS_DEPRECATIONS("gradle-deprecations"),
+
+ @SerialName(value = "maven-attributes")
+ MAVEN_MINUS_ATTRIBUTES("maven-attributes"),
+
+ @SerialName(value = "maven-build-cache-performance")
+ MAVEN_MINUS_BUILD_MINUS_CACHE_MINUS_PERFORMANCE("maven-build-cache-performance"),
+
+ @SerialName(value = "maven-modules")
+ MAVEN_MINUS_MODULES("maven-modules"),
+
+ @SerialName(value = "maven-dependency-resolution")
+ MAVEN_MINUS_DEPENDENCY_MINUS_RESOLUTION("maven-dependency-resolution");
+
+ /**
+ * Override [toString()] to avoid using the enum variable name as the value, and instead use
+ * the actual value defined in the API spec file.
+ *
+ * This solves a problem when the variable name and its value are different, and ensures that
+ * the client sends the correct enum values to the server always.
+ */
+ override fun toString(): kotlin.String = value
+
+ companion object {
+ /**
+ * Converts the provided [data] to a [String] on success, null otherwise.
+ */
+ fun encode(data: kotlin.Any?): kotlin.String? = if (data is BuildModelName) "$data" else null
+
+ /**
+ * Returns a valid [BuildModelName] for [data], null otherwise.
+ */
+ fun decode(data: kotlin.Any?): BuildModelName? = data?.let {
+ val normalizedData = "$it".lowercase()
+ values().firstOrNull { value ->
+ it == value || normalizedData == "$value".lowercase()
+ }
+ }
+ }
+}
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelQuery.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelQuery.kt
new file mode 100644
index 0000000..004c75f
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelQuery.kt
@@ -0,0 +1,36 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param availabilityWaitTimeoutSecs The time in seconds the server should wait for ingestion before returning a wait timeout response.
+ */
+@Serializable
+
+data class BuildModelQuery (
+
+ /* The time in seconds the server should wait for ingestion before returning a wait timeout response. */
+ @SerialName(value = "availabilityWaitTimeoutSecs")
+ val availabilityWaitTimeoutSecs: kotlin.Int? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModels.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModels.kt
new file mode 100644
index 0000000..93ed84e
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModels.kt
@@ -0,0 +1,70 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Optional requested models associated with the build.
+ *
+ * @param gradleAttributes
+ * @param gradleBuildCachePerformance
+ * @param gradleProjects
+ * @param gradleNetworkActivity
+ * @param gradleArtifactTransformExecutions
+ * @param gradleDeprecations
+ * @param mavenAttributes
+ * @param mavenBuildCachePerformance
+ * @param mavenModules
+ * @param mavenDependencyResolution
+ */
+@Serializable
+
+data class BuildModels (
+
+ @SerialName(value = "gradleAttributes")
+ val gradleAttributes: BuildModelsGradleAttributes? = null,
+
+ @SerialName(value = "gradleBuildCachePerformance")
+ val gradleBuildCachePerformance: BuildModelsGradleBuildCachePerformance? = null,
+
+ @SerialName(value = "gradleProjects")
+ val gradleProjects: BuildModelsGradleProjects? = null,
+
+ @SerialName(value = "gradleNetworkActivity")
+ val gradleNetworkActivity: BuildModelsGradleNetworkActivity? = null,
+
+ @SerialName(value = "gradleArtifactTransformExecutions")
+ val gradleArtifactTransformExecutions: BuildModelsGradleArtifactTransformExecutions? = null,
+
+ @SerialName(value = "gradleDeprecations")
+ val gradleDeprecations: BuildModelsGradleDeprecations? = null,
+
+ @SerialName(value = "mavenAttributes")
+ val mavenAttributes: BuildModelsMavenAttributes? = null,
+
+ @SerialName(value = "mavenBuildCachePerformance")
+ val mavenBuildCachePerformance: BuildModelsMavenBuildCachePerformance? = null,
+
+ @SerialName(value = "mavenModules")
+ val mavenModules: BuildModelsMavenModules? = null,
+
+ @SerialName(value = "mavenDependencyResolution")
+ val mavenDependencyResolution: BuildModelsMavenDependencyResolution? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleArtifactTransformExecutions.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleArtifactTransformExecutions.kt
new file mode 100644
index 0000000..cdf5690
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleArtifactTransformExecutions.kt
@@ -0,0 +1,38 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The artifact transform execution list of a Gradle build, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model
+ */
+@Serializable
+
+data class BuildModelsGradleArtifactTransformExecutions (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ @SerialName(value = "model")
+ val model: GradleArtifactTransformExecutions? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleAttributes.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleAttributes.kt
new file mode 100644
index 0000000..f90e209
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleAttributes.kt
@@ -0,0 +1,38 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The attributes of a Gradle build, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model
+ */
+@Serializable
+
+data class BuildModelsGradleAttributes (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ @SerialName(value = "model")
+ val model: GradleAttributes? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleBuildCachePerformance.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleBuildCachePerformance.kt
new file mode 100644
index 0000000..9e1c177
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleBuildCachePerformance.kt
@@ -0,0 +1,38 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The build cache performance of a Gradle build, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model
+ */
+@Serializable
+
+data class BuildModelsGradleBuildCachePerformance (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ @SerialName(value = "model")
+ val model: GradleBuildCachePerformance? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleDeprecations.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleDeprecations.kt
new file mode 100644
index 0000000..3d77674
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleDeprecations.kt
@@ -0,0 +1,38 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The deprecation list of a Gradle build, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model
+ */
+@Serializable
+
+data class BuildModelsGradleDeprecations (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ @SerialName(value = "model")
+ val model: GradleDeprecations? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleNetworkActivity.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleNetworkActivity.kt
new file mode 100644
index 0000000..aa62578
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleNetworkActivity.kt
@@ -0,0 +1,38 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the network activity of the build, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model
+ */
+@Serializable
+
+data class BuildModelsGradleNetworkActivity (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ @SerialName(value = "model")
+ val model: GradleNetworkActivity? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleProjects.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleProjects.kt
new file mode 100644
index 0000000..bfc3834
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsGradleProjects.kt
@@ -0,0 +1,39 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * List of Gradle projects, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model List of Gradle projects including structural relationships.
+ */
+@Serializable
+
+data class BuildModelsGradleProjects (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ /* List of Gradle projects including structural relationships. */
+ @SerialName(value = "model")
+ val model: kotlin.collections.List? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenAttributes.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenAttributes.kt
new file mode 100644
index 0000000..602159d
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenAttributes.kt
@@ -0,0 +1,38 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The attributes of a Maven build, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model
+ */
+@Serializable
+
+data class BuildModelsMavenAttributes (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ @SerialName(value = "model")
+ val model: MavenAttributes? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenBuildCachePerformance.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenBuildCachePerformance.kt
new file mode 100644
index 0000000..d68051a
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenBuildCachePerformance.kt
@@ -0,0 +1,38 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The build cache performance of a Maven build, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model
+ */
+@Serializable
+
+data class BuildModelsMavenBuildCachePerformance (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ @SerialName(value = "model")
+ val model: MavenBuildCachePerformance? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenDependencyResolution.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenDependencyResolution.kt
new file mode 100644
index 0000000..bbbf467
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenDependencyResolution.kt
@@ -0,0 +1,38 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about dependency resolution, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model
+ */
+@Serializable
+
+data class BuildModelsMavenDependencyResolution (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ @SerialName(value = "model")
+ val model: MavenDependencyResolution? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenModules.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenModules.kt
new file mode 100644
index 0000000..c27ce50
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildModelsMavenModules.kt
@@ -0,0 +1,39 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * List of Maven modules, or a report of a problem encountered.
+ *
+ * @param problem
+ * @param model List of Maven modules including structural relationships.
+ */
+@Serializable
+
+data class BuildModelsMavenModules (
+
+ @SerialName(value = "problem")
+ val problem: ApiProblem? = null,
+
+ /* List of Maven modules including structural relationships. */
+ @SerialName(value = "model")
+ val model: kotlin.collections.List? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildQuery.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildQuery.kt
new file mode 100644
index 0000000..c1c7775
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildQuery.kt
@@ -0,0 +1,46 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.Contextual
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param models The list of build models to return in the response for each build. If not provided, no models are returned.
+ * @param allModels Whether to include all build models for the build. If set to `true`, the value of the `models` parameter is ignored.
+ * @param availabilityWaitTimeoutSecs The time in seconds the server should wait for ingestion before returning a wait timeout response.
+ */
+@Serializable
+
+data class BuildQuery (
+
+ /* The list of build models to return in the response for each build. If not provided, no models are returned. */
+ @SerialName(value = "models")
+ val models: kotlin.collections.List<@Contextual BuildModelName>? = null,
+
+ /* Whether to include all build models for the build. If set to `true`, the value of the `models` parameter is ignored. */
+ @SerialName(value = "allModels")
+ val allModels: kotlin.Boolean? = false,
+
+ /* The time in seconds the server should wait for ingestion before returning a wait timeout response. */
+ @SerialName(value = "availabilityWaitTimeoutSecs")
+ val availabilityWaitTimeoutSecs: kotlin.Int? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildScanIdsByOutcome.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildScanIdsByOutcome.kt
new file mode 100644
index 0000000..d6c7fc5
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildScanIdsByOutcome.kt
@@ -0,0 +1,56 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Build Scan IDs for builds that contain tests with outcomes.
+ *
+ * @param passed The BuildIds of 'Passed' outcomes.
+ * @param failed The Build Scan IDs of 'Failed' outcomes.
+ * @param skipped The BuildIds of 'Skipped' outcomes.
+ * @param flaky The BuildIds of 'Flaky' outcomes.
+ * @param notSelected The BuildIds of 'Not Selected' outcomes.
+ */
+@Serializable
+
+data class BuildScanIdsByOutcome (
+
+ /* The BuildIds of 'Passed' outcomes. */
+ @SerialName(value = "passed")
+ val passed: kotlin.collections.List,
+
+ /* The Build Scan IDs of 'Failed' outcomes. */
+ @SerialName(value = "failed")
+ val failed: kotlin.collections.List,
+
+ /* The BuildIds of 'Skipped' outcomes. */
+ @SerialName(value = "skipped")
+ val skipped: kotlin.collections.List,
+
+ /* The BuildIds of 'Flaky' outcomes. */
+ @SerialName(value = "flaky")
+ val flaky: kotlin.collections.List,
+
+ /* The BuildIds of 'Not Selected' outcomes. */
+ @SerialName(value = "notSelected")
+ val notSelected: kotlin.collections.List
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildsQuery.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildsQuery.kt
new file mode 100644
index 0000000..5966b4c
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/BuildsQuery.kt
@@ -0,0 +1,83 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.Contextual
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param since **This parameter is deprecated, use `fromInstant` instead.** A unix-epoch-time in milliseconds allowing to retrieve builds for which Develocity completed receiving and processing the build after this instant. This parameter can only be used with `reverse=false`. Therefore, a value of `0` will process all builds. If not provided, the time in milliseconds when the request is received by the Develocity instance will be used. This parameter has no effect if any of `sinceBuild`, `fromInstant`, `fromBuild` are used.
+ * @param sinceBuild **This parameter is deprecated, use `fromBuild` instead.** A Build Scan ID allowing to retrieve builds for which Develocity completed receiving and processing after the given Build Scan ID (excluding it). This parameter can only be used with `reverse=false`. This parameter has precedence over any value set for the `since` parameter. A valid Build Scan ID must be provided, that is, a Build Scan ID that exists in the Develocity instance. A Build Scan ID for a deleted build is valid. This parameter has no effect if any of `fromInstant`, `fromBuild` are used.
+ * @param fromInstant A unix-epoch-time in milliseconds allowing to retrieve builds for which Develocity completed receiving and processing the build after this instant when used in conjunction with `reverse=false`, or before this instant when used in conjunction with `reverse=true`. Therefore, a value of `0` will process all builds. If not provided, the time in milliseconds when the request is received by the Develocity instance will be used. This parameter has no effect if `fromBuild` is used.
+ * @param fromBuild A Build Scan ID allowing to retrieve builds for which Develocity completed receiving and processing after the given Build Scan ID (excluding it) when used in conjunction with `reverse=false`, or before the given Build Scan ID (excluding it) when used in conjunction with `reverse=true`. This parameter has precedence over any value set for the `since`, `sinceBuild`, `fromInstant` parameters. A valid Build Scan ID must be provided, that is, a Build Scan ID that exists in the Develocity instance. A Build Scan ID for a deleted build is valid.
+ * @param reverse A boolean indicating the time direction of the query. A value of `true` indicates a backward query, and returned builds will be sorted from most to least recent. A value of `false` indicates a forward query, and returned builds will be sorted from least to most recent. This parameter has no effect if any of `since`, `sinceBuild` are used. If not provided, the default value is `false`.
+ * @param maxBuilds The maximum number of builds returned by the query. The query returns when that number is reached or when `maxWaitSecs` is reached. If not provided, the default value is `100`.
+ * @param maxWaitSecs The maximum number of seconds to wait for builds before returning. If this time is reached before `maxBuilds` is reached, the query returns with the already processed builds. Note that this time is respected with best effort. A query will return soon after this time has passed but there is no guarantee that it exactly returns before this time has passed. This parameter has no effect if `reverse=true` is specified, because new builds cannot become available in the past. If not provided, the default value is `3`.
+ * @param query A query for filtering builds, written in the Develocity advanced search query language See: https://gradle.com/help/advanced-search
+ * @param models The list of build models to return in the response for each build. If not provided, no models are returned.
+ * @param allModels Whether to include all build models for each build. If set to `true`, the value of the `models` parameter is ignored.
+ */
+@Serializable
+
+data class BuildsQuery (
+
+ /* **This parameter is deprecated, use `fromInstant` instead.** A unix-epoch-time in milliseconds allowing to retrieve builds for which Develocity completed receiving and processing the build after this instant. This parameter can only be used with `reverse=false`. Therefore, a value of `0` will process all builds. If not provided, the time in milliseconds when the request is received by the Develocity instance will be used. This parameter has no effect if any of `sinceBuild`, `fromInstant`, `fromBuild` are used. */
+ @SerialName(value = "since")
+ @Deprecated(message = "This property is deprecated.")
+ val since: kotlin.Long? = null,
+
+ /* **This parameter is deprecated, use `fromBuild` instead.** A Build Scan ID allowing to retrieve builds for which Develocity completed receiving and processing after the given Build Scan ID (excluding it). This parameter can only be used with `reverse=false`. This parameter has precedence over any value set for the `since` parameter. A valid Build Scan ID must be provided, that is, a Build Scan ID that exists in the Develocity instance. A Build Scan ID for a deleted build is valid. This parameter has no effect if any of `fromInstant`, `fromBuild` are used. */
+ @SerialName(value = "sinceBuild")
+ @Deprecated(message = "This property is deprecated.")
+ val sinceBuild: kotlin.String? = null,
+
+ /* A unix-epoch-time in milliseconds allowing to retrieve builds for which Develocity completed receiving and processing the build after this instant when used in conjunction with `reverse=false`, or before this instant when used in conjunction with `reverse=true`. Therefore, a value of `0` will process all builds. If not provided, the time in milliseconds when the request is received by the Develocity instance will be used. This parameter has no effect if `fromBuild` is used. */
+ @SerialName(value = "fromInstant")
+ val fromInstant: kotlin.Long? = null,
+
+ /* A Build Scan ID allowing to retrieve builds for which Develocity completed receiving and processing after the given Build Scan ID (excluding it) when used in conjunction with `reverse=false`, or before the given Build Scan ID (excluding it) when used in conjunction with `reverse=true`. This parameter has precedence over any value set for the `since`, `sinceBuild`, `fromInstant` parameters. A valid Build Scan ID must be provided, that is, a Build Scan ID that exists in the Develocity instance. A Build Scan ID for a deleted build is valid. */
+ @SerialName(value = "fromBuild")
+ val fromBuild: kotlin.String? = null,
+
+ /* A boolean indicating the time direction of the query. A value of `true` indicates a backward query, and returned builds will be sorted from most to least recent. A value of `false` indicates a forward query, and returned builds will be sorted from least to most recent. This parameter has no effect if any of `since`, `sinceBuild` are used. If not provided, the default value is `false`. */
+ @SerialName(value = "reverse")
+ val reverse: kotlin.Boolean? = null,
+
+ /* The maximum number of builds returned by the query. The query returns when that number is reached or when `maxWaitSecs` is reached. If not provided, the default value is `100`. */
+ @SerialName(value = "maxBuilds")
+ val maxBuilds: kotlin.Int? = null,
+
+ /* The maximum number of seconds to wait for builds before returning. If this time is reached before `maxBuilds` is reached, the query returns with the already processed builds. Note that this time is respected with best effort. A query will return soon after this time has passed but there is no guarantee that it exactly returns before this time has passed. This parameter has no effect if `reverse=true` is specified, because new builds cannot become available in the past. If not provided, the default value is `3`. */
+ @SerialName(value = "maxWaitSecs")
+ val maxWaitSecs: kotlin.Int? = null,
+
+ /* A query for filtering builds, written in the Develocity advanced search query language See: https://gradle.com/help/advanced-search */
+ @SerialName(value = "query")
+ val query: kotlin.String? = null,
+
+ /* The list of build models to return in the response for each build. If not provided, no models are returned. */
+ @SerialName(value = "models")
+ val models: kotlin.collections.List<@Contextual BuildModelName>? = null,
+
+ /* Whether to include all build models for each build. If set to `true`, the value of the `models` parameter is ignored. */
+ @SerialName(value = "allModels")
+ val allModels: kotlin.Boolean? = false
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/DevelocityVersion.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/DevelocityVersion.kt
new file mode 100644
index 0000000..4d29b84
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/DevelocityVersion.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param string The complete version string of format `YEAR.RELEASE.PATCH`, where the patch component is omitted when `0` (e.g. `2022.3`, `2022.3.1`).
+ * @param year The gregorian calendar year of the release.
+ * @param release The sequence number of the release for that year, starting with 1.
+ * @param patch The patch level of the release, starting with 0.
+ */
+@Serializable
+
+data class DevelocityVersion (
+
+ /* The complete version string of format `YEAR.RELEASE.PATCH`, where the patch component is omitted when `0` (e.g. `2022.3`, `2022.3.1`). */
+ @SerialName(value = "string")
+ val string: kotlin.String,
+
+ /* The gregorian calendar year of the release. */
+ @SerialName(value = "year")
+ val year: kotlin.Int,
+
+ /* The sequence number of the release for that year, starting with 1. */
+ @SerialName(value = "release")
+ val release: kotlin.Int,
+
+ /* The patch level of the release, starting with 0. */
+ @SerialName(value = "patch")
+ val patch: kotlin.Int
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleArtifactTransformAttribute.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleArtifactTransformAttribute.kt
new file mode 100644
index 0000000..96bf3d7
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleArtifactTransformAttribute.kt
@@ -0,0 +1,46 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param name The name of the attribute.
+ * @param from The input attribute value.
+ * @param to The requested attributed value.
+ */
+@Serializable
+
+data class GradleArtifactTransformAttribute (
+
+ /* The name of the attribute. */
+ @SerialName(value = "name")
+ val name: kotlin.String,
+
+ /* The input attribute value. */
+ @SerialName(value = "from")
+ val from: kotlin.String,
+
+ /* The requested attributed value. */
+ @SerialName(value = "to")
+ val to: kotlin.String
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleArtifactTransformExecutionEntry.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleArtifactTransformExecutionEntry.kt
new file mode 100644
index 0000000..4805dae
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleArtifactTransformExecutionEntry.kt
@@ -0,0 +1,159 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param artifactTransformExecutionName Artifact transform execution name.
+ * @param transformActionType The fully qualified class name of the artifact transform action.
+ * @param inputArtifactName The name of the input artifact transformed by this transform.
+ * @param changedAttributes The list of changed attributes merged from all transform execution requests.
+ * @param outcome The outcome of this artifact transform execution: * `failed` - Artifact transform execution which failed * `success` - Artifact transform execution which was successfully executed * `from_cache` - Artifact transform execution which was taken from cache * `up_to_date` - Artifact transform execution which was up-to-date * `unknown` - Artifact transform execution whose outcome is unknown * `skipped` - Artifact transform execution which was skipped. **This is not emitted anymore, replaced by `up_to_date`.**
+ * @param avoidanceOutcome The avoidance outcome of this artifact transform execution with respect to performance: * `avoided_up_to_date` - Artifact transform execution whose execution is avoided due to build incrementalism * `avoided_from_local_cache` - Artifact transform execution whose execution is avoided due to reusing a local build cache entry * `avoided_from_remote_cache` - Artifact transform execution whose execution is avoided due to reusing a remote build cache entry * `executed_cacheable` - Artifact transform execution which is executed but is cacheable * `executed_not_cacheable` - Artifact transform execution which is executed but is not cacheable * `executed_unknown_cacheability` - Artifact transform execution which is executed and whose cacheability can not be determined * `avoided_unknown_reason` - Artifact transform execution which was avoided for an unknown reason * `skipped` - Skipped artifact transform execution. **This is not emitted anymore, replaced by `up_to_date`.**
+ * @param duration The artifact transform execution duration in milliseconds.
+ * @param fingerprintingDuration The artifact transform execution fingerprinting duration in milliseconds. This duration is part of the complete artifact transform execution duration. `null` if the artifact transform is not fingerprinted.
+ * @param avoidanceSavings The artifact transform execution avoidance savings in milliseconds, which can be negative. Negative values indicate that it takes more time to reuse outputs than it did to create them originally. `null` if the information is not available.
+ * @param nonCacheabilityCategory The category of the non-cacheability reason: * `build_cache_not_enabled` - Caching is not enabled for the build * `disabled_to_ensure_correctness` - The artifact transform failed validation * `not_cacheable` - Caching is not enabled for this artifact transform * `unknown` - Reason for disabled caching is not known `null` when the artifact transform execution is cacheable
+ * @param nonCacheabilityReason The human-readable reason for a non-cacheable artifact transform execution. `null` when the artifact transform execution is cacheable.
+ * @param cacheArtifactSize The number of bytes of the produced or consumed cache artifact. For an artifact transform execution where the outputs are successfully stored to a local or remote cache, this is the size of the stored cache artifact. For an artifact transform execution execution where the outputs are successfully loaded from a local or remote cache, this is the size of the loaded cache artifact. `null` if the an artifact transform execution is not cacheable, or if the attempt to store or load the artifact from cache does not succeed.
+ * @param cacheArtifactRejectedReason The reason why the cache artifact is rejected: * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept. The value is `null` if the transform execution is not cacheable, or if the attempt to store the artifact does not succeed.
+ * @param skipReasonMessage The detailed reason why the transform execution is skipped. `null` if the transform execution is not skipped.
+ * @param cacheKey The build cache key. `null` if no build cache key was computed.
+ */
+@Serializable
+
+data class GradleArtifactTransformExecutionEntry (
+
+ /* Artifact transform execution name. */
+ @SerialName(value = "artifactTransformExecutionName")
+ val artifactTransformExecutionName: kotlin.String,
+
+ /* The fully qualified class name of the artifact transform action. */
+ @SerialName(value = "transformActionType")
+ val transformActionType: kotlin.String,
+
+ /* The name of the input artifact transformed by this transform. */
+ @SerialName(value = "inputArtifactName")
+ val inputArtifactName: kotlin.String,
+
+ /* The list of changed attributes merged from all transform execution requests. */
+ @SerialName(value = "changedAttributes")
+ val changedAttributes: kotlin.collections.List,
+
+ /* The outcome of this artifact transform execution: * `failed` - Artifact transform execution which failed * `success` - Artifact transform execution which was successfully executed * `from_cache` - Artifact transform execution which was taken from cache * `up_to_date` - Artifact transform execution which was up-to-date * `unknown` - Artifact transform execution whose outcome is unknown * `skipped` - Artifact transform execution which was skipped. **This is not emitted anymore, replaced by `up_to_date`.** */
+ @SerialName(value = "outcome")
+ val outcome: GradleArtifactTransformExecutionEntry.Outcome,
+
+ /* The avoidance outcome of this artifact transform execution with respect to performance: * `avoided_up_to_date` - Artifact transform execution whose execution is avoided due to build incrementalism * `avoided_from_local_cache` - Artifact transform execution whose execution is avoided due to reusing a local build cache entry * `avoided_from_remote_cache` - Artifact transform execution whose execution is avoided due to reusing a remote build cache entry * `executed_cacheable` - Artifact transform execution which is executed but is cacheable * `executed_not_cacheable` - Artifact transform execution which is executed but is not cacheable * `executed_unknown_cacheability` - Artifact transform execution which is executed and whose cacheability can not be determined * `avoided_unknown_reason` - Artifact transform execution which was avoided for an unknown reason * `skipped` - Skipped artifact transform execution. **This is not emitted anymore, replaced by `up_to_date`.** */
+ @SerialName(value = "avoidanceOutcome")
+ val avoidanceOutcome: GradleArtifactTransformExecutionEntry.AvoidanceOutcome,
+
+ /* The artifact transform execution duration in milliseconds. */
+ @SerialName(value = "duration")
+ val duration: kotlin.Long,
+
+ /* The artifact transform execution fingerprinting duration in milliseconds. This duration is part of the complete artifact transform execution duration. `null` if the artifact transform is not fingerprinted. */
+ @SerialName(value = "fingerprintingDuration")
+ val fingerprintingDuration: kotlin.Long? = null,
+
+ /* The artifact transform execution avoidance savings in milliseconds, which can be negative. Negative values indicate that it takes more time to reuse outputs than it did to create them originally. `null` if the information is not available. */
+ @SerialName(value = "avoidanceSavings")
+ val avoidanceSavings: kotlin.Long? = null,
+
+ /* The category of the non-cacheability reason: * `build_cache_not_enabled` - Caching is not enabled for the build * `disabled_to_ensure_correctness` - The artifact transform failed validation * `not_cacheable` - Caching is not enabled for this artifact transform * `unknown` - Reason for disabled caching is not known `null` when the artifact transform execution is cacheable */
+ @SerialName(value = "nonCacheabilityCategory")
+ val nonCacheabilityCategory: GradleArtifactTransformExecutionEntry.NonCacheabilityCategory? = null,
+
+ /* The human-readable reason for a non-cacheable artifact transform execution. `null` when the artifact transform execution is cacheable. */
+ @SerialName(value = "nonCacheabilityReason")
+ val nonCacheabilityReason: kotlin.String? = null,
+
+ /* The number of bytes of the produced or consumed cache artifact. For an artifact transform execution where the outputs are successfully stored to a local or remote cache, this is the size of the stored cache artifact. For an artifact transform execution execution where the outputs are successfully loaded from a local or remote cache, this is the size of the loaded cache artifact. `null` if the an artifact transform execution is not cacheable, or if the attempt to store or load the artifact from cache does not succeed. */
+ @SerialName(value = "cacheArtifactSize")
+ val cacheArtifactSize: kotlin.Long? = null,
+
+ /* The reason why the cache artifact is rejected: * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept. The value is `null` if the transform execution is not cacheable, or if the attempt to store the artifact does not succeed. */
+ @SerialName(value = "cacheArtifactRejectedReason")
+ val cacheArtifactRejectedReason: GradleArtifactTransformExecutionEntry.CacheArtifactRejectedReason? = null,
+
+ /* The detailed reason why the transform execution is skipped. `null` if the transform execution is not skipped. */
+ @SerialName(value = "skipReasonMessage")
+ val skipReasonMessage: kotlin.String? = null,
+
+ /* The build cache key. `null` if no build cache key was computed. */
+ @SerialName(value = "cacheKey")
+ val cacheKey: kotlin.String? = null
+
+) {
+
+ /**
+ * The outcome of this artifact transform execution: * `failed` - Artifact transform execution which failed * `success` - Artifact transform execution which was successfully executed * `from_cache` - Artifact transform execution which was taken from cache * `up_to_date` - Artifact transform execution which was up-to-date * `unknown` - Artifact transform execution whose outcome is unknown * `skipped` - Artifact transform execution which was skipped. **This is not emitted anymore, replaced by `up_to_date`.**
+ *
+ * Values: FAILED,SUCCESS,FROM_CACHE,UP_TO_DATE,UNKNOWN,SKIPPED
+ */
+ @Serializable
+ enum class Outcome(val value: kotlin.String) {
+ @SerialName(value = "failed") FAILED("failed"),
+ @SerialName(value = "success") SUCCESS("success"),
+ @SerialName(value = "from_cache") FROM_CACHE("from_cache"),
+ @SerialName(value = "up_to_date") UP_TO_DATE("up_to_date"),
+ @SerialName(value = "unknown") UNKNOWN("unknown"),
+ @SerialName(value = "skipped") SKIPPED("skipped");
+ }
+ /**
+ * The avoidance outcome of this artifact transform execution with respect to performance: * `avoided_up_to_date` - Artifact transform execution whose execution is avoided due to build incrementalism * `avoided_from_local_cache` - Artifact transform execution whose execution is avoided due to reusing a local build cache entry * `avoided_from_remote_cache` - Artifact transform execution whose execution is avoided due to reusing a remote build cache entry * `executed_cacheable` - Artifact transform execution which is executed but is cacheable * `executed_not_cacheable` - Artifact transform execution which is executed but is not cacheable * `executed_unknown_cacheability` - Artifact transform execution which is executed and whose cacheability can not be determined * `avoided_unknown_reason` - Artifact transform execution which was avoided for an unknown reason * `skipped` - Skipped artifact transform execution. **This is not emitted anymore, replaced by `up_to_date`.**
+ *
+ * Values: AVOIDED_UP_TO_DATE,AVOIDED_FROM_LOCAL_CACHE,AVOIDED_FROM_REMOTE_CACHE,EXECUTED_CACHEABLE,EXECUTED_NOT_CACHEABLE,EXECUTED_UNKNOWN_CACHEABILITY,AVOIDED_UNKNOWN_CACHEBILITY,AVOIDED_UNKNOWN_REASON,SKIPPED
+ */
+ @Serializable
+ enum class AvoidanceOutcome(val value: kotlin.String) {
+ @SerialName(value = "avoided_up_to_date") AVOIDED_UP_TO_DATE("avoided_up_to_date"),
+ @SerialName(value = "avoided_from_local_cache") AVOIDED_FROM_LOCAL_CACHE("avoided_from_local_cache"),
+ @SerialName(value = "avoided_from_remote_cache") AVOIDED_FROM_REMOTE_CACHE("avoided_from_remote_cache"),
+ @SerialName(value = "executed_cacheable") EXECUTED_CACHEABLE("executed_cacheable"),
+ @SerialName(value = "executed_not_cacheable") EXECUTED_NOT_CACHEABLE("executed_not_cacheable"),
+ @SerialName(value = "executed_unknown_cacheability") EXECUTED_UNKNOWN_CACHEABILITY("executed_unknown_cacheability"),
+ @SerialName(value = "avoided_unknown_cachebility") AVOIDED_UNKNOWN_CACHEBILITY("avoided_unknown_cachebility"),
+ @SerialName(value = "avoided_unknown_reason") AVOIDED_UNKNOWN_REASON("avoided_unknown_reason"),
+ @SerialName(value = "skipped") SKIPPED("skipped");
+ }
+ /**
+ * The category of the non-cacheability reason: * `build_cache_not_enabled` - Caching is not enabled for the build * `disabled_to_ensure_correctness` - The artifact transform failed validation * `not_cacheable` - Caching is not enabled for this artifact transform * `unknown` - Reason for disabled caching is not known `null` when the artifact transform execution is cacheable
+ *
+ * Values: BUILD_CACHE_NOT_ENABLED,DISABLED_TO_ENSURE_CORRECTNESS,NOT_CACHEABLE,UNKNOWN
+ */
+ @Serializable
+ enum class NonCacheabilityCategory(val value: kotlin.String) {
+ @SerialName(value = "build_cache_not_enabled") BUILD_CACHE_NOT_ENABLED("build_cache_not_enabled"),
+ @SerialName(value = "disabled_to_ensure_correctness") DISABLED_TO_ENSURE_CORRECTNESS("disabled_to_ensure_correctness"),
+ @SerialName(value = "not_cacheable") NOT_CACHEABLE("not_cacheable"),
+ @SerialName(value = "unknown") UNKNOWN("unknown");
+ }
+ /**
+ * The reason why the cache artifact is rejected: * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept. The value is `null` if the transform execution is not cacheable, or if the attempt to store the artifact does not succeed.
+ *
+ * Values: ARTIFACT_SIZE_TOO_LARGE
+ */
+ @Serializable
+ enum class CacheArtifactRejectedReason(val value: kotlin.String) {
+ @SerialName(value = "artifact_size_too_large") ARTIFACT_SIZE_TOO_LARGE("artifact_size_too_large");
+ }
+}
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleArtifactTransformExecutions.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleArtifactTransformExecutions.kt
new file mode 100644
index 0000000..e332db1
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleArtifactTransformExecutions.kt
@@ -0,0 +1,35 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param artifactTransformExecutions A list of executed artifact transforms with performance related information. `null` if artifact transform execution capturing is not supported.
+ */
+@Serializable
+
+data class GradleArtifactTransformExecutions (
+
+ /* A list of executed artifact transforms with performance related information. `null` if artifact transform execution capturing is not supported. */
+ @SerialName(value = "artifactTransformExecutions")
+ val artifactTransformExecutions: kotlin.collections.List? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleAttributes.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleAttributes.kt
new file mode 100644
index 0000000..65eca68
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleAttributes.kt
@@ -0,0 +1,112 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport", "DEPRECATION"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The attributes of a Gradle build.
+ *
+ * @param id The Build Scan ID.
+ * @param buildStartTime The time when the build starts, as milliseconds since Epoch.
+ * @param buildDuration The duration of the build, as milliseconds since Epoch.
+ * @param gradleVersion The Gradle version used.
+ * @param pluginVersion The Develocity Gradle plugin version used.
+ * @param requestedTasks The list of requested tasks.
+ * @param hasFailed True when the build fails, false otherwise.
+ * @param tags The list of Build Scan tags.
+ * @param propertyValues The list of Build Scan values.
+ * @param links The list of Build Scan links.
+ * @param gradleEnterpriseSettings
+ * @param develocitySettings
+ * @param buildOptions
+ * @param environment
+ * @param rootProjectName The root project name. `null` in case of very early build failure.
+ * @param hasVerificationFailure Set only if the build fails: true when the build has at least one failure classified as \"Verification\", false otherwise. The Verification classification is meant for failures that are expected within a standard application development lifecycle. They typically represent a problem with the developer’s inputs to the build such as the source code.
+ * @param hasNonVerificationFailure Set only if the build failed: true when the build has at least one failure classified as \"Non-verification\", false otherwise. The Non-verification classification is meant for failures that are typically not expected within a standard application development lifecycle, such as build configuration failures, dependency resolution failures, and infrastructure failures.
+ */
+@Serializable
+
+data class GradleAttributes (
+
+ /* The Build Scan ID. */
+ @SerialName(value = "id")
+ val id: kotlin.String,
+
+ /* The time when the build starts, as milliseconds since Epoch. */
+ @SerialName(value = "buildStartTime")
+ val buildStartTime: kotlin.Long,
+
+ /* The duration of the build, as milliseconds since Epoch. */
+ @SerialName(value = "buildDuration")
+ val buildDuration: kotlin.Long,
+
+ /* The Gradle version used. */
+ @SerialName(value = "gradleVersion")
+ val gradleVersion: kotlin.String,
+
+ /* The Develocity Gradle plugin version used. */
+ @SerialName(value = "pluginVersion")
+ val pluginVersion: kotlin.String,
+
+ /* The list of requested tasks. */
+ @SerialName(value = "requestedTasks")
+ val requestedTasks: kotlin.collections.List,
+
+ /* True when the build fails, false otherwise. */
+ @SerialName(value = "hasFailed")
+ val hasFailed: kotlin.Boolean,
+
+ /* The list of Build Scan tags. */
+ @SerialName(value = "tags")
+ val tags: kotlin.collections.List,
+
+ /* The list of Build Scan values. */
+ @SerialName(value = "values")
+ val propertyValues: kotlin.collections.List,
+
+ /* The list of Build Scan links. */
+ @SerialName(value = "links")
+ val links: kotlin.collections.List,
+
+ @SerialName(value = "gradleEnterpriseSettings")
+ @Deprecated(message = "This property is deprecated.")
+ val gradleEnterpriseSettings: GradleGradleEnterpriseSettings,
+
+ @SerialName(value = "develocitySettings")
+ val develocitySettings: GradleDevelocitySettings,
+
+ @SerialName(value = "buildOptions")
+ val buildOptions: GradleBuildOptions,
+
+ @SerialName(value = "environment")
+ val environment: BuildAttributesEnvironment,
+
+ /* The root project name. `null` in case of very early build failure. */
+ @SerialName(value = "rootProjectName")
+ val rootProjectName: kotlin.String? = null,
+
+ /* Set only if the build fails: true when the build has at least one failure classified as \"Verification\", false otherwise. The Verification classification is meant for failures that are expected within a standard application development lifecycle. They typically represent a problem with the developer’s inputs to the build such as the source code. */
+ @SerialName(value = "hasVerificationFailure")
+ val hasVerificationFailure: kotlin.Boolean? = null,
+
+ /* Set only if the build failed: true when the build has at least one failure classified as \"Non-verification\", false otherwise. The Non-verification classification is meant for failures that are typically not expected within a standard application development lifecycle, such as build configuration failures, dependency resolution failures, and infrastructure failures. */
+ @SerialName(value = "hasNonVerificationFailure")
+ val hasNonVerificationFailure: kotlin.Boolean? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformance.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformance.kt
new file mode 100644
index 0000000..5e1697c
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformance.kt
@@ -0,0 +1,95 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport", "DEPRECATION"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The build cache performance of a Gradle build.
+ *
+ * @param id The Build Scan ID.
+ * @param buildTime Wall clock duration of the build in milliseconds.
+ * @param effectiveTaskExecutionTime Wall clock time spent executing tasks in milliseconds. It is the time spent between the start of the first task in the execution phase and the end of the last task of the execution phase, removing any interval where no task is being executed.
+ * @param effectiveWorkUnitExecutionTime Wall clock time spent executing work units (tasks and artifact transforms) in milliseconds. It is the time spent between the start of the first work unit in the execution phase and the end of the last work unit of the execution phase, removing any interval where no work unit is being executed.
+ * @param serialTaskExecutionTime Wall clock time of all task executions in milliseconds. It is the sum of all individual task durations.
+ * @param serialWorkUnitExecutionTime Wall clock time of all work unit executions (tasks and artifact transforms) in milliseconds. It is the sum of all individual work unit durations.
+ * @param serializationFactor The ratio of `serialWorkUnitExecutionTime` over the `effectiveWorkUnitExecutionTime`. Quantifies the effect of work unit parallelization. A value equal to `1` means that no parallelization occurred. A value greater than `1` means that work units are executed faster due to parallelization.
+ * @param taskExecution A list of executed tasks with performance related information.
+ * @param avoidanceSavingsSummary
+ * @param taskAvoidanceSavingsSummary
+ * @param workUnitAvoidanceSavingsSummary
+ * @param taskFingerprintingSummary
+ * @param workUnitFingerprintingSummary
+ * @param buildCaches
+ */
+@Serializable
+
+data class GradleBuildCachePerformance (
+
+ /* The Build Scan ID. */
+ @SerialName(value = "id")
+ val id: kotlin.String,
+
+ /* Wall clock duration of the build in milliseconds. */
+ @SerialName(value = "buildTime")
+ val buildTime: kotlin.Long,
+
+ /* Wall clock time spent executing tasks in milliseconds. It is the time spent between the start of the first task in the execution phase and the end of the last task of the execution phase, removing any interval where no task is being executed. */
+ @SerialName(value = "effectiveTaskExecutionTime")
+ val effectiveTaskExecutionTime: kotlin.Long,
+
+ /* Wall clock time spent executing work units (tasks and artifact transforms) in milliseconds. It is the time spent between the start of the first work unit in the execution phase and the end of the last work unit of the execution phase, removing any interval where no work unit is being executed. */
+ @SerialName(value = "effectiveWorkUnitExecutionTime")
+ val effectiveWorkUnitExecutionTime: kotlin.Long,
+
+ /* Wall clock time of all task executions in milliseconds. It is the sum of all individual task durations. */
+ @SerialName(value = "serialTaskExecutionTime")
+ val serialTaskExecutionTime: kotlin.Long,
+
+ /* Wall clock time of all work unit executions (tasks and artifact transforms) in milliseconds. It is the sum of all individual work unit durations. */
+ @SerialName(value = "serialWorkUnitExecutionTime")
+ val serialWorkUnitExecutionTime: kotlin.Long,
+
+ /* The ratio of `serialWorkUnitExecutionTime` over the `effectiveWorkUnitExecutionTime`. Quantifies the effect of work unit parallelization. A value equal to `1` means that no parallelization occurred. A value greater than `1` means that work units are executed faster due to parallelization. */
+ @SerialName(value = "serializationFactor")
+ val serializationFactor: kotlin.Double,
+
+ /* A list of executed tasks with performance related information. */
+ @SerialName(value = "taskExecution")
+ val taskExecution: kotlin.collections.List,
+
+ @SerialName(value = "avoidanceSavingsSummary")
+ @Deprecated(message = "This property is deprecated.")
+ val avoidanceSavingsSummary: GradleBuildCachePerformanceAvoidanceSavingsSummary,
+
+ @SerialName(value = "taskAvoidanceSavingsSummary")
+ val taskAvoidanceSavingsSummary: GradleBuildCachePerformanceTaskAvoidanceSavingsSummary,
+
+ @SerialName(value = "workUnitAvoidanceSavingsSummary")
+ val workUnitAvoidanceSavingsSummary: GradleBuildCachePerformanceWorkUnitAvoidanceSavingsSummary,
+
+ @SerialName(value = "taskFingerprintingSummary")
+ val taskFingerprintingSummary: GradleBuildCachePerformanceTaskFingerprintingSummary? = null,
+
+ @SerialName(value = "workUnitFingerprintingSummary")
+ val workUnitFingerprintingSummary: GradleBuildCachePerformanceWorkUnitFingerprintingSummary? = null,
+
+ @SerialName(value = "buildCaches")
+ val buildCaches: GradleBuildCachePerformanceBuildCaches? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceAvoidanceSavingsSummary.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceAvoidanceSavingsSummary.kt
new file mode 100644
index 0000000..a89f60b
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceAvoidanceSavingsSummary.kt
@@ -0,0 +1,57 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * **This is deprecated, use `GradleBuildCachePerformanceTaskAvoidanceSavingsSummary` instead.** A breakdown of avoidance savings.
+ *
+ * @param total The estimated reduction in serial execution time of the tasks due to their outputs being reused in milliseconds.
+ * @param ratio The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build.
+ * @param upToDate The estimated reduction in serial execution time of the tasks due to build incrementalism in milliseconds.
+ * @param localBuildCache The estimated reduction in serial execution time of the tasks due to their outputs being reused from the local build cache in milliseconds.
+ * @param remoteBuildCache The estimated reduction in serial execution time of the tasks due to their outputs being reused from the remote build cache in milliseconds.
+ */
+@Serializable
+@Deprecated(message = "This schema is deprecated.")
+
+data class GradleBuildCachePerformanceAvoidanceSavingsSummary (
+
+ /* The estimated reduction in serial execution time of the tasks due to their outputs being reused in milliseconds. */
+ @SerialName(value = "total")
+ val total: kotlin.Long,
+
+ /* The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build. */
+ @SerialName(value = "ratio")
+ val ratio: kotlin.Double,
+
+ /* The estimated reduction in serial execution time of the tasks due to build incrementalism in milliseconds. */
+ @SerialName(value = "upToDate")
+ val upToDate: kotlin.Long,
+
+ /* The estimated reduction in serial execution time of the tasks due to their outputs being reused from the local build cache in milliseconds. */
+ @SerialName(value = "localBuildCache")
+ val localBuildCache: kotlin.Long,
+
+ /* The estimated reduction in serial execution time of the tasks due to their outputs being reused from the remote build cache in milliseconds. */
+ @SerialName(value = "remoteBuildCache")
+ val remoteBuildCache: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCacheLocalInfo.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCacheLocalInfo.kt
new file mode 100644
index 0000000..7afd5ac
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCacheLocalInfo.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the local build cache used in the build.
+ *
+ * @param isEnabled Indicates whether the local build cache is enabled.
+ * @param isPushEnabled Indicates whether pushing to the local build cache is enabled. `null` if the local build cache is disabled.
+ * @param isDisabledDueToError Indicates whether the local cache is disabled due to an error occurring in loading or storing local build cache entries. `null` if the local build cache is disabled.
+ * @param directory Location of the local build cache. Can be relative or absolute depending on its value. `null` if the local build cache is disabled.
+ */
+@Serializable
+
+data class GradleBuildCachePerformanceBuildCacheLocalInfo (
+
+ /* Indicates whether the local build cache is enabled. */
+ @SerialName(value = "isEnabled")
+ val isEnabled: kotlin.Boolean,
+
+ /* Indicates whether pushing to the local build cache is enabled. `null` if the local build cache is disabled. */
+ @SerialName(value = "isPushEnabled")
+ val isPushEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the local cache is disabled due to an error occurring in loading or storing local build cache entries. `null` if the local build cache is disabled. */
+ @SerialName(value = "isDisabledDueToError")
+ val isDisabledDueToError: kotlin.Boolean? = null,
+
+ /* Location of the local build cache. Can be relative or absolute depending on its value. `null` if the local build cache is disabled. */
+ @SerialName(value = "directory")
+ val directory: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCacheOverhead.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCacheOverhead.kt
new file mode 100644
index 0000000..6fd10f3
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCacheOverhead.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the build cache overhead in this build.
+ *
+ * @param uploading Overhead of upload operations in milliseconds.
+ * @param downloading Overhead of download operations in milliseconds.
+ * @param packing Overhead of pack operations in milliseconds.
+ * @param unpacking Overhead of unpack operations in milliseconds.
+ */
+@Serializable
+
+data class GradleBuildCachePerformanceBuildCacheOverhead (
+
+ /* Overhead of upload operations in milliseconds. */
+ @SerialName(value = "uploading")
+ val uploading: kotlin.Long,
+
+ /* Overhead of download operations in milliseconds. */
+ @SerialName(value = "downloading")
+ val downloading: kotlin.Long,
+
+ /* Overhead of pack operations in milliseconds. */
+ @SerialName(value = "packing")
+ val packing: kotlin.Long,
+
+ /* Overhead of unpack operations in milliseconds. */
+ @SerialName(value = "unpacking")
+ val unpacking: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCacheRemoteInfo.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCacheRemoteInfo.kt
new file mode 100644
index 0000000..acb760d
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCacheRemoteInfo.kt
@@ -0,0 +1,61 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the remote build cache used in the build.
+ *
+ * @param isEnabled Indicates whether the remote build cache is enabled.
+ * @param type The type of the connector used to communicate with the remote build cache. `null` if the remote build cache is disabled.
+ * @param className The class name of the connector. `null` if the remote build cache is disabled.
+ * @param isPushEnabled Indicates whether pushing to the remote build cache is enabled. `null` if the remote build cache is disabled.
+ * @param isDisabledDueToError Indicates whether the remote build cache is disabled during the build due to an error occurring in loading or storing remote build cache entries. `null` if the remote build cache is disabled.
+ * @param url URL of the remote build cache. `null` if the remote build cache is disabled or if the given type is not supported or it doesn't have the concept of a URL.
+ */
+@Serializable
+
+data class GradleBuildCachePerformanceBuildCacheRemoteInfo (
+
+ /* Indicates whether the remote build cache is enabled. */
+ @SerialName(value = "isEnabled")
+ val isEnabled: kotlin.Boolean,
+
+ /* The type of the connector used to communicate with the remote build cache. `null` if the remote build cache is disabled. */
+ @SerialName(value = "type")
+ val type: kotlin.String? = null,
+
+ /* The class name of the connector. `null` if the remote build cache is disabled. */
+ @SerialName(value = "className")
+ val className: kotlin.String? = null,
+
+ /* Indicates whether pushing to the remote build cache is enabled. `null` if the remote build cache is disabled. */
+ @SerialName(value = "isPushEnabled")
+ val isPushEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the remote build cache is disabled during the build due to an error occurring in loading or storing remote build cache entries. `null` if the remote build cache is disabled. */
+ @SerialName(value = "isDisabledDueToError")
+ val isDisabledDueToError: kotlin.Boolean? = null,
+
+ /* URL of the remote build cache. `null` if the remote build cache is disabled or if the given type is not supported or it doesn't have the concept of a URL. */
+ @SerialName(value = "url")
+ val url: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCaches.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCaches.kt
new file mode 100644
index 0000000..c4c5c75
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceBuildCaches.kt
@@ -0,0 +1,42 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the local and remote build caches used in the build. `null` if the build cache is globally disabled.
+ *
+ * @param local
+ * @param remote
+ * @param overhead
+ */
+@Serializable
+
+data class GradleBuildCachePerformanceBuildCaches (
+
+ @SerialName(value = "local")
+ val local: GradleBuildCachePerformanceBuildCacheLocalInfo,
+
+ @SerialName(value = "remote")
+ val remote: GradleBuildCachePerformanceBuildCacheRemoteInfo,
+
+ @SerialName(value = "overhead")
+ val overhead: GradleBuildCachePerformanceBuildCacheOverhead
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceTaskAvoidanceSavingsSummary.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceTaskAvoidanceSavingsSummary.kt
new file mode 100644
index 0000000..23a233d
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceTaskAvoidanceSavingsSummary.kt
@@ -0,0 +1,56 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A breakdown of avoidance savings for tasks.
+ *
+ * @param total The estimated reduction in serial execution time of the tasks due to their outputs being reused in milliseconds.
+ * @param ratio The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build.
+ * @param upToDate The estimated reduction in serial execution time of the tasks due to build incrementalism in milliseconds.
+ * @param localBuildCache The estimated reduction in serial execution time of the tasks due to their outputs being reused from the local build cache in milliseconds.
+ * @param remoteBuildCache The estimated reduction in serial execution time of the tasks due to their outputs being reused from the remote build cache in milliseconds.
+ */
+@Serializable
+
+data class GradleBuildCachePerformanceTaskAvoidanceSavingsSummary (
+
+ /* The estimated reduction in serial execution time of the tasks due to their outputs being reused in milliseconds. */
+ @SerialName(value = "total")
+ val total: kotlin.Long,
+
+ /* The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build. */
+ @SerialName(value = "ratio")
+ val ratio: kotlin.Double,
+
+ /* The estimated reduction in serial execution time of the tasks due to build incrementalism in milliseconds. */
+ @SerialName(value = "upToDate")
+ val upToDate: kotlin.Long,
+
+ /* The estimated reduction in serial execution time of the tasks due to their outputs being reused from the local build cache in milliseconds. */
+ @SerialName(value = "localBuildCache")
+ val localBuildCache: kotlin.Long,
+
+ /* The estimated reduction in serial execution time of the tasks due to their outputs being reused from the remote build cache in milliseconds. */
+ @SerialName(value = "remoteBuildCache")
+ val remoteBuildCache: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceTaskExecutionEntry.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceTaskExecutionEntry.kt
new file mode 100644
index 0000000..b67d570
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceTaskExecutionEntry.kt
@@ -0,0 +1,142 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param taskPath The full task path.
+ * @param taskType The fully qualified class name of the task.
+ * @param avoidanceOutcome The avoidance outcome of this task with respect to performance: * `avoided_up_to_date` - Task whose execution is avoided due to build incrementalism * `avoided_from_local_cache` - Task whose execution is avoided due to reusing a local build cache entry * `avoided_from_remote_cache` - Task whose execution is avoided due to reusing a remote build cache entry * `executed_cacheable` - Task which is executed but is cacheable * `executed_not_cacheable` - Task which is executed but is not cacheable * `executed_unknown_cacheability` - Task which is executed and whose cacheability can not be determined * `avoided_unknown_reason` - Task which was avoided for an unknown reason * `lifecycle` - Lifecycle task * `no-source` - No-source task * `skipped` - Skipped task
+ * @param duration The task duration in milliseconds.
+ * @param fingerprintingDuration The task fingerprinting duration in milliseconds. This duration is part of the complete task execution duration. `null` if the task is not fingerprinted, or the information is not available.
+ * @param avoidanceSavings The task avoidance savings in milliseconds, which can be negative. Negative values indicate that it takes more time to reuse outputs than it did to create them originally. `null` if the information is not available.
+ * @param nonCacheabilityCategory The category of the non-cacheability reason: * `build_cache_not_enabled` - Caching is not enabled for the build * `cache-if_condition_not_matched` - Caching is disabled for the task via `org.gradle.api.tasks.TaskOutputs#cacheIf` * `disabled_to_ensure_correctness` - The task failed validation. Available since Gradle 7.0 * `do-not-cache-if_condition_matched` - Caching is disabled for the task via `org.gradle.api.tasks.TaskOutputs#doNotCacheIf` * `multiple_outputs_declared` - The task declares multiple outputs * `no_outputs_declared` - The task has no outputs declared * `non_cacheable_inputs` - One of the task inputs is not cacheable, either because some type used as an input to the task is loaded via a custom classloader, or a Java lambda is used as an input. Available since Gradle 5.0 and before Gradle 7.5 * `non_cacheable_task_action` - One of the task actions is not cacheable, either because it is loaded via a custom classloader, or a Java lambda is used to implement it. Available since Gradle 5.0 and before Gradle 7.5 * `non_cacheable_task_implementation` - The task implementation is not cacheable, either because it is loaded via a custom classloader, or a Java lambda is used to implement it. Available since Gradle 5.0 and before Gradle 7.5 * `non_cacheable_tree_output` - The task has a `org.gradle.api.file.FileTree` or a `org.gradle.api.internal.file.collections.DirectoryFileTree` as an output. Available since Gradle 5.0 * `overlapping_outputs` - The tasks outputs overlaps with another task. As Gradle cannot safely determine which task each output file belongs to, it disables caching * `task_has_no_actions` - The task does not declare any actions * `task_output_caching_not_enabled` - Caching is not enabled for the task * `unknown` - Reason for disabled caching is not known `null` when the task is cacheable or if the information is not available.
+ * @param nonCacheabilityReason The human-readable reason for a non-cacheable task. `null` when the task is cacheable or if the information is not available.
+ * @param skipReasonMessage The detailed reason why the task is skipped. `null` if the task is not skipped or Gradle versions <7.6 are used.
+ * @param cacheArtifactSize The number of bytes of the produced or consumed cache artifact. For a task execution where the outputs are successfully stored to a local or remote cache, this is the size of the stored cache artifact. For a task execution where the outputs are successfully loaded from a local or remote cache, this is the size of the loaded cache artifact. `null` if the task is not cacheable, or if the attempt to store or load the artifact from cache does not succeed.
+ * @param cacheArtifactRejectedReason The reason why the cache artifact is rejected: * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept. The value is `null` if the task is not cacheable, or if the attempt to store the artifact does not succeed.
+ * @param cacheKey The build cache key. `null` if no build cache key was computed (e.g. when the task is skipped).
+ */
+@Serializable
+
+data class GradleBuildCachePerformanceTaskExecutionEntry (
+
+ /* The full task path. */
+ @SerialName(value = "taskPath")
+ val taskPath: kotlin.String,
+
+ /* The fully qualified class name of the task. */
+ @SerialName(value = "taskType")
+ val taskType: kotlin.String,
+
+ /* The avoidance outcome of this task with respect to performance: * `avoided_up_to_date` - Task whose execution is avoided due to build incrementalism * `avoided_from_local_cache` - Task whose execution is avoided due to reusing a local build cache entry * `avoided_from_remote_cache` - Task whose execution is avoided due to reusing a remote build cache entry * `executed_cacheable` - Task which is executed but is cacheable * `executed_not_cacheable` - Task which is executed but is not cacheable * `executed_unknown_cacheability` - Task which is executed and whose cacheability can not be determined * `avoided_unknown_reason` - Task which was avoided for an unknown reason * `lifecycle` - Lifecycle task * `no-source` - No-source task * `skipped` - Skipped task */
+ @SerialName(value = "avoidanceOutcome")
+ val avoidanceOutcome: GradleBuildCachePerformanceTaskExecutionEntry.AvoidanceOutcome,
+
+ /* The task duration in milliseconds. */
+ @SerialName(value = "duration")
+ val duration: kotlin.Long,
+
+ /* The task fingerprinting duration in milliseconds. This duration is part of the complete task execution duration. `null` if the task is not fingerprinted, or the information is not available. */
+ @SerialName(value = "fingerprintingDuration")
+ val fingerprintingDuration: kotlin.Long? = null,
+
+ /* The task avoidance savings in milliseconds, which can be negative. Negative values indicate that it takes more time to reuse outputs than it did to create them originally. `null` if the information is not available. */
+ @SerialName(value = "avoidanceSavings")
+ val avoidanceSavings: kotlin.Long? = null,
+
+ /* The category of the non-cacheability reason: * `build_cache_not_enabled` - Caching is not enabled for the build * `cache-if_condition_not_matched` - Caching is disabled for the task via `org.gradle.api.tasks.TaskOutputs#cacheIf` * `disabled_to_ensure_correctness` - The task failed validation. Available since Gradle 7.0 * `do-not-cache-if_condition_matched` - Caching is disabled for the task via `org.gradle.api.tasks.TaskOutputs#doNotCacheIf` * `multiple_outputs_declared` - The task declares multiple outputs * `no_outputs_declared` - The task has no outputs declared * `non_cacheable_inputs` - One of the task inputs is not cacheable, either because some type used as an input to the task is loaded via a custom classloader, or a Java lambda is used as an input. Available since Gradle 5.0 and before Gradle 7.5 * `non_cacheable_task_action` - One of the task actions is not cacheable, either because it is loaded via a custom classloader, or a Java lambda is used to implement it. Available since Gradle 5.0 and before Gradle 7.5 * `non_cacheable_task_implementation` - The task implementation is not cacheable, either because it is loaded via a custom classloader, or a Java lambda is used to implement it. Available since Gradle 5.0 and before Gradle 7.5 * `non_cacheable_tree_output` - The task has a `org.gradle.api.file.FileTree` or a `org.gradle.api.internal.file.collections.DirectoryFileTree` as an output. Available since Gradle 5.0 * `overlapping_outputs` - The tasks outputs overlaps with another task. As Gradle cannot safely determine which task each output file belongs to, it disables caching * `task_has_no_actions` - The task does not declare any actions * `task_output_caching_not_enabled` - Caching is not enabled for the task * `unknown` - Reason for disabled caching is not known `null` when the task is cacheable or if the information is not available. */
+ @SerialName(value = "nonCacheabilityCategory")
+ val nonCacheabilityCategory: GradleBuildCachePerformanceTaskExecutionEntry.NonCacheabilityCategory? = null,
+
+ /* The human-readable reason for a non-cacheable task. `null` when the task is cacheable or if the information is not available. */
+ @SerialName(value = "nonCacheabilityReason")
+ val nonCacheabilityReason: kotlin.String? = null,
+
+ /* The detailed reason why the task is skipped. `null` if the task is not skipped or Gradle versions <7.6 are used. */
+ @SerialName(value = "skipReasonMessage")
+ val skipReasonMessage: kotlin.String? = null,
+
+ /* The number of bytes of the produced or consumed cache artifact. For a task execution where the outputs are successfully stored to a local or remote cache, this is the size of the stored cache artifact. For a task execution where the outputs are successfully loaded from a local or remote cache, this is the size of the loaded cache artifact. `null` if the task is not cacheable, or if the attempt to store or load the artifact from cache does not succeed. */
+ @SerialName(value = "cacheArtifactSize")
+ val cacheArtifactSize: kotlin.Long? = null,
+
+ /* The reason why the cache artifact is rejected: * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept. The value is `null` if the task is not cacheable, or if the attempt to store the artifact does not succeed. */
+ @SerialName(value = "cacheArtifactRejectedReason")
+ val cacheArtifactRejectedReason: GradleBuildCachePerformanceTaskExecutionEntry.CacheArtifactRejectedReason? = null,
+
+ /* The build cache key. `null` if no build cache key was computed (e.g. when the task is skipped). */
+ @SerialName(value = "cacheKey")
+ val cacheKey: kotlin.String? = null
+
+) {
+
+ /**
+ * The avoidance outcome of this task with respect to performance: * `avoided_up_to_date` - Task whose execution is avoided due to build incrementalism * `avoided_from_local_cache` - Task whose execution is avoided due to reusing a local build cache entry * `avoided_from_remote_cache` - Task whose execution is avoided due to reusing a remote build cache entry * `executed_cacheable` - Task which is executed but is cacheable * `executed_not_cacheable` - Task which is executed but is not cacheable * `executed_unknown_cacheability` - Task which is executed and whose cacheability can not be determined * `avoided_unknown_reason` - Task which was avoided for an unknown reason * `lifecycle` - Lifecycle task * `no-source` - No-source task * `skipped` - Skipped task
+ *
+ * Values: AVOIDED_UP_TO_DATE,AVOIDED_FROM_LOCAL_CACHE,AVOIDED_FROM_REMOTE_CACHE,EXECUTED_CACHEABLE,EXECUTED_NOT_CACHEABLE,EXECUTED_UNKNOWN_CACHEABILITY,AVOIDED_UNKNOWN_REASON,LIFECYCLE,NO_MINUS_SOURCE,SKIPPED
+ */
+ @Serializable
+ enum class AvoidanceOutcome(val value: kotlin.String) {
+ @SerialName(value = "avoided_up_to_date") AVOIDED_UP_TO_DATE("avoided_up_to_date"),
+ @SerialName(value = "avoided_from_local_cache") AVOIDED_FROM_LOCAL_CACHE("avoided_from_local_cache"),
+ @SerialName(value = "avoided_from_remote_cache") AVOIDED_FROM_REMOTE_CACHE("avoided_from_remote_cache"),
+ @SerialName(value = "executed_cacheable") EXECUTED_CACHEABLE("executed_cacheable"),
+ @SerialName(value = "executed_not_cacheable") EXECUTED_NOT_CACHEABLE("executed_not_cacheable"),
+ @SerialName(value = "executed_unknown_cacheability") EXECUTED_UNKNOWN_CACHEABILITY("executed_unknown_cacheability"),
+ @SerialName(value = "avoided_unknown_reason") AVOIDED_UNKNOWN_REASON("avoided_unknown_reason"),
+ @SerialName(value = "lifecycle") LIFECYCLE("lifecycle"),
+ @SerialName(value = "no-source") NO_MINUS_SOURCE("no-source"),
+ @SerialName(value = "skipped") SKIPPED("skipped");
+ }
+ /**
+ * The category of the non-cacheability reason: * `build_cache_not_enabled` - Caching is not enabled for the build * `cache-if_condition_not_matched` - Caching is disabled for the task via `org.gradle.api.tasks.TaskOutputs#cacheIf` * `disabled_to_ensure_correctness` - The task failed validation. Available since Gradle 7.0 * `do-not-cache-if_condition_matched` - Caching is disabled for the task via `org.gradle.api.tasks.TaskOutputs#doNotCacheIf` * `multiple_outputs_declared` - The task declares multiple outputs * `no_outputs_declared` - The task has no outputs declared * `non_cacheable_inputs` - One of the task inputs is not cacheable, either because some type used as an input to the task is loaded via a custom classloader, or a Java lambda is used as an input. Available since Gradle 5.0 and before Gradle 7.5 * `non_cacheable_task_action` - One of the task actions is not cacheable, either because it is loaded via a custom classloader, or a Java lambda is used to implement it. Available since Gradle 5.0 and before Gradle 7.5 * `non_cacheable_task_implementation` - The task implementation is not cacheable, either because it is loaded via a custom classloader, or a Java lambda is used to implement it. Available since Gradle 5.0 and before Gradle 7.5 * `non_cacheable_tree_output` - The task has a `org.gradle.api.file.FileTree` or a `org.gradle.api.internal.file.collections.DirectoryFileTree` as an output. Available since Gradle 5.0 * `overlapping_outputs` - The tasks outputs overlaps with another task. As Gradle cannot safely determine which task each output file belongs to, it disables caching * `task_has_no_actions` - The task does not declare any actions * `task_output_caching_not_enabled` - Caching is not enabled for the task * `unknown` - Reason for disabled caching is not known `null` when the task is cacheable or if the information is not available.
+ *
+ * Values: BUILD_CACHE_NOT_ENABLED,CACHE_MINUS_IF_CONDITION_NOT_MATCHED,DISABLED_TO_ENSURE_CORRECTNESS,DO_MINUS_NOT_MINUS_CACHE_MINUS_IF_CONDITION_MATCHED,MULTIPLE_OUTPUTS_DECLARED,NO_OUTPUTS_DECLARED,NON_CACHEABLE_INPUTS,NON_CACHEABLE_TASK_ACTION,NON_CACHEABLE_TASK_IMPLEMENTATION,NON_CACHEABLE_TREE_OUTPUT,OVERLAPPING_OUTPUTS,TASK_HAS_NO_ACTIONS,TASK_OUTPUT_CACHING_NOT_ENABLED,UNKNOWN
+ */
+ @Serializable
+ enum class NonCacheabilityCategory(val value: kotlin.String) {
+ @SerialName(value = "build_cache_not_enabled") BUILD_CACHE_NOT_ENABLED("build_cache_not_enabled"),
+ @SerialName(value = "cache-if_condition_not_matched") CACHE_MINUS_IF_CONDITION_NOT_MATCHED("cache-if_condition_not_matched"),
+ @SerialName(value = "disabled_to_ensure_correctness") DISABLED_TO_ENSURE_CORRECTNESS("disabled_to_ensure_correctness"),
+ @SerialName(value = "do-not-cache-if_condition_matched") DO_MINUS_NOT_MINUS_CACHE_MINUS_IF_CONDITION_MATCHED("do-not-cache-if_condition_matched"),
+ @SerialName(value = "multiple_outputs_declared") MULTIPLE_OUTPUTS_DECLARED("multiple_outputs_declared"),
+ @SerialName(value = "no_outputs_declared") NO_OUTPUTS_DECLARED("no_outputs_declared"),
+ @SerialName(value = "non_cacheable_inputs") NON_CACHEABLE_INPUTS("non_cacheable_inputs"),
+ @SerialName(value = "non_cacheable_task_action") NON_CACHEABLE_TASK_ACTION("non_cacheable_task_action"),
+ @SerialName(value = "non_cacheable_task_implementation") NON_CACHEABLE_TASK_IMPLEMENTATION("non_cacheable_task_implementation"),
+ @SerialName(value = "non_cacheable_tree_output") NON_CACHEABLE_TREE_OUTPUT("non_cacheable_tree_output"),
+ @SerialName(value = "overlapping_outputs") OVERLAPPING_OUTPUTS("overlapping_outputs"),
+ @SerialName(value = "task_has_no_actions") TASK_HAS_NO_ACTIONS("task_has_no_actions"),
+ @SerialName(value = "task_output_caching_not_enabled") TASK_OUTPUT_CACHING_NOT_ENABLED("task_output_caching_not_enabled"),
+ @SerialName(value = "unknown") UNKNOWN("unknown");
+ }
+ /**
+ * The reason why the cache artifact is rejected: * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept. The value is `null` if the task is not cacheable, or if the attempt to store the artifact does not succeed.
+ *
+ * Values: ARTIFACT_SIZE_TOO_LARGE
+ */
+ @Serializable
+ enum class CacheArtifactRejectedReason(val value: kotlin.String) {
+ @SerialName(value = "artifact_size_too_large") ARTIFACT_SIZE_TOO_LARGE("artifact_size_too_large");
+ }
+}
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceTaskFingerprintingSummary.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceTaskFingerprintingSummary.kt
new file mode 100644
index 0000000..00775d2
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceTaskFingerprintingSummary.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A summary of task fingerprinting. Fingerprinted tasks are part of the `taskExecution.avoidedTasks` or `taskExecution.executedTasks`, or `taskExecution.noSourceTasks` buckets. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`.
+ *
+ * @param count Count of fingerprinted tasks.
+ * @param serialDuration Sum of all fingerprinting times of fingerprinted tasks in milliseconds.
+ */
+@Serializable
+
+data class GradleBuildCachePerformanceTaskFingerprintingSummary (
+
+ /* Count of fingerprinted tasks. */
+ @SerialName(value = "count")
+ val count: kotlin.Int,
+
+ /* Sum of all fingerprinting times of fingerprinted tasks in milliseconds. */
+ @SerialName(value = "serialDuration")
+ val serialDuration: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceWorkUnitAvoidanceSavingsSummary.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceWorkUnitAvoidanceSavingsSummary.kt
new file mode 100644
index 0000000..b9f7253
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceWorkUnitAvoidanceSavingsSummary.kt
@@ -0,0 +1,56 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A breakdown of avoidance savings for tasks and artifact transforms.
+ *
+ * @param total The estimated reduction in serial execution time of the work units due to their outputs being reused in milliseconds.
+ * @param ratio The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build.
+ * @param upToDate The estimated reduction in serial execution time of the work units due to build incrementalism in milliseconds.
+ * @param localBuildCache The estimated reduction in serial execution time of the work units due to their outputs being reused from the local build cache in milliseconds.
+ * @param remoteBuildCache The estimated reduction in serial execution time of the work units due to their outputs being reused from the remote build cache in milliseconds.
+ */
+@Serializable
+
+data class GradleBuildCachePerformanceWorkUnitAvoidanceSavingsSummary (
+
+ /* The estimated reduction in serial execution time of the work units due to their outputs being reused in milliseconds. */
+ @SerialName(value = "total")
+ val total: kotlin.Long,
+
+ /* The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build. */
+ @SerialName(value = "ratio")
+ val ratio: kotlin.Double,
+
+ /* The estimated reduction in serial execution time of the work units due to build incrementalism in milliseconds. */
+ @SerialName(value = "upToDate")
+ val upToDate: kotlin.Long,
+
+ /* The estimated reduction in serial execution time of the work units due to their outputs being reused from the local build cache in milliseconds. */
+ @SerialName(value = "localBuildCache")
+ val localBuildCache: kotlin.Long,
+
+ /* The estimated reduction in serial execution time of the work units due to their outputs being reused from the remote build cache in milliseconds. */
+ @SerialName(value = "remoteBuildCache")
+ val remoteBuildCache: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceWorkUnitFingerprintingSummary.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceWorkUnitFingerprintingSummary.kt
new file mode 100644
index 0000000..761c080
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildCachePerformanceWorkUnitFingerprintingSummary.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A summary of task and artifact transform fingerprinting. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`.
+ *
+ * @param count Count of fingerprinted work units.
+ * @param serialDuration Sum of all fingerprinting times of fingerprinted work units in milliseconds.
+ */
+@Serializable
+
+data class GradleBuildCachePerformanceWorkUnitFingerprintingSummary (
+
+ /* Count of fingerprinted work units. */
+ @SerialName(value = "count")
+ val count: kotlin.Int,
+
+ /* Sum of all fingerprinting times of fingerprinted work units in milliseconds. */
+ @SerialName(value = "serialDuration")
+ val serialDuration: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildOptions.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildOptions.kt
new file mode 100644
index 0000000..0bd5a30
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleBuildOptions.kt
@@ -0,0 +1,101 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Gradle build options for this build.
+ *
+ * @param configurationOnDemandEnabled Indicates whether configuration on demand mode is enabled for the build. See https://docs.gradle.org/current/userguide/multi_project_configuration_and_execution.html#sec:configuration_on_demand.
+ * @param continuousBuildEnabled Indicates whether continuous build mode is running for the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:continuous_build.
+ * @param continueOnFailureEnabled Indicates whether continue on failure mode is set for the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:continue_build_on_failure.
+ * @param daemonEnabled Indicates whether the build is run with the Gradle Daemon. See https://docs.gradle.org/current/userguide/gradle_daemon.html.
+ * @param dryRunEnabled Indicates whether the dry run flag is set for the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:command_line_execution_options.
+ * @param excludedTasks The list of excluded tasks. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:excluding_tasks_from_the_command_line.
+ * @param maxNumberOfGradleWorkers The maximum number of build workers used to run the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:command_line_performance.
+ * @param offlineModeEnabled Indicates whether the offline mode is set for the build. See https://docs.gradle.org/current/userguide/dynamic_versions.html#sec:offline-mode.
+ * @param parallelProjectExecutionEnabled Indicates whether parallel project execution is enabled for the build. See https://docs.gradle.org/current/userguide/multi_project_configuration_and_execution.html#sec:parallel_execution.
+ * @param refreshDependenciesEnabled Indicates whether the build is set to refresh all dependencies in the dependency cache. See https://docs.gradle.org/current/userguide/dynamic_versions.html#sec:refreshing-dependencies.
+ * @param rerunTasksEnabled Indicates whether the build is forced to run all the tasks, ignoring any up-to-date checks. https://docs.gradle.org/current/userguide/command_line_interface.html#sec:rerun_tasks.
+ * @param buildCacheEnabled Indicates whether the build cache is enabled for the build. `null` if Gradle version is < `3.1` or Develocity Gradle plugin version is < `1.3`. See https://docs.gradle.org/current/javadoc/org/gradle/StartParameter.html#isBuildCacheEnabled--.
+ * @param configurationCacheEnabled Indicates whether the configuration cache is enabled for the build. `null` if Gradle version is < `6.6` or Develocity Gradle plugin version is < `3.4`. See https://docs.gradle.org/current/userguide/configuration_cache.html.
+ * @param fileSystemWatchingEnabled Indicates whether file system watching is enabled for the build. `null` if Gradle version is < `6.6` or Develocity Gradle plugin version is < `3.4`. See https://docs.gradle.org/current/userguide/file_system_watching.html.
+ */
+@Serializable
+
+data class GradleBuildOptions (
+
+ /* Indicates whether configuration on demand mode is enabled for the build. See https://docs.gradle.org/current/userguide/multi_project_configuration_and_execution.html#sec:configuration_on_demand. */
+ @SerialName(value = "configurationOnDemandEnabled")
+ val configurationOnDemandEnabled: kotlin.Boolean,
+
+ /* Indicates whether continuous build mode is running for the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:continuous_build. */
+ @SerialName(value = "continuousBuildEnabled")
+ val continuousBuildEnabled: kotlin.Boolean,
+
+ /* Indicates whether continue on failure mode is set for the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:continue_build_on_failure. */
+ @SerialName(value = "continueOnFailureEnabled")
+ val continueOnFailureEnabled: kotlin.Boolean,
+
+ /* Indicates whether the build is run with the Gradle Daemon. See https://docs.gradle.org/current/userguide/gradle_daemon.html. */
+ @SerialName(value = "daemonEnabled")
+ val daemonEnabled: kotlin.Boolean,
+
+ /* Indicates whether the dry run flag is set for the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:command_line_execution_options. */
+ @SerialName(value = "dryRunEnabled")
+ val dryRunEnabled: kotlin.Boolean,
+
+ /* The list of excluded tasks. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:excluding_tasks_from_the_command_line. */
+ @SerialName(value = "excludedTasks")
+ val excludedTasks: kotlin.collections.List,
+
+ /* The maximum number of build workers used to run the build. See https://docs.gradle.org/current/userguide/command_line_interface.html#sec:command_line_performance. */
+ @SerialName(value = "maxNumberOfGradleWorkers")
+ val maxNumberOfGradleWorkers: kotlin.Int,
+
+ /* Indicates whether the offline mode is set for the build. See https://docs.gradle.org/current/userguide/dynamic_versions.html#sec:offline-mode. */
+ @SerialName(value = "offlineModeEnabled")
+ val offlineModeEnabled: kotlin.Boolean,
+
+ /* Indicates whether parallel project execution is enabled for the build. See https://docs.gradle.org/current/userguide/multi_project_configuration_and_execution.html#sec:parallel_execution. */
+ @SerialName(value = "parallelProjectExecutionEnabled")
+ val parallelProjectExecutionEnabled: kotlin.Boolean,
+
+ /* Indicates whether the build is set to refresh all dependencies in the dependency cache. See https://docs.gradle.org/current/userguide/dynamic_versions.html#sec:refreshing-dependencies. */
+ @SerialName(value = "refreshDependenciesEnabled")
+ val refreshDependenciesEnabled: kotlin.Boolean,
+
+ /* Indicates whether the build is forced to run all the tasks, ignoring any up-to-date checks. https://docs.gradle.org/current/userguide/command_line_interface.html#sec:rerun_tasks. */
+ @SerialName(value = "rerunTasksEnabled")
+ val rerunTasksEnabled: kotlin.Boolean,
+
+ /* Indicates whether the build cache is enabled for the build. `null` if Gradle version is < `3.1` or Develocity Gradle plugin version is < `1.3`. See https://docs.gradle.org/current/javadoc/org/gradle/StartParameter.html#isBuildCacheEnabled--. */
+ @SerialName(value = "buildCacheEnabled")
+ val buildCacheEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the configuration cache is enabled for the build. `null` if Gradle version is < `6.6` or Develocity Gradle plugin version is < `3.4`. See https://docs.gradle.org/current/userguide/configuration_cache.html. */
+ @SerialName(value = "configurationCacheEnabled")
+ val configurationCacheEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether file system watching is enabled for the build. `null` if Gradle version is < `6.6` or Develocity Gradle plugin version is < `3.4`. See https://docs.gradle.org/current/userguide/file_system_watching.html. */
+ @SerialName(value = "fileSystemWatchingEnabled")
+ val fileSystemWatchingEnabled: kotlin.Boolean? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecationEntry.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecationEntry.kt
new file mode 100644
index 0000000..730871f
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecationEntry.kt
@@ -0,0 +1,55 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param summary The description of the deprecation.
+ * @param removalDetails The details about when the deprecated feature will be removed from Gradle.
+ * @param usages List of usages of this deprecation.
+ * @param advice The advice on how to avoid using the deprecated feature. `null` when no advice is available.
+ * @param documentationUrl The external url pointing to some documentation about the deprecation. `null` for older Gradle/plugin combination or certain deprecation notices.
+ */
+@Serializable
+
+data class GradleDeprecationEntry (
+
+ /* The description of the deprecation. */
+ @SerialName(value = "summary")
+ val summary: kotlin.String,
+
+ /* The details about when the deprecated feature will be removed from Gradle. */
+ @SerialName(value = "removalDetails")
+ val removalDetails: kotlin.String,
+
+ /* List of usages of this deprecation. */
+ @SerialName(value = "usages")
+ val usages: kotlin.collections.List,
+
+ /* The advice on how to avoid using the deprecated feature. `null` when no advice is available. */
+ @SerialName(value = "advice")
+ val advice: kotlin.String? = null,
+
+ /* The external url pointing to some documentation about the deprecation. `null` for older Gradle/plugin combination or certain deprecation notices. */
+ @SerialName(value = "documentationUrl")
+ val documentationUrl: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecationOwner.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecationOwner.kt
new file mode 100644
index 0000000..cd7419f
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecationOwner.kt
@@ -0,0 +1,55 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param type The type of the deprecation owner: * `plugin` - The owner of the deprecation is a plugin. * `script` - The owner of the deprecation is a script. * `task` - The owner of the deprecation is a task. * `unknown` - Unknown deprecation owner type when none of the other options match.
+ * @param location The location of the deprecation usage. Can be a plugin id, task path, script file path, script URI. `null` if the owner type is unknown.
+ */
+@Serializable
+
+data class GradleDeprecationOwner (
+
+ /* The type of the deprecation owner: * `plugin` - The owner of the deprecation is a plugin. * `script` - The owner of the deprecation is a script. * `task` - The owner of the deprecation is a task. * `unknown` - Unknown deprecation owner type when none of the other options match. */
+ @SerialName(value = "type")
+ val type: GradleDeprecationOwner.Type,
+
+ /* The location of the deprecation usage. Can be a plugin id, task path, script file path, script URI. `null` if the owner type is unknown. */
+ @SerialName(value = "location")
+ val location: kotlin.String? = null
+
+) {
+
+ /**
+ * The type of the deprecation owner: * `plugin` - The owner of the deprecation is a plugin. * `script` - The owner of the deprecation is a script. * `task` - The owner of the deprecation is a task. * `unknown` - Unknown deprecation owner type when none of the other options match.
+ *
+ * Values: PLUGIN,SCRIPT,TASK,UNKNOWN
+ */
+ @Serializable
+ enum class Type(val value: kotlin.String) {
+ @SerialName(value = "plugin") PLUGIN("plugin"),
+ @SerialName(value = "script") SCRIPT("script"),
+ @SerialName(value = "task") TASK("task"),
+ @SerialName(value = "unknown") UNKNOWN("unknown");
+ }
+}
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecationUsage.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecationUsage.kt
new file mode 100644
index 0000000..e34d7d0
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecationUsage.kt
@@ -0,0 +1,39 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param owner
+ * @param contextualAdvice Advice on how to avoid using the deprecated feature, that is specific to this particular usage. `null` when no advice is available.
+ */
+@Serializable
+
+data class GradleDeprecationUsage (
+
+ @SerialName(value = "owner")
+ val owner: GradleDeprecationOwner,
+
+ /* Advice on how to avoid using the deprecated feature, that is specific to this particular usage. `null` when no advice is available. */
+ @SerialName(value = "contextualAdvice")
+ val contextualAdvice: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecations.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecations.kt
new file mode 100644
index 0000000..9a5800d
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDeprecations.kt
@@ -0,0 +1,35 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param deprecations A list of Gradle Build Tool deprecations with details and usage information. `null` if deprecation capturing is not supported.
+ */
+@Serializable
+
+data class GradleDeprecations (
+
+ /* A list of Gradle Build Tool deprecations with details and usage information. `null` if deprecation capturing is not supported. */
+ @SerialName(value = "deprecations")
+ val deprecations: kotlin.collections.List? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDevelocitySettings.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDevelocitySettings.kt
new file mode 100644
index 0000000..36d2af0
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleDevelocitySettings.kt
@@ -0,0 +1,57 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Settings for Develocity.
+ *
+ * @param backgroundPublicationEnabled Indicates whether background Build Scan publication is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.4`. See https://gradle.com/help/gradle-plugin-configuring-background-uploading.
+ * @param buildOutputCapturingEnabled Indicates whether build logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs.
+ * @param fileFingerprintCapturingEnabled Indicates whether file fingerprint capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`. See https://docs.gradle.com/enterprise/gradle-plugin/#capturing_task_input_files.
+ * @param taskInputsFileCapturingEnabled Indicates whether task input file snapshots capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`. See https://gradle.com/help/gradle-plugin-capturing-task-input-files. **This property is deprecated, use `fileFingerprintCapturingEnabled` instead.**
+ * @param testOutputCapturingEnabled Indicates whether test logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs.
+ */
+@Serializable
+
+data class GradleDevelocitySettings (
+
+ /* Indicates whether background Build Scan publication is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.4`. See https://gradle.com/help/gradle-plugin-configuring-background-uploading. */
+ @SerialName(value = "backgroundPublicationEnabled")
+ val backgroundPublicationEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether build logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs. */
+ @SerialName(value = "buildOutputCapturingEnabled")
+ val buildOutputCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether file fingerprint capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`. See https://docs.gradle.com/enterprise/gradle-plugin/#capturing_task_input_files. */
+ @SerialName(value = "fileFingerprintCapturingEnabled")
+ val fileFingerprintCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether task input file snapshots capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`. See https://gradle.com/help/gradle-plugin-capturing-task-input-files. **This property is deprecated, use `fileFingerprintCapturingEnabled` instead.** */
+ @SerialName(value = "taskInputsFileCapturingEnabled")
+ @Deprecated(message = "This property is deprecated.")
+ val taskInputsFileCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether test logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs. */
+ @SerialName(value = "testOutputCapturingEnabled")
+ val testOutputCapturingEnabled: kotlin.Boolean? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleEnterpriseVersion.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleEnterpriseVersion.kt
new file mode 100644
index 0000000..45f3429
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleEnterpriseVersion.kt
@@ -0,0 +1,52 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * **This object is deprecated, use `DevelocityVersion` instead.**
+ *
+ * @param string The complete version string of format `YEAR.RELEASE.PATCH`, where the patch component is omitted when `0` (e.g. `2022.3`, `2022.3.1`).
+ * @param year The gregorian calendar year of the release.
+ * @param release The sequence number of the release for that year, starting with 1.
+ * @param patch The patch level of the release, starting with 0.
+ */
+@Serializable
+@Deprecated(message = "This schema is deprecated.")
+
+data class GradleEnterpriseVersion (
+
+ /* The complete version string of format `YEAR.RELEASE.PATCH`, where the patch component is omitted when `0` (e.g. `2022.3`, `2022.3.1`). */
+ @SerialName(value = "string")
+ val string: kotlin.String,
+
+ /* The gregorian calendar year of the release. */
+ @SerialName(value = "year")
+ val year: kotlin.Int,
+
+ /* The sequence number of the release for that year, starting with 1. */
+ @SerialName(value = "release")
+ val release: kotlin.Int,
+
+ /* The patch level of the release, starting with 0. */
+ @SerialName(value = "patch")
+ val patch: kotlin.Int
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleGradleEnterpriseSettings.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleGradleEnterpriseSettings.kt
new file mode 100644
index 0000000..4a268c1
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleGradleEnterpriseSettings.kt
@@ -0,0 +1,52 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * **This property is deprecated, use `develocitySettings` instead.** Settings for Develocity.
+ *
+ * @param backgroundPublicationEnabled Indicates whether background Build Scan publication is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.4`. See https://gradle.com/help/gradle-plugin-configuring-background-uploading.
+ * @param buildOutputCapturingEnabled Indicates whether build logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs.
+ * @param taskInputsFileCapturingEnabled Indicates whether task input file snapshots capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`. See https://gradle.com/help/gradle-plugin-capturing-task-input-files.
+ * @param testOutputCapturingEnabled Indicates whether test logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs.
+ */
+@Serializable
+@Deprecated(message = "This schema is deprecated.")
+
+data class GradleGradleEnterpriseSettings (
+
+ /* Indicates whether background Build Scan publication is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.4`. See https://gradle.com/help/gradle-plugin-configuring-background-uploading. */
+ @SerialName(value = "backgroundPublicationEnabled")
+ val backgroundPublicationEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether build logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs. */
+ @SerialName(value = "buildOutputCapturingEnabled")
+ val buildOutputCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether task input file snapshots capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `2.1`. See https://gradle.com/help/gradle-plugin-capturing-task-input-files. */
+ @SerialName(value = "taskInputsFileCapturingEnabled")
+ val taskInputsFileCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether test logging output capturing is enabled for the build. `null` if Gradle version is < `5.0` or Develocity Gradle plugin version is < `3.7`. See https://gradle.com/help/gradle-plugin-capturing-build-and-test-outputs. */
+ @SerialName(value = "testOutputCapturingEnabled")
+ val testOutputCapturingEnabled: kotlin.Boolean? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleNetworkActivity.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleNetworkActivity.kt
new file mode 100644
index 0000000..33d0dec
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleNetworkActivity.kt
@@ -0,0 +1,56 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the network activity of the build. It includes network activity during dependency resolution, java toolchain downloads, etc. For a comprehensive list see the Build Scan.
+ *
+ * @param networkRequestCount This represents the total count of network requests.
+ * @param serialNetworkRequestTime The duration in milliseconds representing the sum of times for potentially parallel network requests. It does not reflect wall clock time but offers a rough estimation of network activity.
+ * @param fileDownloadSize The total number of bytes downloaded for dependencies. It accounts only for the bytes of the files (e.g. POMs, JARs) downloaded and not the total network transfer.
+ * @param fileDownloadCount The total number of successfully downloaded files.
+ * @param wallClockNetworkRequestTime The estimate in milliseconds representing the wall clock time spent on network requests during the current build. It is calculated by comparing the critical path within non-execution and execution phases with and without network requests, converted to wall clock time. This is null when Gradle version is lower than 6.2 or the Develocity plugin version is lower than 3.12.
+ */
+@Serializable
+
+data class GradleNetworkActivity (
+
+ /* This represents the total count of network requests. */
+ @SerialName(value = "networkRequestCount")
+ val networkRequestCount: kotlin.Long,
+
+ /* The duration in milliseconds representing the sum of times for potentially parallel network requests. It does not reflect wall clock time but offers a rough estimation of network activity. */
+ @SerialName(value = "serialNetworkRequestTime")
+ val serialNetworkRequestTime: kotlin.Long,
+
+ /* The total number of bytes downloaded for dependencies. It accounts only for the bytes of the files (e.g. POMs, JARs) downloaded and not the total network transfer. */
+ @SerialName(value = "fileDownloadSize")
+ val fileDownloadSize: kotlin.Long,
+
+ /* The total number of successfully downloaded files. */
+ @SerialName(value = "fileDownloadCount")
+ val fileDownloadCount: kotlin.Long,
+
+ /* The estimate in milliseconds representing the wall clock time spent on network requests during the current build. It is calculated by comparing the critical path within non-execution and execution phases with and without network requests, converted to wall clock time. This is null when Gradle version is lower than 6.2 or the Develocity plugin version is lower than 3.12. */
+ @SerialName(value = "wallClockNetworkRequestTime")
+ val wallClockNetworkRequestTime: kotlin.Long? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleProject.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleProject.kt
new file mode 100644
index 0000000..7cc0fdb
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleProject.kt
@@ -0,0 +1,46 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Gradle project.
+ *
+ * @param name The name of the project.
+ * @param path The path of the project.
+ * @param parent The index of the parent of this Gradle project in the GradleProjects array. `null` if this project has no parent (i.e. root project of a build).
+ */
+@Serializable
+
+data class GradleProject (
+
+ /* The name of the project. */
+ @SerialName(value = "name")
+ val name: kotlin.String,
+
+ /* The path of the project. */
+ @SerialName(value = "path")
+ val path: kotlin.String,
+
+ /* The index of the parent of this Gradle project in the GradleProjects array. `null` if this project has no parent (i.e. root project of a build). */
+ @SerialName(value = "parent")
+ val parent: kotlin.Int? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleWorkUnit.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleWorkUnit.kt
new file mode 100644
index 0000000..c59b9a3
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/GradleWorkUnit.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Gradle work unit.
+ *
+ * @param projectName The name of the Gradle project.
+ * @param taskPath The path of the Gradle task.
+ */
+@Serializable
+
+data class GradleWorkUnit (
+
+ /* The name of the Gradle project. */
+ @SerialName(value = "projectName")
+ val projectName: kotlin.String,
+
+ /* The path of the Gradle task. */
+ @SerialName(value = "taskPath")
+ val taskPath: kotlin.String
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/KeySecretPair.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/KeySecretPair.kt
new file mode 100644
index 0000000..97bf4bd
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/KeySecretPair.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Build Cache Node key and secret pair.
+ *
+ * @param key A unique identifier for the Build Cache Node in Develocity.
+ * @param secret The secret associated with the Build Cache Node.
+ */
+@Serializable
+
+data class KeySecretPair (
+
+ /* A unique identifier for the Build Cache Node in Develocity. */
+ @SerialName(value = "key")
+ val key: kotlin.String,
+
+ /* The secret associated with the Build Cache Node. */
+ @SerialName(value = "secret")
+ val secret: kotlin.String
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenAttributes.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenAttributes.kt
new file mode 100644
index 0000000..75a46c2
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenAttributes.kt
@@ -0,0 +1,112 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport", "DEPRECATION"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The attributes of a Maven build.
+ *
+ * @param id The Build Scan ID.
+ * @param buildStartTime The time when the build starts, as milliseconds since Epoch.
+ * @param buildDuration The duration of the build, as milliseconds since Epoch.
+ * @param mavenVersion The Maven version used.
+ * @param extensionVersion The Develocity Maven extension version used.
+ * @param requestedGoals The list of requested goals.
+ * @param hasFailed True when the build fails, false otherwise.
+ * @param tags The list of Build Scan tags.
+ * @param propertyValues The list of Build Scan values.
+ * @param links The list of Build Scan links.
+ * @param gradleEnterpriseSettings
+ * @param develocitySettings
+ * @param buildOptions
+ * @param environment
+ * @param topLevelProjectName The top level project name. `null` in case of very early build failure.
+ * @param hasVerificationFailure Set only if the build fails: true when the build has at least one failure classified as \"Verification\", false otherwise. The Verification classification is meant for failures that are expected within a standard application development lifecycle. They typically represent a problem with the developer’s inputs to the build such as the source code.
+ * @param hasNonVerificationFailure Set only if the build fails: true when the build has at least one failure classified as \"Non-verification\", false otherwise. The Non-verification classification is meant for failures that are typically not expected within a standard application development lifecycle, such as build configuration failures, dependency resolution failures, and infrastructure failures.
+ */
+@Serializable
+
+data class MavenAttributes (
+
+ /* The Build Scan ID. */
+ @SerialName(value = "id")
+ val id: kotlin.String,
+
+ /* The time when the build starts, as milliseconds since Epoch. */
+ @SerialName(value = "buildStartTime")
+ val buildStartTime: kotlin.Long,
+
+ /* The duration of the build, as milliseconds since Epoch. */
+ @SerialName(value = "buildDuration")
+ val buildDuration: kotlin.Long,
+
+ /* The Maven version used. */
+ @SerialName(value = "mavenVersion")
+ val mavenVersion: kotlin.String,
+
+ /* The Develocity Maven extension version used. */
+ @SerialName(value = "extensionVersion")
+ val extensionVersion: kotlin.String,
+
+ /* The list of requested goals. */
+ @SerialName(value = "requestedGoals")
+ val requestedGoals: kotlin.collections.List,
+
+ /* True when the build fails, false otherwise. */
+ @SerialName(value = "hasFailed")
+ val hasFailed: kotlin.Boolean,
+
+ /* The list of Build Scan tags. */
+ @SerialName(value = "tags")
+ val tags: kotlin.collections.List,
+
+ /* The list of Build Scan values. */
+ @SerialName(value = "values")
+ val propertyValues: kotlin.collections.List,
+
+ /* The list of Build Scan links. */
+ @SerialName(value = "links")
+ val links: kotlin.collections.List,
+
+ @SerialName(value = "gradleEnterpriseSettings")
+ @Deprecated(message = "This property is deprecated.")
+ val gradleEnterpriseSettings: MavenGradleEnterpriseSettings,
+
+ @SerialName(value = "develocitySettings")
+ val develocitySettings: MavenDevelocitySettings,
+
+ @SerialName(value = "buildOptions")
+ val buildOptions: MavenBuildOptions,
+
+ @SerialName(value = "environment")
+ val environment: BuildAttributesEnvironment,
+
+ /* The top level project name. `null` in case of very early build failure. */
+ @SerialName(value = "topLevelProjectName")
+ val topLevelProjectName: kotlin.String? = null,
+
+ /* Set only if the build fails: true when the build has at least one failure classified as \"Verification\", false otherwise. The Verification classification is meant for failures that are expected within a standard application development lifecycle. They typically represent a problem with the developer’s inputs to the build such as the source code. */
+ @SerialName(value = "hasVerificationFailure")
+ val hasVerificationFailure: kotlin.Boolean? = null,
+
+ /* Set only if the build fails: true when the build has at least one failure classified as \"Non-verification\", false otherwise. The Non-verification classification is meant for failures that are typically not expected within a standard application development lifecycle, such as build configuration failures, dependency resolution failures, and infrastructure failures. */
+ @SerialName(value = "hasNonVerificationFailure")
+ val hasNonVerificationFailure: kotlin.Boolean? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformance.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformance.kt
new file mode 100644
index 0000000..330cbce
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformance.kt
@@ -0,0 +1,72 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The build cache performance of a Maven build.
+ *
+ * @param id The Build Scan ID.
+ * @param buildTime Wall clock duration of the build in milliseconds.
+ * @param effectiveProjectExecutionTime Wall clock time spent executing projects in milliseconds. It is the time spent between the start of the first project execution and the end of the last project execution, removing any interval where no project is being executed.
+ * @param serialProjectExecutionTime Wall clock time of all project executions in milliseconds. It is the sum of all individual project durations.
+ * @param serializationFactor The ratio of `serialProjectExecutionTime` over the `effectiveProjectExecutionTime`. Quantifies the effect of project parallelization. A value equal to `1` means that no parallelization occurs. A value greater than `1` means that projects are executed faster due to parallelization.
+ * @param goalExecution A list of executed goals with performance related information.
+ * @param goalFingerprintingSummary
+ * @param avoidanceSavingsSummary
+ * @param buildCaches
+ */
+@Serializable
+
+data class MavenBuildCachePerformance (
+
+ /* The Build Scan ID. */
+ @SerialName(value = "id")
+ val id: kotlin.String,
+
+ /* Wall clock duration of the build in milliseconds. */
+ @SerialName(value = "buildTime")
+ val buildTime: kotlin.Long,
+
+ /* Wall clock time spent executing projects in milliseconds. It is the time spent between the start of the first project execution and the end of the last project execution, removing any interval where no project is being executed. */
+ @SerialName(value = "effectiveProjectExecutionTime")
+ val effectiveProjectExecutionTime: kotlin.Long,
+
+ /* Wall clock time of all project executions in milliseconds. It is the sum of all individual project durations. */
+ @SerialName(value = "serialProjectExecutionTime")
+ val serialProjectExecutionTime: kotlin.Long,
+
+ /* The ratio of `serialProjectExecutionTime` over the `effectiveProjectExecutionTime`. Quantifies the effect of project parallelization. A value equal to `1` means that no parallelization occurs. A value greater than `1` means that projects are executed faster due to parallelization. */
+ @SerialName(value = "serializationFactor")
+ val serializationFactor: kotlin.Double,
+
+ /* A list of executed goals with performance related information. */
+ @SerialName(value = "goalExecution")
+ val goalExecution: kotlin.collections.List,
+
+ @SerialName(value = "goalFingerprintingSummary")
+ val goalFingerprintingSummary: MavenBuildCachePerformanceGoalFingerprintingSummary,
+
+ @SerialName(value = "avoidanceSavingsSummary")
+ val avoidanceSavingsSummary: MavenBuildCachePerformanceAvoidanceSavingsSummary,
+
+ @SerialName(value = "buildCaches")
+ val buildCaches: MavenBuildCachePerformanceBuildCaches? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceAvoidanceSavingsSummary.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceAvoidanceSavingsSummary.kt
new file mode 100644
index 0000000..e47e75c
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceAvoidanceSavingsSummary.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A breakdown of avoidance savings.
+ *
+ * @param total The estimated reduction in serial execution time of the goals due to their outputs being reused in milliseconds.
+ * @param ratio The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build.
+ * @param localBuildCache The estimated reduction in serial execution time of the goals due to their outputs being reused from the local build cache in milliseconds.
+ * @param remoteBuildCache The estimated reduction in serial execution time of the goals due to their outputs being reused from the remote build cache in milliseconds.
+ */
+@Serializable
+
+data class MavenBuildCachePerformanceAvoidanceSavingsSummary (
+
+ /* The estimated reduction in serial execution time of the goals due to their outputs being reused in milliseconds. */
+ @SerialName(value = "total")
+ val total: kotlin.Long,
+
+ /* The ratio of the total avoidance savings against the potential serial execution time (which is the actual serial execution time plus the total avoidance savings). Quantifies the effect of avoidance savings in this build. The bigger the ratio is, the more time is saved when running the build. */
+ @SerialName(value = "ratio")
+ val ratio: kotlin.Double,
+
+ /* The estimated reduction in serial execution time of the goals due to their outputs being reused from the local build cache in milliseconds. */
+ @SerialName(value = "localBuildCache")
+ val localBuildCache: kotlin.Long,
+
+ /* The estimated reduction in serial execution time of the goals due to their outputs being reused from the remote build cache in milliseconds. */
+ @SerialName(value = "remoteBuildCache")
+ val remoteBuildCache: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCacheLocalInfo.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCacheLocalInfo.kt
new file mode 100644
index 0000000..f9ab7c3
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCacheLocalInfo.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the local build cache used in the build, if it is configured in the build. `null` if the local build cache is not configured.
+ *
+ * @param isEnabled Indicates whether the local build cache is enabled.
+ * @param isPushEnabled Indicates whether pushing to the local build cache is enabled. `null` if the local build cache is disabled.
+ * @param isDisabledDueToError Indicates whether the local cache is disabled due to an error occurring in loading or storing local build cache entries. `null` if the local build cache is disabled.
+ * @param directory Location of the local build cache. Can be relative or absolute depending on its value. `null` if the local build cache is disabled.
+ */
+@Serializable
+
+data class MavenBuildCachePerformanceBuildCacheLocalInfo (
+
+ /* Indicates whether the local build cache is enabled. */
+ @SerialName(value = "isEnabled")
+ val isEnabled: kotlin.Boolean,
+
+ /* Indicates whether pushing to the local build cache is enabled. `null` if the local build cache is disabled. */
+ @SerialName(value = "isPushEnabled")
+ val isPushEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the local cache is disabled due to an error occurring in loading or storing local build cache entries. `null` if the local build cache is disabled. */
+ @SerialName(value = "isDisabledDueToError")
+ val isDisabledDueToError: kotlin.Boolean? = null,
+
+ /* Location of the local build cache. Can be relative or absolute depending on its value. `null` if the local build cache is disabled. */
+ @SerialName(value = "directory")
+ val directory: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCacheOverhead.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCacheOverhead.kt
new file mode 100644
index 0000000..955c00e
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCacheOverhead.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the build cache overhead in this build.
+ *
+ * @param uploading Overhead of upload operations in milliseconds.
+ * @param downloading Overhead of download operations in milliseconds.
+ * @param packing Overhead of pack operations in milliseconds.
+ * @param unpacking Overhead of unpack operations in milliseconds.
+ */
+@Serializable
+
+data class MavenBuildCachePerformanceBuildCacheOverhead (
+
+ /* Overhead of upload operations in milliseconds. */
+ @SerialName(value = "uploading")
+ val uploading: kotlin.Long,
+
+ /* Overhead of download operations in milliseconds. */
+ @SerialName(value = "downloading")
+ val downloading: kotlin.Long,
+
+ /* Overhead of pack operations in milliseconds. */
+ @SerialName(value = "packing")
+ val packing: kotlin.Long,
+
+ /* Overhead of unpack operations in milliseconds. */
+ @SerialName(value = "unpacking")
+ val unpacking: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCacheRemoteInfo.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCacheRemoteInfo.kt
new file mode 100644
index 0000000..da57b9d
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCacheRemoteInfo.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the remote build cache used in the build, if it is configured in the build. `null` if the remote build cache is not configured.
+ *
+ * @param isEnabled Indicates whether the remote build cache is enabled.
+ * @param isPushEnabled Indicates whether pushing to the remote build cache is enabled. `null` if the remote build cache is disabled.
+ * @param isDisabledDueToError Indicates whether the remote build cache is disabled during the build due to an error occurring in loading or storing remote build cache entries. `null` if the remote build cache is disabled.
+ * @param url URL of the remote build cache. `null` if the remote build cache is disabled.
+ */
+@Serializable
+
+data class MavenBuildCachePerformanceBuildCacheRemoteInfo (
+
+ /* Indicates whether the remote build cache is enabled. */
+ @SerialName(value = "isEnabled")
+ val isEnabled: kotlin.Boolean,
+
+ /* Indicates whether pushing to the remote build cache is enabled. `null` if the remote build cache is disabled. */
+ @SerialName(value = "isPushEnabled")
+ val isPushEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the remote build cache is disabled during the build due to an error occurring in loading or storing remote build cache entries. `null` if the remote build cache is disabled. */
+ @SerialName(value = "isDisabledDueToError")
+ val isDisabledDueToError: kotlin.Boolean? = null,
+
+ /* URL of the remote build cache. `null` if the remote build cache is disabled. */
+ @SerialName(value = "url")
+ val url: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCaches.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCaches.kt
new file mode 100644
index 0000000..4b3a1b6
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceBuildCaches.kt
@@ -0,0 +1,42 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the local and remote build caches used in the build, if it is configured in the build. `null` if the build cache configuration cannot be captured (e.g. very early build failure).
+ *
+ * @param overhead
+ * @param local
+ * @param remote
+ */
+@Serializable
+
+data class MavenBuildCachePerformanceBuildCaches (
+
+ @SerialName(value = "overhead")
+ val overhead: MavenBuildCachePerformanceBuildCacheOverhead,
+
+ @SerialName(value = "local")
+ val local: MavenBuildCachePerformanceBuildCacheLocalInfo? = null,
+
+ @SerialName(value = "remote")
+ val remote: MavenBuildCachePerformanceBuildCacheRemoteInfo? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceGoalExecutionEntry.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceGoalExecutionEntry.kt
new file mode 100644
index 0000000..c96642c
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceGoalExecutionEntry.kt
@@ -0,0 +1,139 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param goalName The goal name.
+ * @param mojoType The fully qualified class name of the Mojo that provides the implementation of this goal.
+ * @param goalExecutionId The goal execution ID.
+ * @param goalProjectName The goal project name.
+ * @param avoidanceOutcome The avoidance outcome of this task with respect to performance: * `avoided_from_local_cache` - Goal whose execution is avoided due to reusing a local build cache entry * `avoided_from_remote_cache` - Goal whose execution is avoided due to reusing a remote build cache entry * `executed_cacheable` - Goal which is executed but is cacheable * `executed_not_cacheable` - Goal which is executed but is not cacheable * `executed_unknown_cacheability` - Goal which is executed and whose cacheability cannot be determined * `skipped` - Skipped goal
+ * @param duration The goal duration in milliseconds.
+ * @param fingerprintingDuration The goal fingerprinting duration in milliseconds. This duration is part of the complete task execution duration. `null` if the goal is not fingerprinted.
+ * @param avoidanceSavings The goal avoidance savings in milliseconds, which can be negative. Negative values indicate that it takes more time to reuse outputs than it did to create them originally. `null` if the information is not available.
+ * @param nonCacheabilityCategory The category of the non-cacheability reason: * `build_cache_disabled_by_user` - The build cache is disabled by the user * `goal_execution_marked_non_cacheable` - The goal execution is marked as non-cacheable * `goal_not_supported` - The goal does not support build caching * `no_gradle_enterprise_server_configured` - No Develocity server is configured **Deprecated, use `no_develocity_server_configured` instead** * `no_develocity_server_configured` - No Develocity server is configured * `non_clean_build` - The `clean` lifecycle is not executed * `not_entitled` - The Develocity license entitlements does not allow Maven build caching * `offline_build` - The build is run in offline mode * `unknown` - Reason for disabled caching is not known * `unknown_entitlements` - The Develocity license entitlements cannot be checked `null` when the goal execution is cacheable or if the information is not available.
+ * @param nonCacheabilityReason The human-readable reason for a non-cacheable goal execution. `null` when the goal execution is cacheable or if the information is not available.
+ * @param cacheArtifactSize The number of bytes of the produced or consumed cache artifact. For a goal execution where the outputs are successfully stored to a local or remote cache, this is the size of the stored cache artifact. For a goal execution where the outputs are successfully loaded from a local or remote cache, this is the size of the loaded cache artifact. `null` if the goal execution is not cacheable, or if the attempt to store or load the artifact from cache does not succeed.
+ * @param cacheArtifactRejectedReason The reason why the cache artifact has been rejected: * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept. `null` if the goal is not cacheable, or if the attempt to store the artifact does not succeed.
+ * @param cacheKey Build cache key. `null` if no build cache key was computed (e.g. when fingerprinting failed).
+ */
+@Serializable
+
+data class MavenBuildCachePerformanceGoalExecutionEntry (
+
+ /* The goal name. */
+ @SerialName(value = "goalName")
+ val goalName: kotlin.String,
+
+ /* The fully qualified class name of the Mojo that provides the implementation of this goal. */
+ @SerialName(value = "mojoType")
+ val mojoType: kotlin.String,
+
+ /* The goal execution ID. */
+ @SerialName(value = "goalExecutionId")
+ val goalExecutionId: kotlin.String,
+
+ /* The goal project name. */
+ @SerialName(value = "goalProjectName")
+ val goalProjectName: kotlin.String,
+
+ /* The avoidance outcome of this task with respect to performance: * `avoided_from_local_cache` - Goal whose execution is avoided due to reusing a local build cache entry * `avoided_from_remote_cache` - Goal whose execution is avoided due to reusing a remote build cache entry * `executed_cacheable` - Goal which is executed but is cacheable * `executed_not_cacheable` - Goal which is executed but is not cacheable * `executed_unknown_cacheability` - Goal which is executed and whose cacheability cannot be determined * `skipped` - Skipped goal */
+ @SerialName(value = "avoidanceOutcome")
+ val avoidanceOutcome: MavenBuildCachePerformanceGoalExecutionEntry.AvoidanceOutcome,
+
+ /* The goal duration in milliseconds. */
+ @SerialName(value = "duration")
+ val duration: kotlin.Long,
+
+ /* The goal fingerprinting duration in milliseconds. This duration is part of the complete task execution duration. `null` if the goal is not fingerprinted. */
+ @SerialName(value = "fingerprintingDuration")
+ val fingerprintingDuration: kotlin.Long? = null,
+
+ /* The goal avoidance savings in milliseconds, which can be negative. Negative values indicate that it takes more time to reuse outputs than it did to create them originally. `null` if the information is not available. */
+ @SerialName(value = "avoidanceSavings")
+ val avoidanceSavings: kotlin.Long? = null,
+
+ /* The category of the non-cacheability reason: * `build_cache_disabled_by_user` - The build cache is disabled by the user * `goal_execution_marked_non_cacheable` - The goal execution is marked as non-cacheable * `goal_not_supported` - The goal does not support build caching * `no_gradle_enterprise_server_configured` - No Develocity server is configured **Deprecated, use `no_develocity_server_configured` instead** * `no_develocity_server_configured` - No Develocity server is configured * `non_clean_build` - The `clean` lifecycle is not executed * `not_entitled` - The Develocity license entitlements does not allow Maven build caching * `offline_build` - The build is run in offline mode * `unknown` - Reason for disabled caching is not known * `unknown_entitlements` - The Develocity license entitlements cannot be checked `null` when the goal execution is cacheable or if the information is not available. */
+ @SerialName(value = "nonCacheabilityCategory")
+ val nonCacheabilityCategory: MavenBuildCachePerformanceGoalExecutionEntry.NonCacheabilityCategory? = null,
+
+ /* The human-readable reason for a non-cacheable goal execution. `null` when the goal execution is cacheable or if the information is not available. */
+ @SerialName(value = "nonCacheabilityReason")
+ val nonCacheabilityReason: kotlin.String? = null,
+
+ /* The number of bytes of the produced or consumed cache artifact. For a goal execution where the outputs are successfully stored to a local or remote cache, this is the size of the stored cache artifact. For a goal execution where the outputs are successfully loaded from a local or remote cache, this is the size of the loaded cache artifact. `null` if the goal execution is not cacheable, or if the attempt to store or load the artifact from cache does not succeed. */
+ @SerialName(value = "cacheArtifactSize")
+ val cacheArtifactSize: kotlin.Long? = null,
+
+ /* The reason why the cache artifact has been rejected: * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept. `null` if the goal is not cacheable, or if the attempt to store the artifact does not succeed. */
+ @SerialName(value = "cacheArtifactRejectedReason")
+ val cacheArtifactRejectedReason: MavenBuildCachePerformanceGoalExecutionEntry.CacheArtifactRejectedReason? = null,
+
+ /* Build cache key. `null` if no build cache key was computed (e.g. when fingerprinting failed). */
+ @SerialName(value = "cacheKey")
+ val cacheKey: kotlin.String? = null
+
+) {
+
+ /**
+ * The avoidance outcome of this task with respect to performance: * `avoided_from_local_cache` - Goal whose execution is avoided due to reusing a local build cache entry * `avoided_from_remote_cache` - Goal whose execution is avoided due to reusing a remote build cache entry * `executed_cacheable` - Goal which is executed but is cacheable * `executed_not_cacheable` - Goal which is executed but is not cacheable * `executed_unknown_cacheability` - Goal which is executed and whose cacheability cannot be determined * `skipped` - Skipped goal
+ *
+ * Values: AVOIDED_FROM_LOCAL_CACHE,AVOIDED_FROM_REMOTE_CACHE,EXECUTED_CACHEABLE,EXECUTED_NOT_CACHEABLE,EXECUTED_UNKNOWN_CACHEABILITY,SKIPPED
+ */
+ @Serializable
+ enum class AvoidanceOutcome(val value: kotlin.String) {
+ @SerialName(value = "avoided_from_local_cache") AVOIDED_FROM_LOCAL_CACHE("avoided_from_local_cache"),
+ @SerialName(value = "avoided_from_remote_cache") AVOIDED_FROM_REMOTE_CACHE("avoided_from_remote_cache"),
+ @SerialName(value = "executed_cacheable") EXECUTED_CACHEABLE("executed_cacheable"),
+ @SerialName(value = "executed_not_cacheable") EXECUTED_NOT_CACHEABLE("executed_not_cacheable"),
+ @SerialName(value = "executed_unknown_cacheability") EXECUTED_UNKNOWN_CACHEABILITY("executed_unknown_cacheability"),
+ @SerialName(value = "skipped") SKIPPED("skipped");
+ }
+ /**
+ * The category of the non-cacheability reason: * `build_cache_disabled_by_user` - The build cache is disabled by the user * `goal_execution_marked_non_cacheable` - The goal execution is marked as non-cacheable * `goal_not_supported` - The goal does not support build caching * `no_gradle_enterprise_server_configured` - No Develocity server is configured **Deprecated, use `no_develocity_server_configured` instead** * `no_develocity_server_configured` - No Develocity server is configured * `non_clean_build` - The `clean` lifecycle is not executed * `not_entitled` - The Develocity license entitlements does not allow Maven build caching * `offline_build` - The build is run in offline mode * `unknown` - Reason for disabled caching is not known * `unknown_entitlements` - The Develocity license entitlements cannot be checked `null` when the goal execution is cacheable or if the information is not available.
+ *
+ * Values: BUILD_CACHE_DISABLED_BY_USER,GOAL_EXECUTION_MARKED_NON_CACHEABLE,GOAL_NOT_SUPPORTED,NO_GRADLE_ENTERPRISE_SERVER_CONFIGURED,NO_DEVELOCITY_SERVER_CONFIGURED,NON_CLEAN_BUILD,NOT_ENTITLED,OFFLINE_BUILD,UNKNOWN,UNKNOWN_ENTITLEMENTS
+ */
+ @Serializable
+ enum class NonCacheabilityCategory(val value: kotlin.String) {
+ @SerialName(value = "build_cache_disabled_by_user") BUILD_CACHE_DISABLED_BY_USER("build_cache_disabled_by_user"),
+ @SerialName(value = "goal_execution_marked_non_cacheable") GOAL_EXECUTION_MARKED_NON_CACHEABLE("goal_execution_marked_non_cacheable"),
+ @SerialName(value = "goal_not_supported") GOAL_NOT_SUPPORTED("goal_not_supported"),
+ @SerialName(value = "no_gradle_enterprise_server_configured") NO_GRADLE_ENTERPRISE_SERVER_CONFIGURED("no_gradle_enterprise_server_configured"),
+ @SerialName(value = "no_develocity_server_configured") NO_DEVELOCITY_SERVER_CONFIGURED("no_develocity_server_configured"),
+ @SerialName(value = "non_clean_build") NON_CLEAN_BUILD("non_clean_build"),
+ @SerialName(value = "not_entitled") NOT_ENTITLED("not_entitled"),
+ @SerialName(value = "offline_build") OFFLINE_BUILD("offline_build"),
+ @SerialName(value = "unknown") UNKNOWN("unknown"),
+ @SerialName(value = "unknown_entitlements") UNKNOWN_ENTITLEMENTS("unknown_entitlements");
+ }
+ /**
+ * The reason why the cache artifact has been rejected: * `artifact_size_too_large` - The size of the artifact is larger than the remote build cache can accept. `null` if the goal is not cacheable, or if the attempt to store the artifact does not succeed.
+ *
+ * Values: ARTIFACT_SIZE_TOO_LARGE
+ */
+ @Serializable
+ enum class CacheArtifactRejectedReason(val value: kotlin.String) {
+ @SerialName(value = "artifact_size_too_large") ARTIFACT_SIZE_TOO_LARGE("artifact_size_too_large");
+ }
+}
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceGoalFingerprintingSummary.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceGoalFingerprintingSummary.kt
new file mode 100644
index 0000000..a636ad7
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildCachePerformanceGoalFingerprintingSummary.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A summary of goal fingerprinting. Fingerprinted goals are part of the `goalExecution.avoidedGoals` or `goalExecution.executedGoals` buckets.
+ *
+ * @param count Count of fingerprinted goals.
+ * @param serialDuration Sum of all fingerprinting times of fingerprinted goals in milliseconds.
+ */
+@Serializable
+
+data class MavenBuildCachePerformanceGoalFingerprintingSummary (
+
+ /* Count of fingerprinted goals. */
+ @SerialName(value = "count")
+ val count: kotlin.Int,
+
+ /* Sum of all fingerprinting times of fingerprinted goals in milliseconds. */
+ @SerialName(value = "serialDuration")
+ val serialDuration: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildOptions.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildOptions.kt
new file mode 100644
index 0000000..b8d0978
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenBuildOptions.kt
@@ -0,0 +1,112 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Maven build options for this build.
+ *
+ * @param errorsEnabled Indicates whether the build is configured to produce execution error messages. See https://maven.apache.org/ref/current/maven-embedder/cli.html#errors.
+ * @param maxNumberOfThreads Maximum number of threads used when executing the build. See https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3.
+ * @param nonRecursiveEnabled Indicates whether the build is configured to not recurse into sub-projects. See https://maven.apache.org/ref/current/maven-embedder/cli.html#non-recursive.
+ * @param noSnapshotsUpdatesEnabled Indicates whether the build is configured to suppress snapshot updates. See https://maven.apache.org/ref/current/maven-embedder/cli.html#no-snapshot-updates.
+ * @param offlineModeEnabled Indicates whether the build is configured to run offline. See https://maven.apache.org/ref/current/maven-embedder/cli.html#offline.
+ * @param updateSnapshotsEnabled Indicates whether the build is configured to force a check for missing releases and updated snapshots on remote repositories. See https://maven.apache.org/ref/current/maven-embedder/cli.html#update-snapshots.
+ * @param batchModeEnabled Indicates whether the build is configured to run in non-interactive (batch) mode. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#batch-mode.
+ * @param debugEnabled Indicates whether the build is configured to produce execution debug output. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#debug.
+ * @param failAtEndEnabled Indicates whether the build is configured to only fail at the end. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#fail-at-end.
+ * @param failFastEnabled Indicates whether the build is configured to fail at the first error. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#fail-fast.
+ * @param failNeverEnabled Indicates whether the build is configured to never fail, regardless of errors produced. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#fail-never.
+ * @param laxChecksumsEnabled Indicates whether the build is configured to only warn if checksums don't match. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#lax-checksums.
+ * @param rerunGoals **This property is deprecated, use `rerunGoalsEnabled` instead.** Indicates whether the build is configured to rerun goals without checking the build cache. `null` if Develocity Maven extension version is < `1.13`. See https://gradle.com/help/maven-extension-rerunning-goals.
+ * @param rerunGoalsEnabled Indicates whether the build is configured to rerun goals without checking the build cache. `null` if Develocity Maven extension version is < `1.13`. See https://gradle.com/help/maven-extension-rerunning-goals.
+ * @param quietEnabled Indicates whether the build is configured to run in quiet mode. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#quiet.
+ * @param strictChecksumsEnabled Indicates whether the build is configured to fail if checksums don't match. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#strict-checksums.
+ */
+@Serializable
+
+data class MavenBuildOptions (
+
+ /* Indicates whether the build is configured to produce execution error messages. See https://maven.apache.org/ref/current/maven-embedder/cli.html#errors. */
+ @SerialName(value = "errorsEnabled")
+ val errorsEnabled: kotlin.Boolean,
+
+ /* Maximum number of threads used when executing the build. See https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3. */
+ @SerialName(value = "maxNumberOfThreads")
+ val maxNumberOfThreads: kotlin.Int,
+
+ /* Indicates whether the build is configured to not recurse into sub-projects. See https://maven.apache.org/ref/current/maven-embedder/cli.html#non-recursive. */
+ @SerialName(value = "nonRecursiveEnabled")
+ val nonRecursiveEnabled: kotlin.Boolean,
+
+ /* Indicates whether the build is configured to suppress snapshot updates. See https://maven.apache.org/ref/current/maven-embedder/cli.html#no-snapshot-updates. */
+ @SerialName(value = "noSnapshotsUpdatesEnabled")
+ val noSnapshotsUpdatesEnabled: kotlin.Boolean,
+
+ /* Indicates whether the build is configured to run offline. See https://maven.apache.org/ref/current/maven-embedder/cli.html#offline. */
+ @SerialName(value = "offlineModeEnabled")
+ val offlineModeEnabled: kotlin.Boolean,
+
+ /* Indicates whether the build is configured to force a check for missing releases and updated snapshots on remote repositories. See https://maven.apache.org/ref/current/maven-embedder/cli.html#update-snapshots. */
+ @SerialName(value = "updateSnapshotsEnabled")
+ val updateSnapshotsEnabled: kotlin.Boolean,
+
+ /* Indicates whether the build is configured to run in non-interactive (batch) mode. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#batch-mode. */
+ @SerialName(value = "batchModeEnabled")
+ val batchModeEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the build is configured to produce execution debug output. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#debug. */
+ @SerialName(value = "debugEnabled")
+ val debugEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the build is configured to only fail at the end. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#fail-at-end. */
+ @SerialName(value = "failAtEndEnabled")
+ val failAtEndEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the build is configured to fail at the first error. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#fail-fast. */
+ @SerialName(value = "failFastEnabled")
+ val failFastEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the build is configured to never fail, regardless of errors produced. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#fail-never. */
+ @SerialName(value = "failNeverEnabled")
+ val failNeverEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the build is configured to only warn if checksums don't match. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#lax-checksums. */
+ @SerialName(value = "laxChecksumsEnabled")
+ val laxChecksumsEnabled: kotlin.Boolean? = null,
+
+ /* **This property is deprecated, use `rerunGoalsEnabled` instead.** Indicates whether the build is configured to rerun goals without checking the build cache. `null` if Develocity Maven extension version is < `1.13`. See https://gradle.com/help/maven-extension-rerunning-goals. */
+ @SerialName(value = "rerunGoals")
+ @Deprecated(message = "This property is deprecated.")
+ val rerunGoals: kotlin.Boolean? = null,
+
+ /* Indicates whether the build is configured to rerun goals without checking the build cache. `null` if Develocity Maven extension version is < `1.13`. See https://gradle.com/help/maven-extension-rerunning-goals. */
+ @SerialName(value = "rerunGoalsEnabled")
+ val rerunGoalsEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the build is configured to run in quiet mode. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#quiet. */
+ @SerialName(value = "quietEnabled")
+ val quietEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether the build is configured to fail if checksums don't match. `null` if capturing is not possible. See https://maven.apache.org/ref/current/maven-embedder/cli.html#strict-checksums. */
+ @SerialName(value = "strictChecksumsEnabled")
+ val strictChecksumsEnabled: kotlin.Boolean? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenDependencyResolution.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenDependencyResolution.kt
new file mode 100644
index 0000000..388a9b2
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenDependencyResolution.kt
@@ -0,0 +1,61 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about dependency resolution.
+ *
+ * @param serialDependencyResolutionTime The total cumulative time, in milliseconds, spent resolving dependencies. The process of resolving a dependency involves fetching metadata from remote repositories, determining the appropriate version to use, and ultimately fetching the dependency artifact.
+ * @param networkRequestCount This represents the total count of network requests made during configuration resolution.
+ * @param serialNetworkRequestTime The duration in milliseconds representing the sum of times for potentially parallel network requests. It does not reflect wall clock time but offers a rough estimation of network activity.
+ * @param wallClockNetworkRequestTime The estimate in milliseconds representing the wall clock time spent on network requests during the current build. It is calculated by comparing the critical path of project executions with and without network requests, converted to wall clock time.
+ * @param fileDownloadSize The total number of bytes downloaded for dependencies. It accounts only for the bytes of the files (e.g. POMs, JARs) downloaded and not the total network transfer.
+ * @param fileDownloadCount The total number of successfully downloaded files.
+ */
+@Serializable
+
+data class MavenDependencyResolution (
+
+ /* The total cumulative time, in milliseconds, spent resolving dependencies. The process of resolving a dependency involves fetching metadata from remote repositories, determining the appropriate version to use, and ultimately fetching the dependency artifact. */
+ @SerialName(value = "serialDependencyResolutionTime")
+ val serialDependencyResolutionTime: kotlin.Long,
+
+ /* This represents the total count of network requests made during configuration resolution. */
+ @SerialName(value = "networkRequestCount")
+ val networkRequestCount: kotlin.Long,
+
+ /* The duration in milliseconds representing the sum of times for potentially parallel network requests. It does not reflect wall clock time but offers a rough estimation of network activity. */
+ @SerialName(value = "serialNetworkRequestTime")
+ val serialNetworkRequestTime: kotlin.Long,
+
+ /* The estimate in milliseconds representing the wall clock time spent on network requests during the current build. It is calculated by comparing the critical path of project executions with and without network requests, converted to wall clock time. */
+ @SerialName(value = "wallClockNetworkRequestTime")
+ val wallClockNetworkRequestTime: kotlin.Long,
+
+ /* The total number of bytes downloaded for dependencies. It accounts only for the bytes of the files (e.g. POMs, JARs) downloaded and not the total network transfer. */
+ @SerialName(value = "fileDownloadSize")
+ val fileDownloadSize: kotlin.Long,
+
+ /* The total number of successfully downloaded files. */
+ @SerialName(value = "fileDownloadCount")
+ val fileDownloadCount: kotlin.Long
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenDevelocitySettings.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenDevelocitySettings.kt
new file mode 100644
index 0000000..b2d456d
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenDevelocitySettings.kt
@@ -0,0 +1,56 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Settings for Develocity.
+ *
+ * @param backgroundPublicationEnabled Indicates whether background Build Scan publication is enabled for the build. `null` if Develocity Maven extension version is < `1.6`. See https://gradle.com/help/maven-extension-configuring-background-uploading.
+ * @param buildOutputCapturingEnabled Indicates whether to capture build logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs.
+ * @param fileFingerprintCapturingEnabled Indicates whether file fingerprint capturing is enabled for the build. `null` if Develocity Maven extension version is < `1.1`. See https://docs.gradle.com/enterprise/maven-extension/current/#capturing_goal_input_files.
+ * @param goalInputsFileCapturingEnabled Indicates whether to capture goal input file snapshots for the build. `null` if Develocity Maven extension version is < `1.1`. See https://gradle.com/help/maven-extension-capturing-goal-input-files. **This property is deprecated, use `fileFingerprintCapturingEnabled` instead.**
+ * @param testOutputCapturingEnabled Indicates whether to capture test logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs.
+ */
+@Serializable
+
+data class MavenDevelocitySettings (
+
+ /* Indicates whether background Build Scan publication is enabled for the build. `null` if Develocity Maven extension version is < `1.6`. See https://gradle.com/help/maven-extension-configuring-background-uploading. */
+ @SerialName(value = "backgroundPublicationEnabled")
+ val backgroundPublicationEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether to capture build logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs. */
+ @SerialName(value = "buildOutputCapturingEnabled")
+ val buildOutputCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether file fingerprint capturing is enabled for the build. `null` if Develocity Maven extension version is < `1.1`. See https://docs.gradle.com/enterprise/maven-extension/current/#capturing_goal_input_files. */
+ @SerialName(value = "fileFingerprintCapturingEnabled")
+ val fileFingerprintCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether to capture goal input file snapshots for the build. `null` if Develocity Maven extension version is < `1.1`. See https://gradle.com/help/maven-extension-capturing-goal-input-files. **This property is deprecated, use `fileFingerprintCapturingEnabled` instead.** */
+ @SerialName(value = "goalInputsFileCapturingEnabled")
+ val goalInputsFileCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether to capture test logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs. */
+ @SerialName(value = "testOutputCapturingEnabled")
+ val testOutputCapturingEnabled: kotlin.Boolean? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenGradleEnterpriseSettings.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenGradleEnterpriseSettings.kt
new file mode 100644
index 0000000..17662ba
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenGradleEnterpriseSettings.kt
@@ -0,0 +1,52 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * **This property is deprecated, use `develocitySettings` instead.** Settings for Develocity.
+ *
+ * @param backgroundPublicationEnabled Indicates whether background Build Scan publication is enabled for the build. `null` if Develocity Maven extension version is < `1.6`. See https://gradle.com/help/maven-extension-configuring-background-uploading.
+ * @param buildOutputCapturingEnabled Indicates whether to capture build logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs.
+ * @param goalInputsFileCapturingEnabled Indicates whether to capture goal input file snapshots for the build. `null` if Develocity Maven extension version is < `1.1`. See https://gradle.com/help/maven-extension-capturing-goal-input-files.
+ * @param testOutputCapturingEnabled Indicates whether to capture test logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs.
+ */
+@Serializable
+@Deprecated(message = "This schema is deprecated.")
+
+data class MavenGradleEnterpriseSettings (
+
+ /* Indicates whether background Build Scan publication is enabled for the build. `null` if Develocity Maven extension version is < `1.6`. See https://gradle.com/help/maven-extension-configuring-background-uploading. */
+ @SerialName(value = "backgroundPublicationEnabled")
+ val backgroundPublicationEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether to capture build logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs. */
+ @SerialName(value = "buildOutputCapturingEnabled")
+ val buildOutputCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether to capture goal input file snapshots for the build. `null` if Develocity Maven extension version is < `1.1`. See https://gradle.com/help/maven-extension-capturing-goal-input-files. */
+ @SerialName(value = "goalInputsFileCapturingEnabled")
+ val goalInputsFileCapturingEnabled: kotlin.Boolean? = null,
+
+ /* Indicates whether to capture test logging output for the build. `null` if Develocity Maven extension version is < `1.11`. See https://gradle.com/help/maven-extension-capturing-build-and-test-outputs. */
+ @SerialName(value = "testOutputCapturingEnabled")
+ val testOutputCapturingEnabled: kotlin.Boolean? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenModule.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenModule.kt
new file mode 100644
index 0000000..7c066f5
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenModule.kt
@@ -0,0 +1,56 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Maven module.
+ *
+ * @param name The name of the module.
+ * @param groupId The group ID of the module.
+ * @param artifactId The artifact ID of the module.
+ * @param version The version of the module.
+ * @param parent The index of the parent of this Maven module in the MavenModules array. `null` if this module has no parent (i.e. top level project).
+ */
+@Serializable
+
+data class MavenModule (
+
+ /* The name of the module. */
+ @SerialName(value = "name")
+ val name: kotlin.String,
+
+ /* The group ID of the module. */
+ @SerialName(value = "groupId")
+ val groupId: kotlin.String,
+
+ /* The artifact ID of the module. */
+ @SerialName(value = "artifactId")
+ val artifactId: kotlin.String,
+
+ /* The version of the module. */
+ @SerialName(value = "version")
+ val version: kotlin.String,
+
+ /* The index of the parent of this Maven module in the MavenModules array. `null` if this module has no parent (i.e. top level project). */
+ @SerialName(value = "parent")
+ val parent: kotlin.Int? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenWorkUnit.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenWorkUnit.kt
new file mode 100644
index 0000000..802ebde
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/MavenWorkUnit.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Maven work unit.
+ *
+ * @param groupId The Maven groupId.
+ * @param artifactId The Maven artifactId.
+ * @param goalName The Maven goal name.
+ * @param executionId The execution id of the goal.
+ */
+@Serializable
+
+data class MavenWorkUnit (
+
+ /* The Maven groupId. */
+ @SerialName(value = "groupId")
+ val groupId: kotlin.String,
+
+ /* The Maven artifactId. */
+ @SerialName(value = "artifactId")
+ val artifactId: kotlin.String,
+
+ /* The Maven goal name. */
+ @SerialName(value = "goalName")
+ val goalName: kotlin.String,
+
+ /* The execution id of the goal. */
+ @SerialName(value = "executionId")
+ val executionId: kotlin.String
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/NodeConfiguration.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/NodeConfiguration.kt
new file mode 100644
index 0000000..d84c92f
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/NodeConfiguration.kt
@@ -0,0 +1,39 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Build Cache Node configuration description.
+ *
+ * @param enabled Indicates if the Build Cache Node is enabled.
+ * @param replication
+ */
+@Serializable
+
+data class NodeConfiguration (
+
+ /* Indicates if the Build Cache Node is enabled. */
+ @SerialName(value = "enabled")
+ val enabled: kotlin.Boolean,
+
+ @SerialName(value = "replication")
+ val replication: ReplicationConfiguration? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/PageMetadata.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/PageMetadata.kt
new file mode 100644
index 0000000..c5815a5
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/PageMetadata.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Information about the current and available page of elements. Pages are returned from list operations which could contain a lot of elements. One page contains a subset of the available elements. API users can retrieve all pages in order to retrieve all of the available elements.
+ *
+ * @param number The index of the current page. Page indexes start at zero.
+ * @param propertySize The number of elements in the current page.
+ * @param totalPages The total number of pages.
+ * @param totalElements The total number of elements across all pages.
+ */
+@Serializable
+
+data class PageMetadata (
+
+ /* The index of the current page. Page indexes start at zero. */
+ @SerialName(value = "number")
+ val number: kotlin.Int,
+
+ /* The number of elements in the current page. */
+ @SerialName(value = "size")
+ val propertySize: kotlin.Int,
+
+ /* The total number of pages. */
+ @SerialName(value = "totalPages")
+ val totalPages: kotlin.Int,
+
+ /* The total number of elements across all pages. */
+ @SerialName(value = "totalElements")
+ val totalElements: kotlin.Int
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/PageQuery.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/PageQuery.kt
new file mode 100644
index 0000000..eeb6ed9
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/PageQuery.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param pageNumber The index of the page to retrieve. The first page's index is zero.
+ * @param pageSize The maximum number of elements to include in the fetched page.
+ */
+@Serializable
+
+data class PageQuery (
+
+ /* The index of the page to retrieve. The first page's index is zero. */
+ @SerialName(value = "pageNumber")
+ val pageNumber: kotlin.Int? = 0,
+
+ /* The maximum number of elements to include in the fetched page. */
+ @SerialName(value = "pageSize")
+ val pageSize: kotlin.Int? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/Project.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/Project.kt
new file mode 100644
index 0000000..37302aa
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/Project.kt
@@ -0,0 +1,46 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A project.
+ *
+ * @param id The unique identifier for the project. Must not contain whitespace.
+ * @param displayName The label used when displaying the project.
+ * @param description The description of the project group.
+ */
+@Serializable
+
+data class Project (
+
+ /* The unique identifier for the project. Must not contain whitespace. */
+ @SerialName(value = "id")
+ val id: kotlin.String,
+
+ /* The label used when displaying the project. */
+ @SerialName(value = "displayName")
+ val displayName: kotlin.String? = null,
+
+ /* The description of the project group. */
+ @SerialName(value = "description")
+ val description: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectGroup.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectGroup.kt
new file mode 100644
index 0000000..903beaf
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectGroup.kt
@@ -0,0 +1,54 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A group of projects that can be assigned to users.
+ *
+ * @param id The unique identifier for the project group. Must not contain whitespace.
+ * @param displayName The label used when displaying the project group.
+ * @param description The description of the project group.
+ * @param identityProviderAttributeValue The value of an identity provider attribute this project group is associated with. Users who have this value in the identity provider attribute will be assigned this project group.
+ * @param projects
+ */
+@Serializable
+
+data class ProjectGroup (
+
+ /* The unique identifier for the project group. Must not contain whitespace. */
+ @SerialName(value = "id")
+ val id: kotlin.String,
+
+ /* The label used when displaying the project group. */
+ @SerialName(value = "displayName")
+ val displayName: kotlin.String? = null,
+
+ /* The description of the project group. */
+ @SerialName(value = "description")
+ val description: kotlin.String? = null,
+
+ /* The value of an identity provider attribute this project group is associated with. Users who have this value in the identity provider attribute will be assigned this project group. */
+ @SerialName(value = "identityProviderAttributeValue")
+ val identityProviderAttributeValue: kotlin.String? = null,
+
+ @SerialName(value = "projects")
+ val projects: kotlin.collections.List? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectGroupsPage.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectGroupsPage.kt
new file mode 100644
index 0000000..816d097
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectGroupsPage.kt
@@ -0,0 +1,39 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A paged list of project groups.
+ *
+ * @param content A list of project groups.
+ * @param page
+ */
+@Serializable
+
+data class ProjectGroupsPage (
+
+ /* A list of project groups. */
+ @SerialName(value = "content")
+ val content: kotlin.collections.List,
+
+ @SerialName(value = "page")
+ val page: PageMetadata
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectReference.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectReference.kt
new file mode 100644
index 0000000..eaaa928
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectReference.kt
@@ -0,0 +1,36 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A container for a project ID.
+ *
+ * @param id The unique identifier for the project. Must not contain whitespace.
+ */
+@Serializable
+
+data class ProjectReference (
+
+ /* The unique identifier for the project. Must not contain whitespace. */
+ @SerialName(value = "id")
+ val id: kotlin.String
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectsPage.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectsPage.kt
new file mode 100644
index 0000000..a8d0535
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ProjectsPage.kt
@@ -0,0 +1,39 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A paged list of projects.
+ *
+ * @param content A list of projects.
+ * @param page
+ */
+@Serializable
+
+data class ProjectsPage (
+
+ /* A list of projects. */
+ @SerialName(value = "content")
+ val content: kotlin.collections.List,
+
+ @SerialName(value = "page")
+ val page: PageMetadata
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/README.md b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/README.md
new file mode 100644
index 0000000..c9520bb
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/README.md
@@ -0,0 +1,7 @@
+# Develocity OpenAPI Models
+
+This module contains the OpenAPI model types for interacting with the Develocity service.
+These models are generated from the OpenAPI specification and should not be modified.
+
+See the project's [README](../../../../../../../../../../README.md) for more information
+on how to (re)generate these models.
\ No newline at end of file
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ReplicationConfiguration.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ReplicationConfiguration.kt
new file mode 100644
index 0000000..a7ce593
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/ReplicationConfiguration.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Cached data replication configuration description. May be `null` if replication is not configured.
+ *
+ * @param source The name of the Build Cache Node which is the source of data.
+ * @param preemptive Indicates if preemptive replication is enabled from the source.
+ */
+@Serializable
+
+data class ReplicationConfiguration (
+
+ /* The name of the Build Cache Node which is the source of data. */
+ @SerialName(value = "source")
+ val source: kotlin.String,
+
+ /* Indicates if preemptive replication is enabled from the source. */
+ @SerialName(value = "preemptive")
+ val preemptive: kotlin.Boolean
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestCasesQuery.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestCasesQuery.kt
new file mode 100644
index 0000000..7070be5
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestCasesQuery.kt
@@ -0,0 +1,56 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.Contextual
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param container Must be the fully qualified name of the test container to query. May not contain any wildcards.
+ * @param testOutcomes Allows restricting the search to tests that had at least one instance of the given outcome.
+ * @param query A query for filtering tests, written in the Develocity advanced search query language See: https://gradle.com/help/advanced-search
+ * @param limit The maximum number of test outcomes to query.
+ * @param include Controls which optional fields are included in the response.
+ */
+@Serializable
+
+data class TestCasesQuery (
+
+ /* Must be the fully qualified name of the test container to query. May not contain any wildcards. */
+ @SerialName(value = "container")
+ val container: kotlin.String,
+
+ /* Allows restricting the search to tests that had at least one instance of the given outcome. */
+ @SerialName(value = "testOutcomes")
+ val testOutcomes: kotlin.collections.List<@Contextual TestOutcome>,
+
+ /* A query for filtering tests, written in the Develocity advanced search query language See: https://gradle.com/help/advanced-search */
+ @SerialName(value = "query")
+ val query: kotlin.String,
+
+ /* The maximum number of test outcomes to query. */
+ @SerialName(value = "limit")
+ val limit: kotlin.Int? = 100,
+
+ /* Controls which optional fields are included in the response. */
+ @SerialName(value = "include")
+ val include: kotlin.collections.List<@Contextual TestIncludeFields>? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestContainersQuery.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestContainersQuery.kt
new file mode 100644
index 0000000..e8fe46b
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestContainersQuery.kt
@@ -0,0 +1,51 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.Contextual
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * @param container Allows restricting the search to parts of the test container hierarchy. You can use wildcards to match a specific subpackage.
+ * @param testOutcomes Allows restricting the search to tests that had at least one instance of the given outcome.
+ * @param query A query for filtering tests, written in the Develocity advanced search query language See: https://gradle.com/help/advanced-search
+ * @param include Controls which optional fields are included in the response.
+ */
+@Serializable
+
+data class TestContainersQuery (
+
+ /* Allows restricting the search to parts of the test container hierarchy. You can use wildcards to match a specific subpackage. */
+ @SerialName(value = "container")
+ val container: kotlin.String = "*",
+
+ /* Allows restricting the search to tests that had at least one instance of the given outcome. */
+ @SerialName(value = "testOutcomes")
+ val testOutcomes: kotlin.collections.List<@Contextual TestOutcome>,
+
+ /* A query for filtering tests, written in the Develocity advanced search query language See: https://gradle.com/help/advanced-search */
+ @SerialName(value = "query")
+ val query: kotlin.String,
+
+ /* Controls which optional fields are included in the response. */
+ @SerialName(value = "include")
+ val include: kotlin.collections.List<@Contextual TestIncludeFields>? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolConfiguration.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolConfiguration.kt
new file mode 100644
index 0000000..603d761
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolConfiguration.kt
@@ -0,0 +1,63 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * An agent pool configuration.
+ *
+ * @param name The alias or display name of the agent pool.
+ * @param minimumSize
+ * @param maximumSize
+ * @param capabilities
+ * @param orderIndex The order in which the agent pool is considered for allocation. Lower values are considered first.
+ * @param restrictAccessToProjectGroups Controls whether this pool can be used by everyone, or only the assigned project groups. A `true` value implies that `projectGroupIds` is present and has at least one entry. Conversely, a `false` value implies that `projectGroupIds` is empty.
+ * @param projectGroupIds Controls which project groups can use this pool. If it is empty, then `restrictAccessToProjectGroups` must be `false`. Conversely, if it has values then `restrictAccessToProjectGroups` must be `true`.
+ */
+@Serializable
+
+data class TestDistributionAgentPoolConfiguration (
+
+ /* The alias or display name of the agent pool. */
+ @SerialName(value = "name")
+ val name: kotlin.String,
+
+ @SerialName(value = "minimumSize")
+ val minimumSize: kotlin.Int,
+
+ @SerialName(value = "maximumSize")
+ val maximumSize: kotlin.Int,
+
+ @SerialName(value = "capabilities")
+ val capabilities: kotlin.collections.List,
+
+ /* The order in which the agent pool is considered for allocation. Lower values are considered first. */
+ @SerialName(value = "orderIndex")
+ val orderIndex: kotlin.Int? = null,
+
+ /* Controls whether this pool can be used by everyone, or only the assigned project groups. A `true` value implies that `projectGroupIds` is present and has at least one entry. Conversely, a `false` value implies that `projectGroupIds` is empty. */
+ @SerialName(value = "restrictAccessToProjectGroups")
+ val restrictAccessToProjectGroups: kotlin.Boolean? = false,
+
+ /* Controls which project groups can use this pool. If it is empty, then `restrictAccessToProjectGroups` must be `false`. Conversely, if it has values then `restrictAccessToProjectGroups` must be `true`. */
+ @SerialName(value = "projectGroupIds")
+ val projectGroupIds: kotlin.collections.List? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolConfigurationWithId.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolConfigurationWithId.kt
new file mode 100644
index 0000000..85912ad
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolConfigurationWithId.kt
@@ -0,0 +1,68 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * An agent pool configuration.
+ *
+ * @param id The unique identifier of the agent pool.
+ * @param name The alias or display name of the agent pool.
+ * @param minimumSize
+ * @param maximumSize
+ * @param orderIndex The order in which the agent pool is considered for allocation. Lower values are considered first.
+ * @param capabilities
+ * @param restrictAccessToProjectGroups Controls whether this pool can be used by everyone, or only the assigned project groups. A `true` value implies that `projectGroupIds` is present and has at least one entry. Conversely, a `false` value implies that `projectGroupIds` is empty.
+ * @param projectGroupIds Controls which project groups can use this pool. If it is empty, then `restrictAccessToProjectGroups` must be `false`. Conversely, if it has values then `restrictAccessToProjectGroups` must be `true`.
+ */
+@Serializable
+
+data class TestDistributionAgentPoolConfigurationWithId (
+
+ /* The unique identifier of the agent pool. */
+ @SerialName(value = "id")
+ val id: kotlin.String,
+
+ /* The alias or display name of the agent pool. */
+ @SerialName(value = "name")
+ val name: kotlin.String,
+
+ @SerialName(value = "minimumSize")
+ val minimumSize: kotlin.Int,
+
+ @SerialName(value = "maximumSize")
+ val maximumSize: kotlin.Int,
+
+ /* The order in which the agent pool is considered for allocation. Lower values are considered first. */
+ @SerialName(value = "orderIndex")
+ val orderIndex: kotlin.Int,
+
+ @SerialName(value = "capabilities")
+ val capabilities: kotlin.collections.List,
+
+ /* Controls whether this pool can be used by everyone, or only the assigned project groups. A `true` value implies that `projectGroupIds` is present and has at least one entry. Conversely, a `false` value implies that `projectGroupIds` is empty. */
+ @SerialName(value = "restrictAccessToProjectGroups")
+ val restrictAccessToProjectGroups: kotlin.Boolean? = false,
+
+ /* Controls which project groups can use this pool. If it is empty, then `restrictAccessToProjectGroups` must be `false`. Conversely, if it has values then `restrictAccessToProjectGroups` must be `true`. */
+ @SerialName(value = "projectGroupIds")
+ val projectGroupIds: kotlin.collections.List? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolPage.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolPage.kt
new file mode 100644
index 0000000..e40050b
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolPage.kt
@@ -0,0 +1,35 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A list of agent pools.
+ *
+ * @param content A list of agent pool IDs.
+ */
+@Serializable
+
+data class TestDistributionAgentPoolPage (
+
+ /* A list of agent pool IDs. */
+ @SerialName(value = "content")
+ val content: kotlin.collections.List
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKey.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKey.kt
new file mode 100644
index 0000000..02970da
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKey.kt
@@ -0,0 +1,41 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Test Distribution pool-specific agent registration key.
+ *
+ * @param key The agent API key.
+ * @param description Description of the registration key to help identify it later.
+ */
+@Serializable
+
+data class TestDistributionAgentPoolRegistrationKey (
+
+ /* The agent API key. */
+ @SerialName(value = "key")
+ val key: kotlin.String,
+
+ /* Description of the registration key to help identify it later. */
+ @SerialName(value = "description")
+ val description: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKeyDescription.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKeyDescription.kt
new file mode 100644
index 0000000..028fb0e
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKeyDescription.kt
@@ -0,0 +1,36 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Optional description of a Test Distribution pool-specific agent registration key.
+ *
+ * @param description Description of the registration key to help identify it later.
+ */
+@Serializable
+
+data class TestDistributionAgentPoolRegistrationKeyDescription (
+
+ /* Description of the registration key to help identify it later. */
+ @SerialName(value = "description")
+ val description: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKeyPrefix.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKeyPrefix.kt
new file mode 100644
index 0000000..c703aa4
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKeyPrefix.kt
@@ -0,0 +1,61 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A Test Distribution pool-specific agent registration key prefix.
+ *
+ * @param keyPrefix The registration key prefix.
+ * @param createdAt When the key was created
+ * @param description Description of the registration key to help identify it later.
+ * @param lastUsedAt When the key was last used
+ * @param lastUsedBy Who used the key last
+ * @param revokedAt When the key was revoked, a non-null value implies that the key is revoked and can no longer be used to authenticate.
+ */
+@Serializable
+
+data class TestDistributionAgentPoolRegistrationKeyPrefix (
+
+ /* The registration key prefix. */
+ @SerialName(value = "keyPrefix")
+ val keyPrefix: kotlin.String,
+
+ /* When the key was created */
+ @SerialName(value = "createdAt")
+ val createdAt: kotlin.String,
+
+ /* Description of the registration key to help identify it later. */
+ @SerialName(value = "description")
+ val description: kotlin.String? = null,
+
+ /* When the key was last used */
+ @SerialName(value = "lastUsedAt")
+ val lastUsedAt: kotlin.String? = null,
+
+ /* Who used the key last */
+ @SerialName(value = "lastUsedBy")
+ val lastUsedBy: kotlin.String? = null,
+
+ /* When the key was revoked, a non-null value implies that the key is revoked and can no longer be used to authenticate. */
+ @SerialName(value = "revokedAt")
+ val revokedAt: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKeyPrefixPage.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKeyPrefixPage.kt
new file mode 100644
index 0000000..7868102
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolRegistrationKeyPrefixPage.kt
@@ -0,0 +1,34 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A list of Test Distribution pool-specific agent registration key prefixes.
+ *
+ * @param content
+ */
+@Serializable
+
+data class TestDistributionAgentPoolRegistrationKeyPrefixPage (
+
+ @SerialName(value = "content")
+ val content: kotlin.collections.List
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolStatus.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolStatus.kt
new file mode 100644
index 0000000..26a033f
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionAgentPoolStatus.kt
@@ -0,0 +1,61 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * The status of an agent pool.
+ *
+ * @param id The unique identifier of the agent pool.
+ * @param name The alias or display name of the agent pool.
+ * @param minimumSize
+ * @param maximumSize
+ * @param connectedAgents
+ * @param idleAgents
+ * @param desiredAgents
+ */
+@Serializable
+
+data class TestDistributionAgentPoolStatus (
+
+ /* The unique identifier of the agent pool. */
+ @SerialName(value = "id")
+ val id: kotlin.String,
+
+ /* The alias or display name of the agent pool. */
+ @SerialName(value = "name")
+ val name: kotlin.String,
+
+ @SerialName(value = "minimumSize")
+ val minimumSize: kotlin.Int,
+
+ @SerialName(value = "maximumSize")
+ val maximumSize: kotlin.Int,
+
+ @SerialName(value = "connectedAgents")
+ val connectedAgents: kotlin.Int,
+
+ @SerialName(value = "idleAgents")
+ val idleAgents: kotlin.Int,
+
+ @SerialName(value = "desiredAgents")
+ val desiredAgents: kotlin.Int
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKey.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKey.kt
new file mode 100644
index 0000000..227310f
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKey.kt
@@ -0,0 +1,42 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * **This class is deprecated. Migrate to pool-specific agent registration keys instead.** A Test Distribution agent API key.
+ *
+ * @param key The agent API key.
+ * @param description Description of the API key, such as the agent pool where it will be used, to help identify it later.
+ */
+@Serializable
+@Deprecated(message = "This schema is deprecated.")
+
+data class TestDistributionApiKey (
+
+ /* The agent API key. */
+ @SerialName(value = "key")
+ val key: kotlin.String,
+
+ /* Description of the API key, such as the agent pool where it will be used, to help identify it later. */
+ @SerialName(value = "description")
+ val description: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKeyDescription.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKeyDescription.kt
new file mode 100644
index 0000000..516dce5
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKeyDescription.kt
@@ -0,0 +1,37 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * **This class is deprecated. Migrate to pool-specific agent registration keys instead.** Optional description of a Test Distribution agent API key.
+ *
+ * @param description Description of the API key, such as the agent pool where it will be used, to help identify it later.
+ */
+@Serializable
+@Deprecated(message = "This schema is deprecated.")
+
+data class TestDistributionApiKeyDescription (
+
+ /* Description of the API key, such as the agent pool where it will be used, to help identify it later. */
+ @SerialName(value = "description")
+ val description: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKeyPrefix.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKeyPrefix.kt
new file mode 100644
index 0000000..8a71f77
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKeyPrefix.kt
@@ -0,0 +1,58 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * **This class is deprecated. Migrate to pool-specific agent registration keys instead.** A Test Distribution agent API key prefix.
+ *
+ * @param keyPrefix The agent API key.
+ * @param generatedAt
+ * @param description Description of the API key, such as the agent pool where it will be used, to help identify it later.
+ * @param lastUsedAt
+ * @param lastUsedBy
+ * @param revokedAt
+ */
+@Serializable
+@Deprecated(message = "This schema is deprecated.")
+
+data class TestDistributionApiKeyPrefix (
+
+ /* The agent API key. */
+ @SerialName(value = "keyPrefix")
+ val keyPrefix: kotlin.String,
+
+ @SerialName(value = "generatedAt")
+ val generatedAt: kotlin.String,
+
+ /* Description of the API key, such as the agent pool where it will be used, to help identify it later. */
+ @SerialName(value = "description")
+ val description: kotlin.String? = null,
+
+ @SerialName(value = "lastUsedAt")
+ val lastUsedAt: kotlin.String? = null,
+
+ @SerialName(value = "lastUsedBy")
+ val lastUsedBy: kotlin.String? = null,
+
+ @SerialName(value = "revokedAt")
+ val revokedAt: kotlin.String? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKeyPrefixPage.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKeyPrefixPage.kt
new file mode 100644
index 0000000..628c8cf
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestDistributionApiKeyPrefixPage.kt
@@ -0,0 +1,35 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport", "DEPRECATION"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * **This class is deprecated. Migrate to pool-specific agent registration keys instead.** A list of Test Distribution agent API key prefixes.
+ *
+ * @param content
+ */
+@Serializable
+@Deprecated(message = "This schema is deprecated.")
+
+data class TestDistributionApiKeyPrefixPage (
+
+ @SerialName(value = "content")
+ val content: kotlin.collections.List
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestIncludeFields.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestIncludeFields.kt
new file mode 100644
index 0000000..7d75238
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestIncludeFields.kt
@@ -0,0 +1,62 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * Values: BUILD_SCAN_IDS,WORK_UNITS
+ */
+@Serializable
+enum class TestIncludeFields(val value: kotlin.String) {
+
+ @SerialName(value = "buildScanIds")
+ BUILD_SCAN_IDS("buildScanIds"),
+
+ @SerialName(value = "workUnits")
+ WORK_UNITS("workUnits");
+
+ /**
+ * Override [toString()] to avoid using the enum variable name as the value, and instead use
+ * the actual value defined in the API spec file.
+ *
+ * This solves a problem when the variable name and its value are different, and ensures that
+ * the client sends the correct enum values to the server always.
+ */
+ override fun toString(): kotlin.String = value
+
+ companion object {
+ /**
+ * Converts the provided [data] to a [String] on success, null otherwise.
+ */
+ fun encode(data: kotlin.Any?): kotlin.String? = if (data is TestIncludeFields) "$data" else null
+
+ /**
+ * Returns a valid [TestIncludeFields] for [data], null otherwise.
+ */
+ fun decode(data: kotlin.Any?): TestIncludeFields? = data?.let {
+ val normalizedData = "$it".lowercase()
+ values().firstOrNull { value ->
+ it == value || normalizedData == "$value".lowercase()
+ }
+ }
+ }
+}
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestOrContainer.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestOrContainer.kt
new file mode 100644
index 0000000..4d1967c
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestOrContainer.kt
@@ -0,0 +1,47 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A test or test container.
+ *
+ * @param name The name of the test or test container.
+ * @param outcomeDistribution
+ * @param workUnits
+ * @param buildScanIdsByOutcome
+ */
+@Serializable
+
+data class TestOrContainer (
+
+ /* The name of the test or test container. */
+ @SerialName(value = "name")
+ val name: kotlin.String,
+
+ @SerialName(value = "outcomeDistribution")
+ val outcomeDistribution: TestOutcomeDistribution,
+
+ @SerialName(value = "workUnits")
+ val workUnits: kotlin.collections.List? = null,
+
+ @SerialName(value = "buildScanIdsByOutcome")
+ val buildScanIdsByOutcome: BuildScanIdsByOutcome? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestOutcome.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestOutcome.kt
new file mode 100644
index 0000000..92f5c1b
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestOutcome.kt
@@ -0,0 +1,71 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ *
+ *
+ * Values: PASSED,FAILED,SKIPPED,FLAKY,NOT_SELECTED
+ */
+@Serializable
+enum class TestOutcome(val value: kotlin.String) {
+
+ @SerialName(value = "passed")
+ PASSED("passed"),
+
+ @SerialName(value = "failed")
+ FAILED("failed"),
+
+ @SerialName(value = "skipped")
+ SKIPPED("skipped"),
+
+ @SerialName(value = "flaky")
+ FLAKY("flaky"),
+
+ @SerialName(value = "notSelected")
+ NOT_SELECTED("notSelected");
+
+ /**
+ * Override [toString()] to avoid using the enum variable name as the value, and instead use
+ * the actual value defined in the API spec file.
+ *
+ * This solves a problem when the variable name and its value are different, and ensures that
+ * the client sends the correct enum values to the server always.
+ */
+ override fun toString(): kotlin.String = value
+
+ companion object {
+ /**
+ * Converts the provided [data] to a [String] on success, null otherwise.
+ */
+ fun encode(data: kotlin.Any?): kotlin.String? = if (data is TestOutcome) "$data" else null
+
+ /**
+ * Returns a valid [TestOutcome] for [data], null otherwise.
+ */
+ fun decode(data: kotlin.Any?): TestOutcome? = data?.let {
+ val normalizedData = "$it".lowercase()
+ values().firstOrNull { value ->
+ it == value || normalizedData == "$value".lowercase()
+ }
+ }
+ }
+}
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestOutcomeDistribution.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestOutcomeDistribution.kt
new file mode 100644
index 0000000..9653a20
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestOutcomeDistribution.kt
@@ -0,0 +1,61 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A distribution of outcomes.
+ *
+ * @param passed The number of 'Passed' outcomes.
+ * @param failed The number of 'Failed' outcomes.
+ * @param skipped The number of 'Skipped' outcomes.
+ * @param flaky The number of 'Flaky' outcomes.
+ * @param notSelected The number of 'Not Selected' outcomes.
+ * @param total The total number of outcomes.
+ */
+@Serializable
+
+data class TestOutcomeDistribution (
+
+ /* The number of 'Passed' outcomes. */
+ @SerialName(value = "passed")
+ val passed: kotlin.Int,
+
+ /* The number of 'Failed' outcomes. */
+ @SerialName(value = "failed")
+ val failed: kotlin.Int,
+
+ /* The number of 'Skipped' outcomes. */
+ @SerialName(value = "skipped")
+ val skipped: kotlin.Int,
+
+ /* The number of 'Flaky' outcomes. */
+ @SerialName(value = "flaky")
+ val flaky: kotlin.Int,
+
+ /* The number of 'Not Selected' outcomes. */
+ @SerialName(value = "notSelected")
+ val notSelected: kotlin.Int,
+
+ /* The total number of outcomes. */
+ @SerialName(value = "total")
+ val total: kotlin.Int
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestWorkUnit.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestWorkUnit.kt
new file mode 100644
index 0000000..e644aa4
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestWorkUnit.kt
@@ -0,0 +1,42 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * Contains a work unit. Only one of the properties is set, representing the build tool used for the build.
+ *
+ * @param bazel
+ * @param gradle
+ * @param maven
+ */
+@Serializable
+
+data class TestWorkUnit (
+
+ @SerialName(value = "bazel")
+ val bazel: BazelWorkUnit? = null,
+
+ @SerialName(value = "gradle")
+ val gradle: GradleWorkUnit? = null,
+
+ @SerialName(value = "maven")
+ val maven: MavenWorkUnit? = null
+
+)
+
diff --git a/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestsResponse.kt b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestsResponse.kt
new file mode 100644
index 0000000..320458e
--- /dev/null
+++ b/src/main/kotlin/com/ebay/plugins/metrics/develocity/service/model/TestsResponse.kt
@@ -0,0 +1,35 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package com.ebay.plugins.metrics.develocity.service.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * A list of test containers or test cases.
+ *
+ * @param content A list of test containers.
+ */
+@Serializable
+
+data class TestsResponse (
+
+ /* A list of test containers. */
+ @SerialName(value = "content")
+ val content: kotlin.collections.List
+
+)
+