Merge "Merge branch 'stable-2.16' into stable-3.0" into stable-3.0
diff --git a/Jenkinsfile b/Jenkinsfile
index 1d439e5..565dd45 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -1,262 +1 @@
-#!/usr/bin/env groovy
-
-// Copyright (C) 2019 The Android Open Source Project
-//
-// 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.
-
-import groovy.json.JsonSlurper
-import groovy.json.JsonOutput
-
-class Globals {
- static final String gerritUrl = "https://gerrit-review.googlesource.com/"
- static final String gerritCredentialsId = "gerrit-review.googlesource.com"
- static final long curlTimeout = 10000
- static final int waitForResultTimeout = 10000
- static final String gerritRepositoryNameSha1Suffix = "-a6a0e4682515f3521897c5f950d1394f4619d928"
-}
-
-class Build {
- String url
- String result
-
- Build(url, result) {
- this.url = url
- this.result = result
- }
-}
-
-class Builds {
- static Set<String> modes = []
- static Build codeStyle = null
- static Map verification = [:]
-}
-
-class GerritCheck {
- String uuid
- Build build
- String consoleUrl
-
- GerritCheck(name, build) {
- this.uuid = "gerritforge:" + name.replaceAll("(bazel/)", "") +
- Globals.gerritRepositoryNameSha1Suffix
- this.build = build
- this.consoleUrl = "${build.url}console"
- }
-
- def getCheckResultFromBuild() {
- if (!build.getResult()) {
- return "RUNNING"
- }
- def resultString = build.getResult().toString()
- if (resultString == 'SUCCESS') {
- return "SUCCESSFUL"
- } else if (resultString == 'NOT_BUILT' || resultString == 'ABORTED') {
- return "NOT_STARTED"
- }
-
- // Remaining options: 'FAILURE' or 'UNSTABLE':
- return "FAILED"
- }
-}
-
-def hasChangeNumber() {
- env.GERRIT_CHANGE_NUMBER?.trim()
-}
-
-def postCheck(check) {
- gerritCheck(checks: [ "${check.uuid}" : "${check.getCheckResultFromBuild()}" ], url: "${check.consoleUrl}")
-}
-
-def queryChangedFiles(url) {
- def queryUrl = "${url}changes/${env.GERRIT_CHANGE_NUMBER}/revisions/${env.GERRIT_PATCHSET_REVISION}/files/"
- def response = httpRequest queryUrl
- def files = response.getContent().substring(5)
- def filesJson = new JsonSlurper().parseText(files)
- return filesJson.keySet().findAll { it != "/COMMIT_MSG" }
-}
-
-def collectBuildModes() {
- Builds.modes = ["notedb"]
- def changedFiles = queryChangedFiles(Globals.gerritUrl)
- def isMerge = changedFiles.contains("/MERGE_LIST")
- def polygerritFiles = changedFiles.findAll { it.startsWith("polygerrit-ui") ||
- it.startsWith("lib/js") }
- def bazelFiles = changedFiles.findAll { it == "WORKSPACE" || it.endsWith("BUILD") ||
- it.endsWith(".bzl") }
-
- if(isMerge) {
- println "Merge commit detected, adding 'polygerrit' validation..."
- Builds.modes += "polygerrit"
- } else if(polygerritFiles.size() > 0) {
- if(changedFiles.size() == polygerritFiles.size() && bazelFiles.isEmpty()) {
- println "Only PolyGerrit UI changes detected, skipping other test modes..."
- Builds.modes = ["polygerrit"]
- } else {
- println "PolyGerrit UI changes detected, adding 'polygerrit' validation..."
- Builds.modes += "polygerrit"
- }
- } else if(!bazelFiles.isEmpty()) {
- println "WORKSPACE file changes detected, adding 'polygerrit' validation..."
- Builds.modes += "polygerrit"
- }
-}
-
-def prepareBuildsForMode(buildName, mode="notedb", retryTimes = 1) {
- return {
- stage("${buildName}/${mode}") {
- def slaveBuild = null
- for (int i = 1; i <= retryTimes; i++) {
- postCheck(new GerritCheck(
- (buildName == "Gerrit-codestyle") ? "codestyle" : mode,
- new Build(currentBuild.getAbsoluteUrl(), null)))
- try {
- slaveBuild = build job: "${buildName}", parameters: [
- string(name: 'REFSPEC', value: "refs/changes/${env.BRANCH_NAME}"),
- string(name: 'BRANCH', value: env.GERRIT_PATCHSET_REVISION),
- string(name: 'CHANGE_URL', value: "${Globals.gerritUrl}c/${env.GERRIT_PROJECT}/+/${env.GERRIT_CHANGE_NUMBER}"),
- string(name: 'MODE', value: mode),
- string(name: 'TARGET_BRANCH', value: env.GERRIT_BRANCH)
- ], propagate: false
- } finally {
- if (buildName == "Gerrit-codestyle"){
- Builds.codeStyle = new Build(
- slaveBuild.getAbsoluteUrl(), slaveBuild.getResult())
- postCheck(new GerritCheck("codestyle", Builds.codeStyle))
- } else {
- Builds.verification[mode] = new Build(
- slaveBuild.getAbsoluteUrl(), slaveBuild.getResult())
- postCheck(new GerritCheck(mode, Builds.verification[mode]))
- }
- if (slaveBuild.getResult() == "SUCCESS") {
- break
- }
- }
- }
- }
- }
-}
-
-def collectBuilds() {
- def builds = [:]
- if (hasChangeNumber()) {
- builds["Gerrit-codestyle"] = prepareBuildsForMode("Gerrit-codestyle")
- Builds.modes.each {
- builds["Gerrit-verification(${it})"] = prepareBuildsForMode("Gerrit-verifier-bazel", it)
- }
- } else {
- builds["java8"] = { -> build "Gerrit-bazel-${env.BRANCH_NAME}" }
-
- if (env.BRANCH_NAME == "master") {
- builds["java11"] = { -> build "Gerrit-bazel-java11-${env.BRANCH_NAME}" }
- }
- }
- return builds
-}
-
-def findFlakyBuilds() {
- def flaky = Builds.verification.findAll { it.value.result == null ||
- it.value.result != 'SUCCESS' }
-
- if(flaky.size() == Builds.verification.size()) {
- return []
- }
-
- def retryBuilds = []
- flaky.each {
- def mode = it.key
- Builds.verification = Builds.verification.findAll { it.key != mode }
- retryBuilds += mode
- }
-
- return retryBuilds
-}
-
-def getLabelValue(acc, res) {
- if(res == null || res == 'ABORTED') {
- return 0
- }
- switch(acc) {
- case 0: return 0
- case 1:
- if(res == null) {
- return 0;
- }
- switch(res) {
- case 'SUCCESS': return +1;
- case 'FAILURE': return -1;
- default: return 0;
- }
- case -1: return -1
- }
-}
-
-def setResult(resultVerify, resultCodeStyle) {
- if (resultVerify == 0 || resultCodeStyle == 0) {
- currentBuild.result = 'ABORTED'
- } else if (resultVerify == -1 || resultCodeStyle == -1) {
- currentBuild.result = 'FAILURE'
- } else {
- currentBuild.result = 'SUCCESS'
- }
-}
-
-def findCodestyleFilesInLog(build) {
- def codeStyleFiles = []
- def needsFormatting = false
- def response = httpRequest "${build.url}consoleText"
- response.content.eachLine {
- needsFormatting = needsFormatting || (it ==~ /.*Need Formatting.*/)
- if(needsFormatting && it ==~ /\[.*\]/) {
- codeStyleFiles += it.substring(1,it.length()-1)
- }
- }
-
- return codeStyleFiles
-}
-
-node ('master') {
-
- if (hasChangeNumber()) {
- stage('Preparing'){
- gerritReview labels: ['Verified': 0, 'Code-Style': 0]
- collectBuildModes()
- }
- }
-
- parallel(collectBuilds())
-
- if (hasChangeNumber()) {
- stage('Retry Flaky Builds'){
- def flakyBuildsModes = findFlakyBuilds()
- if (flakyBuildsModes.size() > 0){
- parallel flakyBuildsModes.collectEntries {
- ["Gerrit-verification(${it})" :
- prepareBuildsForMode("Gerrit-verifier-bazel", it, 3)]
- }
- }
- }
-
- stage('Report to Gerrit'){
- resCodeStyle = getLabelValue(1, Builds.codeStyle.result)
- gerritReview labels: ['Code-Style': resCodeStyle]
-
- def verificationResults = Builds.verification.collect { k, v -> v }
- def resVerify = verificationResults.inject(1) {
- acc, build -> getLabelValue(acc, build.result)
- }
- gerritReview labels: ['Verified': resVerify]
-
- setResult(resVerify, resCodeStyle)
- }
- }
-}
+gerritPipeline()