blob: dc09f0a928af239e5811737f09c8a7875869ba0e [file] [log] [blame]
# 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.
# Jenkins job creation
load(":templates.bzl", "expand_template")
load(":vars.bzl", "MAIL_SUBSTITUTIONS")
def _to_groovy_list(lst):
return "[%s]" % (",".join(['"%s"' % e for e in lst]))
def jenkins_job(name, config, substitutions = {}, deps = [], deps_aliases = {},
project='bazel', org='bazelbuild', git_url=None, project_url=None,
folder=None, test_platforms=["linux-x86_64"],
create_filegroups=True):
"""Create a job configuration on Jenkins.
Args:
name: the name of the job to create
config: the configuration file for the job
substitutions: additional substitutions to pass to the template generation
deps: list of dependencies (templates included by the config file)
project: the project name on github
org: the project organization on github, default 'bazelbuild'
git_url: the URL to the git project, defaulted to the Github URL
project_url: the project url, defaulted to the Git URL
test_platforms: platforms on which to run that job when inside of a
dockerized test, by default only 'linux-x86_64'
create_filegroups: create filegroups named <name>/all, <name>/staging
and <name>/test that contains the files needed to be included
to include that job respectively for the production service, the
staging service and the docker test version. This is to be set
to false is the calling macros already creates those filegroups.
"""
github_project = "%s/%s" % (org, project)
github_url = "https://github.com/" + github_project
if not git_url:
git_url = github_url
if not project_url:
project_url = git_url
deps = deps + [deps_aliases[k] for k in deps_aliases]
substitutions = substitutions + {
"GITHUB_URL": github_url,
"GIT_URL": git_url,
"GITHUB_PROJECT": github_project,
"PROJECT_URL": project_url,
"production": "true",
} + MAIL_SUBSTITUTIONS
substitutions["SEND_EMAIL"] = "1"
# RESTRICT_CONFIGURATION can be use to restrict configuration of the groovy jobs
if (not "RESTRICT_CONFIGURATION" in substitutions) or (
not substitutions["RESTRICT_CONFIGURATION"]):
substitutions["RESTRICT_CONFIGURATION"] = "[:]"
expand_template(
name = name,
template = config,
out = "%s.xml" % name,
deps = deps,
deps_aliases = deps_aliases,
substitutions = substitutions,
)
if create_filegroups:
native.filegroup(name = name + "/all", srcs = [name])
substitutions["SEND_EMAIL"] = "0"
substitutions["BAZEL_BUILD_RECIPIENT"] = ""
substitutions["production"] = "false"
expand_template(
name = name + "-staging",
template = config,
out = "%s-staging.xml" % name,
deps = deps,
deps_aliases = deps_aliases,
substitutions = substitutions,
)
if create_filegroups:
native.filegroup(name = name + "/staging", srcs = [name + "-staging"])
if test_platforms:
substitutions["RESTRICT_CONFIGURATION"] += " + [node:%s]" % _to_groovy_list(test_platforms)
expand_template(
name = name + "-test",
template = config,
out = "%s-test.xml" % name,
deps = deps,
deps_aliases = deps_aliases,
substitutions = substitutions,
)
if create_filegroups:
native.filegroup(name = name + "/test", srcs = [name + "-test"])
def bazel_git_job(**kwargs):
"""Override bazel_github_job to test a project that is not on GitHub."""
kwargs["github_enabled"] = False
if not "git_url" in kwargs:
if not "project_url" in kwargs:
fail("Neither project_url nor git_url was specified")
kwargs["git_url"] = kwargs
bazel_github_job(**kwargs)
def bazel_github_job(name, branch="master", project=None, org="bazelbuild",
project_url=None, workspace=".", git_url=None,
config="//jenkins/build_defs:default.json",
test_platforms=["linux-x86_64"],
enable_trigger=True,
poll=None,
gerrit_project=None,
enabled=True,
pr_enabled=True,
github_enabled=True,
run_sequential=False,
sauce_enabled=False,
use_upstream_branch=False):
"""Create a generic github job configuration to build against Bazel head."""
if poll == None:
poll = org != "bazelbuild"
if not project:
project = name
substitutions = {
"WORKSPACE": workspace,
"PROJECT_NAME": project,
"BRANCH": branch,
"NAME": name,
"disabled": str(not enabled).lower(),
"enable_trigger": str(enable_trigger and github_enabled).lower(),
"poll": str(poll).lower(),
"github": str(github_enabled),
"GERRIT_PROJECT": str(gerrit_project) if gerrit_project else "",
"RUN_SEQUENTIAL": str(run_sequential).lower(),
"SAUCE_ENABLED": str(sauce_enabled).lower(),
"GLOBAL_USE_UPSTREAM_BRANCH": str(use_upstream_branch)
}
all_files = [name + ".xml"]
test_files = [name + "-test.xml"]
staging_files = [name + "-staging.xml"]
kwargs = {}
if not github_enabled:
kwargs["git_url"] = git_url
jenkins_job(
name = name,
config = "//jenkins/build_defs:bazel-job.xml.tpl",
deps_aliases = {
"JSON_CONFIGURATION": config,
},
substitutions=substitutions,
project=project,
org=org,
project_url=project_url,
test_platforms=test_platforms,
create_filegroups=False,
**kwargs)
if enabled and config:
jenkins_job(
name = "Global/" + name,
config = "//jenkins/build_defs:bazel-job-Global.xml.tpl",
deps_aliases = {
"JSON_CONFIGURATION": config,
},
substitutions=substitutions,
git_url=git_url,
project=project,
org=org,
project_url=project_url,
test_platforms=test_platforms,
create_filegroups=False)
all_files.append("Global/%s.xml" % name)
test_files.append("Global/%s-test.xml" % name)
staging_files.append("Global/%s-staging.xml" % name)
if pr_enabled and config:
jenkins_job(
name = "PR/" + name,
config = "//jenkins/build_defs:bazel-job-PR.xml.tpl",
deps_aliases = {
"JSON_CONFIGURATION": config,
},
substitutions=substitutions,
project=project,
org=org,
project_url=project_url,
test_platforms=test_platforms,
create_filegroups=False)
all_files.append("PR/%s.xml" % name)
test_files.append("PR/%s-test.xml" % name)
staging_files.append("PR/%s-staging.xml" % name)
if gerrit_project:
jenkins_job(
name = "CR/" + name,
config = "//jenkins/build_defs:bazel-job-Gerrit.xml.tpl",
deps_aliases = {
"JSON_CONFIGURATION": config,
},
substitutions=substitutions,
project=project,
org=org,
project_url=project_url,
test_platforms=test_platforms)
all_files.append("CR/%s.xml" % name)
test_files.append("CR/%s-test.xml" % name)
staging_files.append("CR/%s-staging.xml" % name)
native.filegroup(name = "%s/all" % name, srcs = all_files)
if test_platforms:
native.filegroup(name = "%s/test" % name, srcs = test_files)
native.filegroup(name = "%s/staging" % name, srcs = staging_files)