| // 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 build.bazel.ci.BazelUtils |
| |
| @NonCPS |
| def createCopyCommand(rootDir, toCopy, release_name) { |
| def replaceFn = { o -> o.replace("%{release_name}", release_name) } |
| def replacements = toCopy.collect( |
| { e -> |
| (e.value instanceof List) ? |
| e.value.collect { it -> "${e.key} ${replaceFn(it)}" } |
| : "${e.key} ${replaceFn(e.value)}" |
| }).flatten() |
| return replacements.collect({ e -> "cp ${rootDir}/${e}" }).join("\n") |
| } |
| |
| // A step to bootstrap bazel on one platform |
| def call(config = [:]) { |
| def variation = config.get("variation", "") |
| def repository = config.get("repository", "https://bazel.googlesource.com/bazel") |
| def branch = config.get("branch", "master") |
| def refspec = config.get("refspec", "+refs/heads/*:refs/remotes/origin/*") |
| def targets = config.get("targets", []) |
| |
| machine(config.node) { |
| def utils = new BazelUtils() |
| def release_name = "" |
| def isWindows = !isUnix() |
| utils.script = this |
| utils.bazel = bazelPath("latest${variation}", config.node) |
| stage("[${config.node},${variation}] clone") { |
| recursiveGit(repository: repository, |
| refspec: refspec, |
| branch: branch) |
| } |
| stage("[${config.node},${variation}] get_version") { |
| release_name = |
| sh(script: "bash -c 'source scripts/release/common.sh; get_full_release_name'", |
| returnStdout: true).trim() |
| def opts = config.get("opts", []) |
| opts <<= "--stamp" |
| if (!isWindows) { |
| // TODO(dmarting): Windows status command fails :/ |
| opts <<= "--workspace_status_command=scripts/ci/build_status_command.sh" |
| } |
| if (!release_name.isEmpty()) { |
| opts <<= "--embed_label ${release_name}${variation}" |
| } |
| utils.writeRc(opts) |
| } |
| |
| // Configure, if necessary |
| def configuration = config.get("configure", []) |
| if (!configuration.isEmpty()) { |
| stage("[${config.node},${variation}] configure") { |
| if (isUnix()) { |
| sh "#!/bin/sh -x\n${configuration.join('\n')}" |
| } else { |
| bat configuration.join('\n') |
| } |
| } |
| } |
| |
| stage("[${config.node},${variation}] bootstrap") { |
| def envs = ["BUILD_BY=Jenkins", |
| "GIT_REPOSITORY_URL=${env.GIT_URL}"] |
| utils.build(["//src:bazel"] + targets) |
| } |
| |
| // Archive artifacts |
| def toArchive = config.get("archive", [:]) |
| def toStash = config.get("stash", [:]) |
| toArchive = toArchive == null ? [:] : toArchive |
| toStash = toStash == null ? [:] : toStash |
| |
| if (!toArchive.isEmpty() || !toStash.isEmpty()) { |
| stage("[${config.node},${variation}] archive") { |
| def rootDir = pwd() |
| if (isWindows) { |
| rootDir = sh(script: 'cygpath -u '+rootDir.replace("\\", "/"), |
| returnStdout: true).trim() |
| } |
| dir("output") { |
| deleteDir() |
| } |
| if(!toArchive.isEmpty()) { |
| dir("output/node=${config.node}/variation=${variation}") { |
| sh createCopyCommand(rootDir, toArchive, release_name) |
| } |
| dir("output") { |
| archiveArtifacts artifacts: "**", fingerprint:true |
| } |
| } |
| if (!toStash.isEmpty()) { |
| dir("output/node=${config.node}/variation=${variation}") { |
| sh createCopyCommand(rootDir, toStash, release_name) |
| } |
| } |
| dir("output") { |
| stash name: "bazel--node=${config.node}--variation=${variation}" |
| } |
| } |
| } |
| } |
| } |