| # 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) |