From 5aacdca0635a01de9b48ab94a8ef33a93911c5c8 Mon Sep 17 00:00:00 2001 From: Adam Farley Date: Mon, 4 Sep 2023 15:53:57 +0100 Subject: [PATCH 1/5] Add weekly tests to ea pipelines (#802) This allows us to run unpublished builds with the weekly test set In the long run we should find a neater way to run ea specific-tagged-level build testing. Perhaps when all of Adoptium's builds are ea (and nightly/weekly becomes an unused concept), we could have a single test list for all builds. This seems a good solution in the short term though. Signed-off-by: Adam Farley --- pipelines/build/common/build_base_file.groovy | 2 +- pipelines/jobs/pipeline_job_template.groovy | 2 +- pipelines/jobs/weekly_release_pipeline_job_template.groovy | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pipelines/build/common/build_base_file.groovy b/pipelines/build/common/build_base_file.groovy index 78804c397..6cc175759 100644 --- a/pipelines/build/common/build_base_file.groovy +++ b/pipelines/build/common/build_base_file.groovy @@ -263,7 +263,7 @@ class Builder implements Serializable { */ if (configuration.containsKey('test') && configuration.get('test')) { def testJobType = 'nightly' - if (releaseType.equals('Weekly') || releaseType.equals('Release')) { + if (releaseType.startsWith('Weekly') || releaseType.equals('Release')) { testJobType = 'weekly' } if (isMap(configuration.test)) { diff --git a/pipelines/jobs/pipeline_job_template.groovy b/pipelines/jobs/pipeline_job_template.groovy index 26baf0f15..f4bdc0437 100644 --- a/pipelines/jobs/pipeline_job_template.groovy +++ b/pipelines/jobs/pipeline_job_template.groovy @@ -96,7 +96,7 @@ pipelineJob("${BUILD_FOLDER}/${JOB_NAME}") { stringParam('dockerExcludes', '', 'Map of targetConfigurations to exclude from docker building. If a targetConfiguration (i.e. { "x64LinuxXL": [ "openj9" ], "aarch64Linux": [ "hotspot", "openj9" ] }) has been entered into this field, jenkins will build the jdk without using docker. This param overrides the dockerImage and dockerFile downstream job parameters.') stringParam('baseFilePath', '', "Relative path to where the build_base_file.groovy file is located. This runs the downstream job setup and configuration retrieval services.
Default: ${defaultsJson['baseFileDirectories']['upstream']}") stringParam('buildConfigFilePath', '', "Relative path to where the jdkxx_pipeline_config.groovy file is located. It contains the build configurations for each platform, architecture and variant.
Default: ${defaultsJson['configDirectories']['build']}/jdkxx_pipeline_config.groovy") - choiceParam('releaseType', [jobReleaseType, 'Nightly', 'Nightly Without Publish', 'Weekly', 'Release'].unique(), 'Nightly - release a standard nightly build.
Nightly Without Publish - run a nightly but do not publish.
Weekly - release a standard weekly build, run with extended tests.
Release - this is a release, this will need to be manually promoted.') + choiceParam('releaseType', [jobReleaseType, 'Nightly', 'Nightly Without Publish', 'Weekly', 'Weekly Without Publish', 'Release'].unique(), 'Nightly - release a standard nightly build.
Nightly Without Publish - run a nightly but do not publish.
Weekly - release a standard weekly build, run with extended tests.
Weekly - run a weekly but do not publish.
Release - this is a release, this will need to be manually promoted.') stringParam('overridePublishName', '', 'REQUIRED for OpenJ9: Name that determines the publish name (and is used by the meta-data file), defaults to scmReference(minus _adopt if present).
Nightly builds: Leave blank (defaults to a date_time stamp).
OpenJ9 Release build Java 8 example jdk8u192-b12_openj9-0.12.1 and for OpenJ9 Java 11 example jdk-11.0.2+9_openj9-0.12.1.') stringParam('scmReference', '', 'Tag name or Branch name from which openjdk source code repo to build. Nightly builds: Defaults to, Hotspot=dev, OpenJ9=openj9, others=master.
Release builds: For hotspot JDK8 this would be the OpenJDK tag, for hotspot JDK11+ this would be the Adopt merge tag for the desired OpenJDK tag eg.jdk-11.0.4+10_adopt, and for OpenJ9 this will be the release branch, eg.openj9-0.14.0.') stringParam('buildReference', '', 'SHA1 or Tag name or Branch name of temurin-build repo. Defaults to master') diff --git a/pipelines/jobs/weekly_release_pipeline_job_template.groovy b/pipelines/jobs/weekly_release_pipeline_job_template.groovy index a981050e1..9e3aebf62 100644 --- a/pipelines/jobs/weekly_release_pipeline_job_template.groovy +++ b/pipelines/jobs/weekly_release_pipeline_job_template.groovy @@ -40,7 +40,7 @@ pipelineJob("${BUILD_FOLDER}/${JOB_NAME}") { parameters { stringParam('buildPipeline', "${BUILD_FOLDER}/${PIPELINE}", 'The build pipeline to invoke.') - choiceParam('releaseType', [pipelineReleaseType, 'Nightly', 'Nightly Without Publish', 'Weekly', 'Release'].unique(), 'Nightly - release a standard nightly build.
Nightly Without Publish - run a nightly but do not publish.
Weekly - release a standard weekly build, run with extended tests.
Release - this is a release, this will need to be manually promoted.') + choiceParam('releaseType', [pipelineReleaseType, 'Nightly', 'Nightly Without Publish', 'Weekly', 'Weekly Without Publish', 'Release'].unique(), 'Nightly - release a standard nightly build.
Nightly Without Publish - run a nightly but do not publish.
Weekly - release a standard weekly build, run with extended tests.
Weekly - run a weekly but do not publish.
Release - this is a release, this will need to be manually promoted.') textParam('scmReferences', JsonOutput.prettyPrint(JsonOutput.toJson(weekly_release_scmReferences)), 'The map of scmReferences for each variant.') textParam('targetConfigurations', JsonOutput.prettyPrint(JsonOutput.toJson(targetConfigurations)), 'The map of platforms and variants to build.') } From c569503d18ee53be48c7bc03916bbac8ad544b1a Mon Sep 17 00:00:00 2001 From: Adam Farley Date: Mon, 4 Sep 2023 21:11:54 +0100 Subject: [PATCH 2/5] Typo fix (#804) Signed-off-by: Adam Farley --- pipelines/jobs/pipeline_job_template.groovy | 2 +- pipelines/jobs/weekly_release_pipeline_job_template.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/jobs/pipeline_job_template.groovy b/pipelines/jobs/pipeline_job_template.groovy index f4bdc0437..cd705db1f 100644 --- a/pipelines/jobs/pipeline_job_template.groovy +++ b/pipelines/jobs/pipeline_job_template.groovy @@ -96,7 +96,7 @@ pipelineJob("${BUILD_FOLDER}/${JOB_NAME}") { stringParam('dockerExcludes', '', 'Map of targetConfigurations to exclude from docker building. If a targetConfiguration (i.e. { "x64LinuxXL": [ "openj9" ], "aarch64Linux": [ "hotspot", "openj9" ] }) has been entered into this field, jenkins will build the jdk without using docker. This param overrides the dockerImage and dockerFile downstream job parameters.') stringParam('baseFilePath', '', "Relative path to where the build_base_file.groovy file is located. This runs the downstream job setup and configuration retrieval services.
Default: ${defaultsJson['baseFileDirectories']['upstream']}") stringParam('buildConfigFilePath', '', "Relative path to where the jdkxx_pipeline_config.groovy file is located. It contains the build configurations for each platform, architecture and variant.
Default: ${defaultsJson['configDirectories']['build']}/jdkxx_pipeline_config.groovy") - choiceParam('releaseType', [jobReleaseType, 'Nightly', 'Nightly Without Publish', 'Weekly', 'Weekly Without Publish', 'Release'].unique(), 'Nightly - release a standard nightly build.
Nightly Without Publish - run a nightly but do not publish.
Weekly - release a standard weekly build, run with extended tests.
Weekly - run a weekly but do not publish.
Release - this is a release, this will need to be manually promoted.') + choiceParam('releaseType', [jobReleaseType, 'Nightly', 'Nightly Without Publish', 'Weekly', 'Weekly Without Publish', 'Release'].unique(), 'Nightly - release a standard nightly build.
Nightly Without Publish - run a nightly but do not publish.
Weekly - release a standard weekly build, run with extended tests.
Weekly Without Publish - run a weekly but do not publish.
Release - this is a release, this will need to be manually promoted.') stringParam('overridePublishName', '', 'REQUIRED for OpenJ9: Name that determines the publish name (and is used by the meta-data file), defaults to scmReference(minus _adopt if present).
Nightly builds: Leave blank (defaults to a date_time stamp).
OpenJ9 Release build Java 8 example jdk8u192-b12_openj9-0.12.1 and for OpenJ9 Java 11 example jdk-11.0.2+9_openj9-0.12.1.') stringParam('scmReference', '', 'Tag name or Branch name from which openjdk source code repo to build. Nightly builds: Defaults to, Hotspot=dev, OpenJ9=openj9, others=master.
Release builds: For hotspot JDK8 this would be the OpenJDK tag, for hotspot JDK11+ this would be the Adopt merge tag for the desired OpenJDK tag eg.jdk-11.0.4+10_adopt, and for OpenJ9 this will be the release branch, eg.openj9-0.14.0.') stringParam('buildReference', '', 'SHA1 or Tag name or Branch name of temurin-build repo. Defaults to master') diff --git a/pipelines/jobs/weekly_release_pipeline_job_template.groovy b/pipelines/jobs/weekly_release_pipeline_job_template.groovy index 9e3aebf62..1bae8bf56 100644 --- a/pipelines/jobs/weekly_release_pipeline_job_template.groovy +++ b/pipelines/jobs/weekly_release_pipeline_job_template.groovy @@ -40,7 +40,7 @@ pipelineJob("${BUILD_FOLDER}/${JOB_NAME}") { parameters { stringParam('buildPipeline', "${BUILD_FOLDER}/${PIPELINE}", 'The build pipeline to invoke.') - choiceParam('releaseType', [pipelineReleaseType, 'Nightly', 'Nightly Without Publish', 'Weekly', 'Weekly Without Publish', 'Release'].unique(), 'Nightly - release a standard nightly build.
Nightly Without Publish - run a nightly but do not publish.
Weekly - release a standard weekly build, run with extended tests.
Weekly - run a weekly but do not publish.
Release - this is a release, this will need to be manually promoted.') + choiceParam('releaseType', [pipelineReleaseType, 'Nightly', 'Nightly Without Publish', 'Weekly', 'Weekly Without Publish', 'Release'].unique(), 'Nightly - release a standard nightly build.
Nightly Without Publish - run a nightly but do not publish.
Weekly - release a standard weekly build, run with extended tests.
Weekly Without Publish - run a weekly but do not publish.
Release - this is a release, this will need to be manually promoted.') textParam('scmReferences', JsonOutput.prettyPrint(JsonOutput.toJson(weekly_release_scmReferences)), 'The map of scmReferences for each variant.') textParam('targetConfigurations', JsonOutput.prettyPrint(JsonOutput.toJson(targetConfigurations)), 'The map of platforms and variants to build.') } From 2aff3aa5cdf316d5b911dd344fc7ce123523390f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 09:11:46 +1200 Subject: [PATCH 3/5] build(deps): bump actions/checkout from 3.6.0 to 4.0.0 (#803) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.6.0 to 4.0.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/f43a0e5ff2bd294095638e18286ca9a3d1956744...3df4ab11eba7bda6032a0b82a6bb43b11571feac) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/linter.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index a56c11ea8..fd058e736 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -42,7 +42,7 @@ jobs: # Checkout the code base # ########################## - name: Checkout Code - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e104cd4f3..b8387ed8a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0 with: From ace721ac3700651a04a652cb56108d58ba98e118 Mon Sep 17 00:00:00 2001 From: Andrew Leonard <31470007+andrew-m-leonard@users.noreply.github.com> Date: Tue, 5 Sep 2023 10:56:35 +0100 Subject: [PATCH 4/5] Refactor daily status health check to handle triggered builds and verify published assets (#799) * Daily stats for triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard * Update daily status to support tag triggered builds Signed-off-by: Andrew Leonard --------- Signed-off-by: Andrew Leonard --- tools/nightly_build_and_test_stats.groovy | 419 ++++++++++++++++++---- 1 file changed, 350 insertions(+), 69 deletions(-) diff --git a/tools/nightly_build_and_test_stats.groovy b/tools/nightly_build_and_test_stats.groovy index 71d6bcc5d..5f73de596 100644 --- a/tools/nightly_build_and_test_stats.groovy +++ b/tools/nightly_build_and_test_stats.groovy @@ -19,17 +19,180 @@ import java.time.ZoneId import java.time.ZonedDateTime import java.time.temporal.ChronoUnit + +// Get the latest upstream openjdk build tag +def getLatestOpenjdkBuildTag(String version) { + def openjdkRepo = "https://github.com/openjdk/${version}.git" + + def latestTag = sh(returnStdout: true, script:"git ls-remote --sort=-v:refname --tags ${openjdkRepo} | grep -v '\\^{}' | tr -s '\\t ' ' ' | cut -d' ' -f2 | sed \"s,refs/tags/,,\" | sort -V -r | head -1 | tr -d '\\n'") + echo "latest upstream openjdk/${version} tag = ${latestTag}" + + return latestTag +} + +// Get the latest release tag from the binaries repo +def getLatestBinariesTag(String version) { + def binariesRepo = "https://github.com/${params.BINARIES_REPO}".replaceAll("_NN_", version) + + def latestTag = sh(returnStdout: true, script:"git ls-remote --sort=-v:refname --tags ${binariesRepo} | grep '\\-ea\\-beta' | grep -v '\\^{}' | tr -s '\\t ' ' ' | cut -d' ' -f2 | sed 's,refs/tags/,,' | sort -V -r | head -1 | tr -d '\\n'") + echo "latest jdk${version} binaries repo tag = ${latestTag}" + + return latestTag +} + +// Verify the given release contains all the expected assets +def verifyReleaseContent(String version, String release, String variant, Map status) { + echo "Verifying ${version} asserts in release: ${release}" + status['assets'] = "Error" + + def escRelease = release.replaceAll("\\+", "%2B") + def releaseAssetsUrl = "https://api.github.com/repos/${params.BINARIES_REPO}/releases/tags/${escRelease}".replaceAll("_NN_", version.replaceAll("u","").replaceAll("jdk","")) + + // Transform to browser URL for use in Slack message link + status['assetsUrl'] = releaseAssetsUrl.replaceAll("api.github.com","github.com").replaceAll("/repos/","/").replaceAll("/tags/","/") + + // Get list of assets, concatenate into a single string + def rc = sh(script: 'rm -f releaseAssets.json && curl -L -o releaseAssets.json '+releaseAssetsUrl, returnStatus: true) + def releaseAssets = "" + if (rc == 0) { + releaseAssets = sh(script: "cat releaseAssets.json | grep '\"name\"' | tr '\\n' '#'", returnStdout: true) + } + if (releaseAssets == "") { + echo "Error loading release assets list for ${releaseAssetsUrl}" + status['assets'] = "Error loading ${releaseAssetsUrl}" + } else { + def configFile = "${version}.groovy" + def targetConfigPath = "${params.BUILD_CONFIG_URL}/${configFile}" + echo " Loading pipeline config file: ${targetConfigPath}" + rc = sh(script: "curl -LO ${targetConfigPath}", returnStatus: true) + if (rc != 0) { + echo "Error loading ${targetConfigPath}" + status['assets'] = "Error loading ${targetConfigPath}" + } else { + // Load the targetConfiguration + targetConfigurations = null + load configFile + + // Map of config architecture to artifact name + def archToAsset = [x64Linux: "x64_linux", + x64Windows: "x64_windows", + x64Mac: "x64_mac", + x64AlpineLinux: "x64_alpine-linux", + ppc64Aix: "ppc64_aix", + ppc64leLinux: "ppc64le_linux", + s390xLinux: "s390x_linux", + aarch64Linux: "aarch64_linux", + aarch64Mac: "aarch64_mac", + arm32Linux: "arm_linux", + x32Windows: "x86-32_windows", + x64Solaris: "x64_solaris", + sparcv9Solaris: "sparcv9_solaris" + ] + + def missingAssets = [] + def foundAtLeastOneAsset = false + targetConfigurations.keySet().each { osarch -> + def variants = targetConfigurations[osarch] + if (!variants.contains(variant)) { + return // variant not built for this osarch + } + echo "Verifying : $osarch" + def foundAsset = false + def missingForArch = [] + + def imagetypes = ["debugimage", "jdk", "jre", "sbom"] + if (version != "jdk8u") { + imagetypes.add("static-libs") + imagetypes.add("testimage") + } + + // Work out the filetypes + def filetypes + def jdkjre_filetypes + if (osarch.contains("Windows")) { + filetypes = ["\\.zip", "\\.zip\\.json", "\\.zip\\.sha256\\.txt", "\\.zip\\.sig"] + jdkjre_filetypes = ["\\.msi", "\\.msi\\.json", "\\.msi\\.sha256\\.txt", "\\.msi\\.sig"] + jdkjre_filetypes.addAll(filetypes) + } else if (osarch.contains("Mac")) { + filetypes = ["\\.tar\\.gz", "\\.tar\\.gz\\.json", "\\.tar\\.gz\\.sha256\\.txt", "\\.tar\\.gz\\.sig"] + jdkjre_filetypes = ["\\.pkg", "\\.pkg\\.json", "\\.pkg\\.sha256\\.txt", "\\.pkg\\.sig"] + jdkjre_filetypes.addAll(filetypes) + } else { + filetypes = ["\\.tar\\.gz", "\\.tar\\.gz\\.json", "\\.tar\\.gz\\.sha256\\.txt", "\\.tar\\.gz\\.sig"] + jdkjre_filetypes = filetypes + } + def sbom_filetypes = ["\\.json", "\\.json\\.sig", "-metadata\\.json"] + + imagetypes.each { image -> + // Find the file type for this image + def ftypes + if (image == "jdk" || image == "jre") { + ftypes = jdkjre_filetypes + } else if (image == "sbom") { + ftypes = sbom_filetypes + } else { + ftypes = filetypes + } + + // If static-libs image then append -glibc or -musl accordingly + def file_image = image + if (image == "static-libs" && osarch.contains("Linux")) { + if (osarch.contains("Alpine")) { + file_image="${file_image}-musl" + } else { + file_image="${file_image}-glibc" + } + } + // Search for artifacts in the releaseAssets list + ftypes.each { ftype -> + def arch_fname = archToAsset[osarch] + def findAsset = releaseAssets =~/.*${file_image}_${arch_fname}_[^\."]*${ftype}".*/ + if (!findAsset) { + missingForArch.add("$osarch : $image : $ftype".replaceAll("\\\\", "")) + } else { + foundAsset = true + foundAtLeastOneAsset = true + } + } + } + if (!foundAsset) { + echo " $osarch : All artifacts missing" + missingAssets.add("$osarch : All : .All") + } else if (missingForArch.size() > 0) { + echo " $osarch : Missing artifacts: ${missingForArch}" + missingAssets.addAll(missingForArch) + } else { + echo " $osarch : Complete" + } + } + + // Set overall assets status for this release + if (missingAssets.size() > 0) { + if (foundAtLeastOneAsset) { + status['assets'] = "Missing artifacts" + } else { + status['assets'] = "Missing ALL artifacts" + } + status['missingAssets'] = missingAssets + } else { + status['assets'] = "Complete" + } + } + } +} + node('worker') { def variant = "${params.VARIANT}" def trssUrl = "${params.TRSS_URL}" def apiUrl = "${params.API_URL}" def slackChannel = "${params.SLACK_CHANNEL}" - def featureReleases = [ 8, 11, 17, 21 ] // Consider making those parameters + def featureReleases = "${params.FEATURE_RELEASES}".split("[, ]+") // feature versions + def tipRelease = "${params.TIP_RELEASE}".trim() // Current jdk(head) version, eg.jdk22 def nightlyStaleDays = "${params.MAX_NIGHTLY_STALE_DAYS}" def amberBuildAlertLevel = params.AMBER_BUILD_ALERT_LEVEL ? params.AMBER_BUILD_ALERT_LEVEL as Integer : -99 def amberTestAlertLevel = params.AMBER_TEST_ALERT_LEVEL ? params.AMBER_TEST_ALERT_LEVEL as Integer : -99 - def healthStatus = [ 'jdk8': null, 'jdk11': null, 'jdk17': null, 'jdk21': null ] + def healthStatus = [] def testStats = [] stage('getPipelineStatus') { @@ -39,20 +202,54 @@ node('worker') { } if (apiVariant == 'hotspot') { // hotspot only for now // Determine nightly pipeline health by looking at published assets. - // In particular, look at one data set for published binaries (Linux x64). + // In particular, look at first data set for latest published binaries. // If no published assets happened the last 4 days, the nightly pipeline // is considered unhealthy. - // TODO: account for disabled nightly pipelines + // For tag triggered versions (jdk-21+) check the binary is published + // The release asset list is also verified featureReleases.each { featureRelease -> - def assets = sh(returnStdout: true, script: "wget -q -O - '${apiUrl}/v3/assets/feature_releases/${featureRelease}/ea?image_type=jdk&os=linux&architecture=x64&sort_method=DATE&pages=1&jvm_impl=${apiVariant}'") - def assetsJson = new JsonSlurper().parseText(assets) - def ts = assetsJson[0].timestamp // newest timestamp of a jdk asset - def assetTs = Instant.parse(ts).atZone(ZoneId.of('UTC')) - def now = ZonedDateTime.now(ZoneId.of('UTC')) - def days = ChronoUnit.DAYS.between(assetTs, now) - def status = [maxStaleDays: nightlyStaleDays, actualDays: days] - def key = "jdk${featureRelease}" - healthStatus[key] = status + def featureReleaseInt = featureRelease.replaceAll("u", "").replaceAll("jdk", "").toInteger() + def assets = sh(returnStdout: true, script: "wget -q -O - '${apiUrl}/v3/assets/feature_releases/${featureReleaseInt}/ea?image_type=jdk&sort_method=DATE&pages=1&jvm_impl=${apiVariant}'") + def assetsJson = new JsonSlurper().parseText(assets) + + def foundNonEvaluationBinaries = false + def i=0 + while(!foundNonEvaluationBinaries && i < assetsJson.size()) { + def releaseName = assetsJson[i].release_name + def status = [] + if (featureReleaseInt < 21) { + def ts = assetsJson[i].timestamp // newest timestamp of a jdk asset + def assetTs = Instant.parse(ts).atZone(ZoneId.of('UTC')) + def now = ZonedDateTime.now(ZoneId.of('UTC')) + def days = ChronoUnit.DAYS.between(assetTs, now) + status = [releaseName: releaseName, maxStaleDays: nightlyStaleDays, actualDays: days] + } else { + def latestOpenjdkBuild = getLatestOpenjdkBuildTag(featureRelease) + status = [releaseName: releaseName, expectedReleaseName: "${latestOpenjdkBuild}-ea-beta"] + } + + // Verify the given release contains all the expected assets + verifyReleaseContent(featureRelease, releaseName, variant, status) + echo " ${featureRelease} release binaries verification: "+status['assets'] + if (status['assets'] == "Missing ALL artifacts") { + echo "Published ${releaseName} binaries has no non-evaluation artifacts, it must be an 'evaluation' build, skip to next.." + i += 1 + } else { + foundNonEvaluationBinaries = true + healthStatus[featureReleaseInt] = status + } + } + } + + // Check tip_release status, by querying binaries repo as API does not server the "tip" dev release + if (tipRelease != "") { + def latestOpenjdkBuild = getLatestOpenjdkBuildTag("jdk") + def tipVersion = tipRelease.replaceAll("u", "").replaceAll("jdk", "").toInteger() + def releaseName = getLatestBinariesTag("${tipVersion}") + status = [releaseName: releaseName, expectedReleaseName: "${latestOpenjdkBuild}-ea-beta"] + verifyReleaseContent(tipRelease, releaseName, variant, status) + echo " ${tipRelease} release binaries verification: "+status['assets'] + healthStatus[tipVersion] = status } } } @@ -64,30 +261,45 @@ node('worker') { def testVariant if (variant == 'temurin' || variant == 'hotspot') { //variant == "hotspot" should be enough for now. Keep temurin for later. testVariant = '_hs_' - } else if (variant == 'openj9') { + } else if (variant == 'openj9') { testVariant = '_j9_' - } else { + } else { testVariant = "_${variant}_" } + // Create list of build pipelines of interest based on the requests release versions + def pipelinesOfInterest = "" + def allReleases = [] + allReleases.addAll(featureReleases) + if (tipRelease != "") { + allReleases.add(tipRelease) + } + allReleases.each { release -> + def featureReleaseStr = release.replaceAll("u", "").replaceAll("jdk", "") + + // Only interested in nightly/triggered openjdkNN-pipeline's + pipelinesOfInterest += ",openjdk${featureReleaseStr}-pipeline" + } + // Get top level builds names def trssBuildNames = sh(returnStdout: true, script: "wget -q -O - ${trssUrl}/api/getTopLevelBuildNames?type=Test") def buildNamesJson = new JsonSlurper().parseText(trssBuildNames) buildNamesJson.each { build -> - // Is it a build Pipeline? Excluding "evaluation-" pipelines - if (build._id.buildName.contains('-pipeline') && !build._id.buildName.startsWith('evaluation-')) { + // Is it a build Pipeline? + if (build._id.buildName.contains('-pipeline')) { echo "Pipeline ${build._id.buildName}" def pipelineName = build._id.buildName - // Find the last "Done" pipeline builds started by "timer", as that is the last Nightly - // or upstream project "build-scripts/weekly-openjdkNN-pipeline" started in the last 7 days, as those are weekend weekly release jobs - def pipeline = sh(returnStdout: true, script: "wget -q -O - ${trssUrl}/api/getBuildHistory?buildName=${pipelineName}") - def pipelineJson = new JsonSlurper().parseText(pipeline) - def foundNightly = false - if (pipelineJson.size() > 0) { - // Find first in list started by timer(Nightly) or all upstream weekly jobs started in last 7 days + // Are we interested in this pipeline? + if (pipelinesOfInterest.contains(pipelineName)) { + // Find the last "Done" pipeline builds started by "timer", "weekly-" or "releaseTrigger" + def pipeline = sh(returnStdout: true, script: "wget -q -O - ${trssUrl}/api/getBuildHistory?buildName=${pipelineName}") + def pipelineJson = new JsonSlurper().parseText(pipeline) + def foundBuild = false + if (pipelineJson.size() > 0) { + // Find first in list started by "timer", "weekly-" or "releaseTrigger" pipelineJson.each { job -> - if (!foundNightly) { + if (!foundBuild) { def pipeline_id = null def pipelineUrl def buildJobComplete = 0 @@ -106,17 +318,25 @@ node('worker') { def now = LocalDateTime.now(ZoneId.of('UTC')) def days = ChronoUnit.DAYS.between(build_time, now) - // Was job "Done" and started less than 7 days ago? - if (job.status != null && job.status.equals('Done') && job.startBy != null && days < 7) { + // Was job "Done"? + // Report release- pipelines only if built within the last week + if (job.status != null && job.status.equals('Done') && job.startBy != null && + (!build._id.buildName.startsWith('release-') || days < 7)) { if (job.startBy.startsWith('timer')) { - // Nightly job + // Nightly scheduled job pipeline_id = job._id pipelineUrl = job.buildUrl - foundNightly = true - } else if (job.startBy.startsWith("upstream project \"build-scripts/weekly-${pipelineName}\"")) { - // Weekend weekly job + foundBuild = true + } else if (job.startBy.startsWith("upstream project \"build-scripts/weekly-")) { + // Weekend weekly scheduled job pipeline_id = job._id pipelineUrl = job.buildUrl + foundBuild = true + } else if (job.startBy.startsWith("upstream project \"build-scripts/utils/releaseTrigger_")) { + // Build tag triggered build + pipeline_id = job._id + pipelineUrl = job.buildUrl + foundBuild = true } } // Was job a "match"? @@ -129,9 +349,9 @@ node('worker') { pipelineTestJobsJson.each { testJob -> if (testJob.buildResult.equals('SUCCESS')) { testJobSuccess += 1 - } else if (testJob.buildResult.equals('UNSTABLE')) { + } else if (testJob.buildResult.equals('UNSTABLE')) { testJobUnstable += 1 - } else { + } else { testJobFailure += 1 } if (testJob.testSummary != null) { @@ -145,34 +365,33 @@ node('worker') { def pipelineBuildJobs = sh(returnStdout: true, script: "wget -q -O - ${trssUrl}/api/getChildBuilds?parentId=${pipeline_id}") def pipelineBuildJobsJson = new JsonSlurper().parseText(pipelineBuildJobs) buildJobNumber = 0 - if (pipelineBuildJobsJson.size() > 0) { - pipelineBuildJobsJson.each { buildJob -> + pipelineBuildJobsJson.each { buildJob -> if (buildJob.buildName.contains(buildVariant)) { buildJobNumber += 1 if (buildJob.buildResult.equals('FAILURE')) { buildJobFailure += 1 - } else { + } else { buildJobComplete += 1 } } - } } def testResult = [name: pipelineName, url: pipelineUrl, - buildJobNumber: buildJobNumber, - buildJobComplete: buildJobComplete, - buildJobFailure: buildJobFailure, - testJobSuccess: testJobSuccess, - testJobUnstable: testJobUnstable, - testJobFailure: testJobFailure, - testCasePassed: testCasePassed, - testCaseFailed: testCaseFailed, - testCaseDisabled: testCaseDisabled, - testJobNumber: testJobNumber] + buildJobNumber: buildJobNumber, + buildJobComplete: buildJobComplete, + buildJobFailure: buildJobFailure, + testJobSuccess: testJobSuccess, + testJobUnstable: testJobUnstable, + testJobFailure: testJobFailure, + testCasePassed: testCasePassed, + testCaseFailed: testCaseFailed, + testCaseDisabled: testCaseDisabled, + testJobNumber: testJobNumber] testStats.add(testResult) } } } + } } } } @@ -216,7 +435,7 @@ node('worker') { // Average test success rating across all pipelines if (numTestPipelines > 0) { nightlyTestSuccessRating = nightlyTestSuccessRating / numTestPipelines - } else { + } else { // If no Tests were run assume 0% success nightlyTestSuccessRating = 0 } @@ -226,7 +445,7 @@ node('worker') { def nightlyBuildSuccessRating = 0 if (totalBuildJobs > 0) { nightlyBuildSuccessRating = ((buildSuccesses) * 100) / (totalBuildJobs) - } else { + } else { // If no Builds were run assume 0% success nightlyBuildSuccessRating = 0 } @@ -234,12 +453,12 @@ node('worker') { // Overall % success rating: Average build & test % success rating def overallNightlySuccessRating = ((nightlyBuildSuccessRating + nightlyTestSuccessRating) / 2).intValue() - echo "======> Success Rating for variant: ${variant}" + echo "======> Latest pipeline build Success Rating for variant: ${variant}" echo "======> Total number of Build jobs = ${totalBuildJobs}" echo "======> Total number of Test jobs = ${totalTestJobs}" - echo "======> Nightly Build Success Rating = ${nightlyBuildSuccessRating.intValue()} %" - echo "======> Nightly Test Success Rating = ${nightlyTestSuccessRating.intValue()} %" - echo "======> Overall Nightly Build & Test Success Rating = ${overallNightlySuccessRating} %" + echo "======> Build Success Rating = ${nightlyBuildSuccessRating.intValue()} %" + echo "======> Test Success Rating = ${nightlyTestSuccessRating.intValue()} %" + echo "======> Overall Latest Build & Test Success Rating = ${overallNightlySuccessRating} %" def statusColor = 'good' if (nightlyBuildSuccessRating.intValue() < amberBuildAlertLevel || nightlyTestSuccessRating.intValue() < amberTestAlertLevel) { @@ -247,29 +466,91 @@ node('worker') { } // Slack message: - slackSend(channel: slackChannel, color: statusColor, message: 'Adoptium Nightly Build Success : *' + variant + '* => *' + overallNightlySuccessRating + '* %\n Build Job Rating: ' + totalBuildJobs + ' jobs (' + nightlyBuildSuccessRating.intValue() + '%) Test Job Rating: ' + totalTestJobs + ' jobs (' + nightlyTestSuccessRating.intValue() + '%) <' + BUILD_URL + '/console|Detail>') + slackSend(channel: slackChannel, color: statusColor, message: 'Adoptium Latest Builds Success : *' + variant + '* => *' + overallNightlySuccessRating + '* %\n Build Job Rating: ' + totalBuildJobs + ' jobs (' + nightlyBuildSuccessRating.intValue() + '%) Test Job Rating: ' + totalTestJobs + ' jobs (' + nightlyTestSuccessRating.intValue() + '%) <' + BUILD_URL + '/console|Detail>') + +echo 'Adoptium Latest Builds Success : *' + variant + '* => *' + overallNightlySuccessRating + '* %\n Build Job Rating: ' + totalBuildJobs + ' jobs (' + nightlyBuildSuccessRating.intValue() + '%) Test Job Rating: ' + totalTestJobs + ' jobs (' + nightlyTestSuccessRating.intValue() + '%) <' + BUILD_URL + '/console|Detail>' } stage('printPublishStats') { if (variant == 'temurin' || variant == 'hotspot') { //variant == "hotspot" should be enough for now. Keep temurin for later. - echo '-------------- Nightly pipeline health report ------------------' - featureReleases.each { featureRelease -> - def key = "jdk${featureRelease}" - def status = healthStatus[key] - def days = status['actualDays'] as int - def msg = "${days} day(s) ago" // might actually be days + N hours, where N < 24 - if (status['actualDays'] == 0) { - msg = 'less than 24 hours ago' - } - def maxDays = status['maxStaleDays'] as int - def fullMessage = "JDK ${featureRelease} nightly pipeline publish status: healthy. Last published: ${msg}" + echo '-------------- Latest pipeline health report ------------------' + def allReleases = [] + allReleases.addAll(featureReleases) + if (tipRelease != "") { + allReleases.add(tipRelease) + } + allReleases.each { featureRelease -> + def featureReleaseInt = featureRelease.replaceAll("u", "").replaceAll("jdk", "").toInteger() + def status = healthStatus[featureReleaseInt] + def slackColor = 'good' - if (maxDays <= days) { - slackColor = 'warning' - fullMessage = "JDK ${featureRelease} nightly pipeline publish status: unhealthy. Last published: ${msg}. Stale threshold: ${maxDays} days." + def health = "Healthy" + def errorMsg = "" + def releaseName = status['releaseName'] + def lastPublishedMsg = "" + + // jdk-21+ are latest tag triggered builds + if (featureReleaseInt < 21) { + // Check for stale published build + def days = status['actualDays'] as int + lastPublishedMsg = "\nPublished: ${days} day(s) ago." // might actually be days + N hours, where N < 24 + if (status['actualDays'] == 0) { + lastPublishedMsg = "\nPublished: less than 24 hours ago." + } + def maxDays = status['maxStaleDays'] as int + if (maxDays <= days) { + slackColor = 'warning' + health = "Unhealthy" + errorMsg = "\nStale threshold: ${maxDays} days." + } + } else { + // Check latest published binaries are for the latest openjdk build tag + if (status['releaseName'] != status['expectedReleaseName']) { + slackColor = 'danger' + health = "Unhealthy" + errorMsg = "\nLatest Adoptium publish binaries "+status['releaseName']+" != latest upstream openjdk build "+status['expectedReleaseName']+"." + } + } + + // Verify if any artifacts missing? + def missingAssets = [] + if (status['assets'] != 'Complete') { + slackColor = 'danger' + health = "Unhealthy" + errorMsg += "\nArtifact status: "+status['assets'] + missingAssets = status['missingAssets'] } + + // Print out formatted missing artifacts if any missing + def missingMsg = "" + if (missingAssets.size() > 0) { + missingMsg += " :" + // Collate by arch, array is sequenced by architecture + def archName = "" + def missingFiles = "" + missingAssets.each { missing -> + // arch : imageType : fileType + def missingFile = missing.split("[ :]+") + if (missingFile[0] != archName) { + if (archName != "") { + missingMsg += "\n *${archName}*: ${missingFiles}" + echo "===> ${missingMsg}" + } + archName = missingFile[0] + missingFiles = missingFile[1]+missingFile[2] + } else { + missingFiles += ", "+missingFile[1]+missingFile[2] + } + } + if (missingFiles != "") { + missingMsg += "\n *${archName}*: ${missingFiles}" + echo "===> ${missingMsg}" + } + } + + def releaseLink = "<" + status['assetsUrl'] + "|${releaseName}>" + def fullMessage = "${featureRelease} latest pipeline publish status: *${health}*. Build: ${releaseLink}.${lastPublishedMsg}${errorMsg}${missingMsg}" echo "===> ${fullMessage}" - // One slack message per JDK version: slackSend(channel: slackChannel, color: slackColor, message: fullMessage) } echo '----------------------------------------------------------------' From f1290cc4b7e6214c20a24cf3449026f201ec14af Mon Sep 17 00:00:00 2001 From: Andrew Leonard <31470007+andrew-m-leonard@users.noreply.github.com> Date: Tue, 5 Sep 2023 14:20:44 +0100 Subject: [PATCH 5/5] Ensure reproduce_comparison Compare stage cleans WS of sbom and other prepare stage artifacts (#806) Signed-off-by: Andrew Leonard --- tools/reproduce_comparison/Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/reproduce_comparison/Jenkinsfile b/tools/reproduce_comparison/Jenkinsfile index afb4b1019..f7a354bd1 100644 --- a/tools/reproduce_comparison/Jenkinsfile +++ b/tools/reproduce_comparison/Jenkinsfile @@ -108,6 +108,7 @@ pipeline { stage('Compare') { agent { label NODE_LABEL } steps { + cleanWs() // Ensure Prepare stage contents cleaned copyArtifacts filter: '**/OpenJDK*-jdk*.tar.gz,**/OpenJDK*-jdk*.zip', fingerprintArtifacts: true, projectName: env.JOB_NAME, @@ -176,4 +177,4 @@ pipeline { } } } -} \ No newline at end of file +}