blob: 35aed5222f00790bd6e8e264ef90ae7624f194e9 [file] [log] [blame]
# 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)