Use a pipeline job for the Benchmark job This delete the last non-pipeline job and should fix the issue with parsing XML files on the benchmark job. Change-Id: Iabc8e252e45c6f994f2c69cb17e67a019a442983
diff --git a/docs/jobs.md b/docs/jobs.md index 9a1fa91..2f6cecd 100644 --- a/docs/jobs.md +++ b/docs/jobs.md
@@ -10,8 +10,6 @@ * `benchmark`: job running continously to produce benchmarks of Bazel published at [perf.bazel.build](https://perf.bazel.build). -* `maintenance/push-benchmark`: job running after `benchmark` to publish - the performance test to the website. * `maintenance/install-bazel`: job that install Bazel release on all the slaves. * `maintenance/gerrit-verifier`: job to detect pending reviews on Gerrit that need validation (that have been marked as `Presubmit-Ready`).
diff --git a/jenkins/jobs/BUILD b/jenkins/jobs/BUILD index 8bc06fc..0ce94b7 100644 --- a/jenkins/jobs/BUILD +++ b/jenkins/jobs/BUILD
@@ -12,7 +12,7 @@ jenkins_job( name = "benchmark", config = "benchmark.xml.tpl", - project_url = "http://bazel.io", + deps = [":benchmark.groovy"], ) [jenkins_job( @@ -24,12 +24,6 @@ ) for job in ["nightly", "presubmit", "release"]] jenkins_job( - name = "maintenance/push-benchmark", - config = "push-benchmark.xml.tpl", - project_url = "http://bazel.io", -) - -jenkins_job( name = "maintenance/install-bazel", config = "install-bazel.xml.tpl", deps = [":install-bazel.groovy"],
diff --git a/jenkins/jobs/benchmark.groovy b/jenkins/jobs/benchmark.groovy new file mode 100644 index 0000000..29ea027 --- /dev/null +++ b/jenkins/jobs/benchmark.groovy
@@ -0,0 +1,81 @@ +// Copyright (C) 2017 The Bazel 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 +// +// 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. + +// This is the one pipeline to rule them all +import build.bazel.ci.BazelUtils +import java.util.concurrent.TimeUnit + +def newChanges = false +def filename = "output/build_${currentBuild.getId()}.json" + +timeout(time: 20, unit: TimeUnit.HOURS) { + node("benchmark") { + stage("Clone") { + recursiveGit(repository: "https://bazel.googlesource.com/bazel", + branch: "master") + } + + // Build the benchmark binary + def utils = new BazelUtils() + utils.bazel = bazelPath("latest", "linux-x86_64") + utils.script = this + utils.writeRc() + stage("Building benchmark") { + utils.build(["//src/tools/benchmark/java/com/google/devtools/build/benchmark"]) + } + + // Run the benchmark + stage("Running benchmark") { + def workspace = pwd() + // Get only version from Bazel, not from the Jenkins lib. + // Unfortunately we do not have the origin information so we filter out + // commit by "nobody". + def versions = [] + for (def lst : currentBuild.getChangeSets()) { + for (def item : lst) { + if (!item.author.toString().equals("nobody")) { + versions <<= "--versions=${item.commitId}" + } + } + } + if (versions.isEmpty()) { + echo "No new changes, skipping" + } else { + newChanges = true + def args = [ + "bazel-bin/src/tools/benchmark/java/com/google/devtools/build/benchmark/benchmark", + "--workspace=${workspace}/benchmark_workspace", + "--output=${workspace}/${filename}"] + versions + dir("output") { writeFile file:"dummy", text: "" } + utils.commandWithBazelOnPath(args.join(" ")) + stash name:"benchmark-results", includes:filename + } + } + } +} + +stage("Deploying benchmark results") { + if (newChanges) { + node("deploy") { + // TODO(dmarting): since we are moving deployment of website we should + // also move the deployment of benchmark out of bazel. + recursiveGit(repository: "https://bazel.googlesource.com/bazel", + branch: "master") + unstash "benchmark-results" + sh """ +bash -c 'source scripts/ci/build.sh; push_benchmark_output_to_site ${filename} perf.bazel.build' +""" + } + } +}
diff --git a/jenkins/jobs/benchmark.xml.tpl b/jenkins/jobs/benchmark.xml.tpl index 4ab52e7..2d77ee6 100644 --- a/jenkins/jobs/benchmark.xml.tpl +++ b/jenkins/jobs/benchmark.xml.tpl
@@ -14,13 +14,15 @@ See the License for the specific language governing permissions and limitations under the License. --> -<project> +<flow-definition> <actions/> <description>Run Bazel benchmark for new changes</description> <keepDependencies>false</keepDependencies> <properties> + <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/> <com.coravy.hudson.plugins.github.GithubProjectProperty> - <projectUrl>{{ variables.GITHUB_URL }}</projectUrl> + <projectUrl>https://github.com/bazelbuild/bazel/</projectUrl> + <displayName></displayName> </com.coravy.hudson.plugins.github.GithubProjectProperty> <jenkins.model.BuildDiscarderProperty> <strategy class="hudson.tasks.LogRotator"> @@ -30,106 +32,19 @@ <artifactNumToKeep>-1</artifactNumToKeep> </strategy> </jenkins.model.BuildDiscarderProperty> + <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty> + <triggers> + {% if variables.production == "true" %} + <hudson.triggers.TimerTrigger> + <spec>@midnight</spec> + </hudson.triggers.TimerTrigger> + {% endif %} + </triggers> + </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty> </properties> - <scm class="hudson.plugins.git.GitSCM"> - <configVersion>2</configVersion> - <userRemoteConfigs> - <hudson.plugins.git.UserRemoteConfig> - <refspec>+refs/heads/*:refs/remotes/origin/* +refs/notes/*:refs/notes/*</refspec> - <url>{{ variables.GITHUB_URL }}</url> - </hudson.plugins.git.UserRemoteConfig> - </userRemoteConfigs> - <branches> - <hudson.plugins.git.BranchSpec> - <name>master</name> - </hudson.plugins.git.BranchSpec> - </branches> - <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations> - <submoduleCfg class="list"/> - <extensions> - <hudson.plugins.git.extensions.impl.CleanBeforeCheckout/> - <hudson.plugins.git.extensions.impl.AuthorInChangelog/> - </extensions> - </scm> - <quietPeriod>5</quietPeriod> - <assignedNode>benchmark</assignedNode> - <canRoam>false</canRoam> - <disabled>false</disabled> - <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding> - <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding> - <triggers> - <hudson.triggers.TimerTrigger> - <spec>H H * * *</spec> - </hudson.triggers.TimerTrigger> - </triggers> - <concurrentBuild>false</concurrentBuild> - <builders> - <hudson.tasks.Shell> - <command>#!/bin/bash -echo "Getting all the changes..." -curl "http://ci.bazel.io/view/Bazel%20bootstrap%20and%20maintenance/job/Bazel-Benchmark/$BUILD_NUMBER/api/xml?wrapper=changes&xpath=//changeSet//commitId" > change.log -sed change.log -i -e "s/<\/commitId>/\n/g; s/<commitId>//g; s/<changes>//g; s/<\/changes>//g" -if [ ! -s change.log ]; then - echo "No new changes. Exit." - exit 0 -fi - -# Add bazel to the PATH -PATH=$PATH:$HOME/.bazel/latest/bin - -# build benchmark -echo "Building benchmark..." -bazel build src/tools/benchmark/java/com/google/devtools/build/benchmark \ - --spawn_strategy=standalone --genrule_strategy=standalone - -# run benchmark -filename="build_$BUILD_NUMBER.json" -version_string="" -while read line -do - version_string+=" --versions=${line}" -done < change.log - -mkdir output -bazel-bin/src/tools/benchmark/java/com/google/devtools/build/benchmark/benchmark \ - --workspace=${WORKSPACE}/benchmark_workspace \ - --output=${WORKSPACE}/output/${filename} \ - ${version_string} - </command> - </hudson.tasks.Shell> - </builders> - <publishers> - <hudson.tasks.ArtifactArchiver> - <artifacts>output/*.json</artifacts> - <allowEmptyArchive>true</allowEmptyArchive> - <onlyIfSuccessful>false</onlyIfSuccessful> - <fingerprint>false</fingerprint> - <defaultExcludes>true</defaultExcludes> - </hudson.tasks.ArtifactArchiver> - <hudson.plugins.parameterizedtrigger.BuildTrigger> - <configs> - <hudson.plugins.parameterizedtrigger.BuildTriggerConfig> - <configs> - <hudson.plugins.parameterizedtrigger.CurrentBuildParameters/> - </configs> - <projects>maintenance/push-benchmark</projects> - <condition>UNSTABLE_OR_BETTER</condition> - <triggerWithNoParameters>false</triggerWithNoParameters> - </hudson.plugins.parameterizedtrigger.BuildTriggerConfig> - </configs> - </hudson.plugins.parameterizedtrigger.BuildTrigger> - </publishers> - <buildWrappers> - <hudson.plugins.build__timeout.BuildTimeoutWrapper> - <strategy class="hudson.plugins.build_timeout.impl.AbsoluteTimeOutStrategy"> - <timeoutMinutes>1200</timeoutMinutes> - </strategy> - <operationList> - <hudson.plugins.build__timeout.operations.FailOperation/> - <hudson.plugins.build__timeout.operations.WriteDescriptionOperation> - <description>Timed out</description> - </hudson.plugins.build__timeout.operations.WriteDescriptionOperation> - </operationList> - </hudson.plugins.build__timeout.BuildTimeoutWrapper> - </buildWrappers> -</project> + <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition"> + <script>{{ imports['//jenkins/jobs:benchmark.groovy'] }}</script> + <sandbox>true</sandbox> + </definition> + <triggers/> +</flow-definition>
diff --git a/jenkins/jobs/push-benchmark.xml.tpl b/jenkins/jobs/push-benchmark.xml.tpl deleted file mode 100644 index 62dbdd3..0000000 --- a/jenkins/jobs/push-benchmark.xml.tpl +++ /dev/null
@@ -1,99 +0,0 @@ -<?xml version='1.0' encoding='UTF-8'?> -<!-- - Copyright 2017 The Bazel Authors. All rights reserved. - - 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. ---> -<project> - <actions/> - <description>Push benchmark output to site</description> - <keepDependencies>false</keepDependencies> - <properties> - <com.coravy.hudson.plugins.github.GithubProjectProperty> - <projectUrl>{{ variables.GITHUB_URL }}</projectUrl> - </com.coravy.hudson.plugins.github.GithubProjectProperty> - <jenkins.model.BuildDiscarderProperty> - <strategy class="hudson.tasks.LogRotator"> - <daysToKeep>-1</daysToKeep> - <numToKeep>25</numToKeep> - <artifactDaysToKeep>-1</artifactDaysToKeep> - <artifactNumToKeep>-1</artifactNumToKeep> - </strategy> - </jenkins.model.BuildDiscarderProperty> - </properties> - <scm class="hudson.plugins.git.GitSCM"> - <configVersion>2</configVersion> - <userRemoteConfigs> - <hudson.plugins.git.UserRemoteConfig> - <refspec>+refs/heads/*:refs/remotes/origin/* +refs/notes/*:refs/notes/*</refspec> - <url>{{ variables.GITHUB_URL }}</url> - </hudson.plugins.git.UserRemoteConfig> - </userRemoteConfigs> - <branches> - <hudson.plugins.git.BranchSpec> - <name>origin/master</name> - </hudson.plugins.git.BranchSpec> - </branches> - <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations> - <submoduleCfg class="list"/> - <extensions> - <hudson.plugins.git.extensions.impl.CleanBeforeCheckout/> - <hudson.plugins.git.extensions.impl.AuthorInChangelog/> - </extensions> - </scm> - <quietPeriod>5</quietPeriod> - <assignedNode>deploy</assignedNode> - <canRoam>false</canRoam> - <disabled>false</disabled> - <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding> - <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding> - <triggers/> - <concurrentBuild>false</concurrentBuild> - <builders> - <hudson.plugins.copyartifact.CopyArtifact> - <project>Bazel-Benchmark</project> - <filter>output/*.json</filter> - <target>input</target> - <excludes/> - <selector class="hudson.plugins.copyartifact.TriggeredBuildSelector"> - <fallbackToLastSuccessful>true</fallbackToLastSuccessful> - <upstreamFilterStrategy>UseGlobalSetting</upstreamFilterStrategy> - </selector> - <flatten>true</flatten> - <doNotFingerprintArtifacts>false</doNotFingerprintArtifacts> - </hudson.plugins.copyartifact.CopyArtifact> - <hudson.tasks.Shell> - <command>#!/bin/bash -source scripts/ci/build.sh - -for i in $(find input -name "*.json"); do - push_benchmark_output_to_site "$i" "perf.bazel.build" -done - </command> - </hudson.tasks.Shell> - </builders> - <publishers/> - <buildWrappers> - <hudson.plugins.build__timeout.BuildTimeoutWrapper> - <strategy class="hudson.plugins.build_timeout.impl.AbsoluteTimeOutStrategy"> - <timeoutMinutes>480</timeoutMinutes> - </strategy> - <operationList> - <hudson.plugins.build__timeout.operations.FailOperation/> - <hudson.plugins.build__timeout.operations.WriteDescriptionOperation> - <description>Timed out</description> - </hudson.plugins.build__timeout.operations.WriteDescriptionOperation> - </operationList> - </hudson.plugins.build__timeout.BuildTimeoutWrapper> - </buildWrappers> -</project>
diff --git a/jenkins/lib/src/build/bazel/ci/BazelUtils.groovy b/jenkins/lib/src/build/bazel/ci/BazelUtils.groovy index dd02b4b..4e03f5f 100644 --- a/jenkins/lib/src/build/bazel/ci/BazelUtils.groovy +++ b/jenkins/lib/src/build/bazel/ci/BazelUtils.groovy
@@ -75,6 +75,17 @@ } } + // Execute a shell/batch command with bazel as a command on the path + def commandWithBazelOnPath(script) { + this.script.withEnv(["PATH=${new File(this.bazel).parent}:${this.script.env.PATH}", + "BAZEL=${this.bazel}"] + envs) { + if (isWindows) { + this.script.bat script + } else { + this.script.sh "#!/bin/sh -x\n${script}" + } + } + } // Write a RC file to consume by the other step def writeRc(build_opts = [],
diff --git a/jenkins/lib/vars/bazelJob.groovy b/jenkins/lib/vars/bazelJob.groovy index e1541c1..ed24bcd 100644 --- a/jenkins/lib/vars/bazelJob.groovy +++ b/jenkins/lib/vars/bazelJob.groovy
@@ -52,14 +52,7 @@ if(!config.configuration.isEmpty()) { stage("${stage_prefix}Configuration") { - withEnv(["PATH=${new File(config.binary).parent}:${env.PATH}", - "BAZEL=${config.binary}"]) { - if (isUnix()) { - sh "#!/bin/sh -x\n${config.configuration.join('\n')}" - } else { - bat config.configuration.join('\n') - } - } + utils.commandWithBazelOnPath(config.configuration.join("\n")) } }