// 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 pipeline control a global test for Bazel:
//   - Bootstrap bazel and do some basic tests
//   - Deploy the artifacts (site, releases) and send mails
//   - Run all downstream job

stage("Startup global test") {
  echo "Running global test for branch ${params.BRANCH} (refspec: ${params.REFSPEC})"
}

notifyStatus(mail_recipient) {
  // First we bootstrap bazel on all platform
  stage("Bootstrap on all platforms") {
    bootstrapBazelAll(repository: params.REPOSITORY,
		      branch: params.BRANCH,
                      refspec: params.REFSPEC,
                      email: mail_recipient,
                      configuration: json_config,
                      restrict_configuration: restrict_configuration)
  }

  // Some basic tests
  // TODO(dmarting): maybe we want to run it in parallel of other jobs?
  stage("Test that all sources are in the //:srcs filegroup") {
    machine("linux-x86_64") {
      recursiveGit(repository: params.REPOSITORY,
                   refspec: params.REFSPEC,
                   branch: params.BRANCH)
      def bazel = bazelPath("latest", "linux-x86_64")
      sh(script: "./compile.sh srcs ${bazel}")
    }
  }
}


// Deployment steps
if(params.BRANCH.matches('^(.*/)master$')) {
  stage("Push website") {
    machine("deploy") {
      recursiveGit(repository: params.REPOSITORY,
                   refspec: params.REFSPEC,
                   branch: params.BRANCH)
      unstash "bazel--node=linux-x86_64--variation="
      sh script: '''#!/bin/bash
. scripts/ci/build.sh
for i in $(find input -name \'*.bazel.build.tar\'); do
  build_and_publish_site "$i" "$(basename $i .tar)" "build"
done
for i in $(find input -name \'*.bazel.build.tar.nobuild\'); do
  build_and_publish_site "$i" "$(basename $i .tar.nobuild)" "nobuild"
done
'''
    }
  }
} else if(params.BRANCH.matches('^refs/((heads/release-)|(tags/)).*$')) {
  def r_name = ""
  machine("deploy") {
    r_name = sh(script: "bash -c 'source scripts/release/common.sh; get_full_release_name'",
                returnStdout: true)
    if (!r_name.isEmpty()) {
      stage("Push release") {
        // unstash all the things
        def conf = BazelConfiguration.flattenConfigurations(
          BazelConfiguration.parse(json_config), restrict_configuration).keySet().toArray()
        for (int k = 0; k < entrySet.size; k++) {
          unstash "bazel--node=${conf[k].node}--variation=${conf[k].variation}"
        }
        // Delete files we do not need
        sh "rm -f node=*/variation=*/bazel node=*/variation=*/*.bazel.build.tar*"
        // Now the actual release
        withEnv(["GCS_BUCKET=bazel",
                 "GIT_REPOSITORY_URL=https://github.com/bazelbuild/bazel"]) {
          dir("output/ci") { -> }
          sh '''#!/bin/bash
# Credentials should not be displayed on the command line
export GITHUB_TOKEN="$(cat "$GITHUB_TOKEN_FILE")"
export APT_GPG_KEY_ID="$(cat "${APT_GPG_KEY_ID_FILE}")"
source scripts/ci/build.sh

args=()
for i in node=*; do
  for j in $i/variation=*/*; do
    args+=("$(echo $i | cut -d = -f 2)" "$j")
done

bazel_release "${args[@]}"
echo "${RELEASE_EMAIL_RECIPIENT}" | tee output/ci/recipient
echo "${RELEASE_EMAIL_SUBJECT}" | tee output/ci/subject
echo "${RELEASE_EMAIL_CONTENT}" | tee output/ci/content
'''
          if (r_name.contains("test")) {
            echo "Test release, skipping announcement mail"
          } else {
            stage("Announcement mail") {
              mail(subject: readFile("output/ci/subject"),
                   to: readFile("output/ci/recipient"),
                   replyTo: "bazel-ci@googlegroups.com",
                   body: readFile("output/ci/content"))
            }
          }
        }
      }
    }
  }
  // TODO(dmarting): trigger bazel install everywhere in case of release.
}

// Then we run all jobs in the Global folder except the global pipeline job (the current job). 
report = null
stage("Test downstream jobs") {
  report = runAll(folder: "Global",
         parameters: [
           [$class: 'TextParameterValue',
            name: 'EXTRA_BAZELRC',
            value: "${params.EXTRA_BAZELRC}"],
           [$class: 'StringParameterValue',
            name: 'REPOSITORY',
            value: "${params.REPOSITORY}"],
           [$class: 'StringParameterValue',
            name: 'BRANCH',
            value: "${params.BRANCH}"],
           [$class: 'StringParameterValue',
            name: 'REFSPEC',
            value: "${params.REFSPEC}"]
         ])
}

stage("Publish report") {
  reportAB report: report, name: "Downstream projects"
}
