Skip to content

Commit

Permalink
[bazel] Construct distribution zips for java outputs
Browse files Browse the repository at this point in the history
It's hard to believe, but there are people who like to download zip
files of a release, like we did in the old days. This introduces an
easy way to build these for `java_export` targets.
  • Loading branch information
shs96c committed Sep 21, 2019
1 parent 7bdbb85 commit 7c3b0a3
Show file tree
Hide file tree
Showing 10 changed files with 226 additions and 6 deletions.
1 change: 1 addition & 0 deletions java/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
exports_files(
srcs = [
"CHANGELOG",
"empty_test_template.txt",
"java_stub_template.txt",
],
Expand Down
16 changes: 15 additions & 1 deletion java/client/src/org/openqa/selenium/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
load("//java:version.bzl", "SE_VERSION")
load("//java:defs.bzl", "java_export")
load("//java:defs.bzl", "java_dist_zip", "java_export")

filegroup(
name = "template-pom",
Expand Down Expand Up @@ -46,6 +46,20 @@ java_export(
],
)

java_dist_zip(
name = "client-zip",
files = [
"//:license",
"//java:CHANGELOG",
],
deps = [
":client-combined",
],
third_party_prefixes = [
"//third_party",
]
)

java_import(
name = "manifest",
jars = [
Expand Down
2 changes: 1 addition & 1 deletion java/client/src/org/openqa/selenium/remote/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
load("//java:defs.bzl", "java_export")
load("//java:defs.bzl", "java_dist_zip", "java_export")
load("//java:version.bzl", "SE_VERSION")

java_library(
Expand Down
2 changes: 2 additions & 0 deletions java/defs.bzl
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
load("//java/private:dist_zip.bzl", _java_dist_zip = "java_dist_zip")
load("//java/private:export.bzl", _java_export = "java_export")
load("//java/private:test.bzl", _java_test_suite = "java_test_suite", _java_selenium_test_suite = "java_selenium_test_suite")

java_dist_zip = _java_dist_zip
java_export = _java_export
java_selenium_test_suite = _java_selenium_test_suite
java_test_suite = _java_test_suite
176 changes: 176 additions & 0 deletions java/private/dist_zip.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
load("//java/private:common.bzl", "MAVEN_PREFIX", "MavenInfo", "explode_coordinates", "has_maven_deps")
load("//java/private:module.bzl", "GatheredJavaModuleInfo", "has_java_module_deps")

DistZipInfo = provider(
fields = {
"dist_infos": "Transitive collection of structs containing base_name, binary_jar, and source_jar",
},
)

def _dist_aspect_impl(target, ctx):
deps = getattr(ctx.rule.attr, "deps", [])
exports = getattr(ctx.rule.attr, "exports", [])
rt_deps = getattr(ctx.rule.attr, "runtime_deps", [])
tgt = getattr(ctx.rule.attr, "target", None)

all_deps = deps + exports + rt_deps
if tgt:
all_deps.append(tgt)

name = None
tags = getattr(ctx.rule.attr, "tags", [])
for tag in tags:
if tag.startswith(MAVEN_PREFIX):
raw = tag[len(MAVEN_PREFIX):]
coords = explode_coordinates(raw)
if "jar" == coords[3]:
name = "%s-%s" % (coords[1], coords[2])

transitive_infos = [d[DistZipInfo].dist_infos for d in all_deps if DistZipInfo in d]

if not name:
# Return accumulated dist infos
return [
DistZipInfo(
dist_infos = depset([], transitive = transitive_infos),
),
]

source_jars = depset()
binary_jars = depset()

if "maven_artifacts" == ctx.rule.kind:
binary_jars = target[OutputGroupInfo].binjar
source_jars = target[OutputGroupInfo].srcjar
elif JavaInfo in target:
binary_jars = depset(target[JavaInfo].runtime_output_jars)
elif GatheredJavaModuleInfo in target:
binary_jars = depset(target[GatheredJavaModuleInfo].binary_jars)
source_jars = depset(target[GatheredJavaModuleInfo].source_jars)

binary_jar = None
if len(binary_jars.to_list()) > 1:
fail("Unable to process more than one binary jar")
elif len(binary_jars.to_list()) == 1:
binary_jar = binary_jars.to_list()[0]
source_jar = None
if len(source_jars.to_list()) > 1:
fail("Unable to process more than one source jar")
elif len(source_jars.to_list()) == 1:
source_jar = source_jars.to_list()[0]

current = struct(
target = str(target.label),
base_name = name,
binary_jar = binary_jar,
source_jar = source_jar,
)

return [
DistZipInfo(
dist_infos = depset([current], transitive = transitive_infos),
),
]

_dist_aspect = aspect(
_dist_aspect_impl,
attr_aspects = [
"deps",
"exports",
"runtime_deps",
"target",
],
provides = [
DistZipInfo,
],
required_aspect_providers = [
[DistZipInfo],
[GatheredJavaModuleInfo],
[JavaInfo],
[MavenInfo],
],
)

def is_third_party(prefixes, target):
for prefix in prefixes:
if target.startswith(prefix):
return True
return False

def _java_dist_zip_impl(ctx):
out = ctx.actions.declare_file("%s-dist.zip" % ctx.attr.name)

args = ctx.actions.args()
args.add_all(["c", out.path])

inputs = []
files = []
for file in ctx.files.files:
files.append("%s=%s" % (file.basename, file.path))
inputs.append(file)

infos = depset([d[DistZipInfo] for d in ctx.attr.deps]).to_list()

first_party = []
third_party = []

for info in infos:
for dist_info in info.dist_infos.to_list():
if not dist_info.binary_jar:
continue

inputs.append(dist_info.binary_jar)
if is_third_party(ctx.attr.third_party_prefixes, dist_info.target):
third_party.append("lib/%s.jar=%s" % (dist_info.base_name, dist_info.binary_jar.path))
else:
first_party.append("%s.jar=%s" % (dist_info.base_name, dist_info.binary_jar.path))

if dist_info.source_jar:
inputs.append(dist_info.source_jar)
if is_third_party(ctx.attr.third_party_prefixes, dist_info.target):
third_party.append("lib/%s-sources.jar=%s" % (dist_info.base_name, dist_info.source_jar.path))
else:
first_party.append("%s-sources.jar=%s" % (dist_info.base_name, dist_info.source_jar.path))

args.add_all(sorted(files))
args.add_all(sorted(first_party))
args.add_all(sorted(third_party))

ctx.actions.run(
executable = ctx.executable._zip,
arguments = [args],
outputs = [out],
inputs = inputs,
)

return [
DefaultInfo(files = depset([out])),
]

java_dist_zip = rule(
_java_dist_zip_impl,
attrs = {
"files": attr.label_list(
default = [],
allow_files = True,
),
"deps": attr.label_list(
allow_empty = False,
providers = [
[DistZipInfo],
],
aspects = [
_dist_aspect,
],
),
"third_party_prefixes": attr.string_list(
default = [],
allow_empty = True,
),
"_zip": attr.label(
default = "@bazel_tools//tools/zip:zipper",
executable = True,
cfg = "host",
),
},
)
1 change: 0 additions & 1 deletion java/private/export.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ def java_export(
)

# And set up the publishing task

maven_publish(
name = "%s-publish" % name,
maven_coordinates = maven_coordinates,
Expand Down
1 change: 1 addition & 0 deletions java/private/maven_artifacts.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ def _maven_artifacts_impl(ctx):
return [
target[JavaInfo],
JavaModuleInfo(
binary_jars = depset([ctx.outputs.binjar]),
module_jars = depset([ctx.outputs.binjar], transitive = [target[GatheredJavaModuleInfo].module_jars]),
),
OutputGroupInfo(
Expand Down
6 changes: 6 additions & 0 deletions java/private/module.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ load("//java/private:common.bzl", "MavenInfo", "has_maven_deps", "read_coordinat

GatheredJavaModuleInfo = provider(
fields = {
"binary_jars": "Binary jar for module",
"module_jars": "Jars to include on the module path",
},
)

JavaModuleInfo = provider(
fields = {
"binary_jars": "Binary jar for module",
"module_jars": "Jars to include on the module path",
},
)
Expand All @@ -29,6 +31,7 @@ def _has_java_module_deps(target, ctx):
if JavaModuleInfo in target:
return [
GatheredJavaModuleInfo(
binary_jars = depset(target[JavaModuleInfo].binary_jars.to_list()),
module_jars = depset(target[JavaModuleInfo].module_jars.to_list(), transitive = [transitive]),
),
]
Expand All @@ -39,13 +42,16 @@ def _has_java_module_deps(target, ctx):
coordinates = read_coordinates(tags)
if not len(coordinates) or "jpms:compile_only" in tags:
return [GatheredJavaModuleInfo(
binary_jars = depset(target[JavaInfo].runtime_output_jars),
module_jars = depset([], transitive = [transitive]),
)]
return GatheredJavaModuleInfo(
binary_jars = depset(target[JavaInfo].runtime_output_jars),
module_jars = depset(target[JavaInfo].runtime_output_jars, transitive = [transitive]),
)
else:
return [GatheredJavaModuleInfo(
binary_jars = depset([]),
module_jars = depset([], transitive = [transitive])
)]

Expand Down
24 changes: 23 additions & 1 deletion java/server/src/org/openqa/selenium/grid/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
load("//java:defs.bzl", "java_export")
load("//:copy_file.bzl", "copy_file")
load("//java:defs.bzl", "java_dist_zip", "java_export")
load("//java:version.bzl", "SE_VERSION")

java_export(
Expand Down Expand Up @@ -38,3 +39,24 @@ java_binary(
"//:__pkg__",
],
)

copy_file(
name = "server-binary",
src = ":selenium_server_deploy.jar",
out = "selenium-server-%s.jar" % SE_VERSION,
)

java_dist_zip(
name = "server-zip",
files = [
":server-binary",
"//:license",
"//java:CHANGELOG",
],
deps = [
":grid",
],
third_party_prefixes = [
"//third_party",
]
)
3 changes: 1 addition & 2 deletions third_party/java/jetty/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
load("//java:defs.bzl", "java_export")
load("//third_party/java:rules.bzl", "maven_java_import")

licenses(["notice"])
Expand Down Expand Up @@ -130,4 +129,4 @@ maven_java_import(
deps = [
":jetty-servlet",
],
)
)

0 comments on commit 7c3b0a3

Please sign in to comment.