| # Copyright 2016 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. |
| |
| # Some definition to create a base image for jenkins in docker |
| |
| load("@io_bazel_rules_docker//docker:docker.bzl", "docker_pull") |
| |
| JENKINS_PLUGINS_URL = "http://updates.jenkins-ci.org/download/plugins/{name}/{version}/{name}.hpi" |
| |
| def _jenkins_image_impl(repository_ctx): |
| repository_ctx.file("plugins/BUILD", """ |
| load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar") |
| pkg_tar( |
| name = "plugins", |
| srcs = glob(["**/*.jpi"]), |
| mode = "0644", |
| strip_prefix = ".", |
| package_dir = "/usr/share/jenkins/ref/plugins", |
| visibility = ["//:__pkg__"], |
| ) |
| """) |
| for plugin in repository_ctx.attr.plugins: |
| config = repository_ctx.attr.plugins[plugin] |
| dest = "plugins/" + plugin + ".jpi" |
| repository_ctx.download( |
| JENKINS_PLUGINS_URL.format(name=plugin, version=config[0]), dest, |
| config[1]) |
| if len(config) >= 3 and config[2] == "pinned": |
| repository_ctx.file(dest + ".pinned", "") |
| repository_ctx.file("BUILD", """ |
| load("@io_bazel_rules_docker//docker:docker.bzl", "docker_build") |
| |
| docker_build( |
| name = "image", |
| base = "{base}", |
| tars = ["//plugins"], |
| directory = "/", |
| volumes = [{volumes}], |
| visibility = ["//visibility:public"], |
| ) |
| """.format( |
| base = repository_ctx.attr.base, |
| volumes = ", ".join(['"%s"' % f for f in repository_ctx.attr.volumes]) |
| )) |
| |
| jenkins_image_ = repository_rule( |
| implementation = _jenkins_image_impl, |
| attrs = { |
| "base": attr.string(mandatory=True), |
| "plugins": attr.string_list_dict(mandatory=True), |
| "volumes": attr.string_list(default=[]), |
| }) |
| |
| def jenkins_base(name, plugins, volumes=[], digest=None, version="1.642.4"): |
| base = "jenkins_" + version.replace(".", "_") |
| if not native.existing_rule(base): |
| kwargs = {} |
| if digest: |
| kwargs["digest"] = digest |
| else: |
| kwargs["tag"] = version |
| docker_pull( |
| name = base, |
| registry = "index.docker.io", |
| repository = "jenkins/jenkins", |
| **kwargs |
| ) |
| jenkins_image_( |
| name=name, |
| plugins=plugins, |
| base="@%s//image" % base, |
| volumes=volumes) |