From f6b7d4a18da69b45cf73375e65627ce4417e09f0 Mon Sep 17 00:00:00 2001 From: David Ostrovsky Date: Sun, 28 Aug 2016 20:54:50 +0200 Subject: [PATCH] Bazel: Produce headless war This change creates the archive with: lib pgm-lib default web assets but without: GWT UI PolyGerrit UI Plugins Documentation TEST PLAN: bazel build :headless java -jar bazel-bin/headless.war init -d ../test_site_bazel Change-Id: I53987b10a5863aee0298bd2ea29405c26dbacb0c --- BUILD | 19 +++++++ WORKSPACE | 6 +++ lib/BUILD | 6 +++ tools/bzl/pkg_war.bzl | 113 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 tools/bzl/pkg_war.bzl diff --git a/BUILD b/BUILD index 1d36b5e63e..b63dd60a25 100644 --- a/BUILD +++ b/BUILD @@ -1,4 +1,5 @@ load('//tools/bzl:genrule2.bzl', 'genrule2') +load('//tools/bzl:pkg_war.bzl', 'pkg_war') genrule2( name = 'version', @@ -7,3 +8,21 @@ genrule2( out = 'version.txt', visibility = ['//visibility:public'], ) + +pkg_war( + name = 'headless', + context = [ + '//gerrit-main:main_bin_deploy.jar', + '//gerrit-war:webapp_assets', + ], + libs = [ + '//gerrit-war:init', + '//gerrit-war:log4j-config', + '//gerrit-war:version', + '//lib:postgresql', + '//lib/log:impl_log4j', + ], + pgmlibs = [ + '//gerrit-pgm:pgm' + ], +) diff --git a/WORKSPACE b/WORKSPACE index 9a86e0c91e..b172625230 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -716,3 +716,9 @@ maven_jar( artifact = 'xerces:xercesImpl:2.8.1', sha1 = '25101e37ec0c907db6f0612cbf106ee519c1aef1', ) + +maven_jar( + name = 'postgresql', + artifact = 'postgresql:postgresql:9.1-901-1.jdbc4', + sha1 = '9bfabe48876ec38f6cbaa6931bad05c64a9ea942', +) diff --git a/lib/BUILD b/lib/BUILD index a4900387b3..44c293d5d7 100644 --- a/lib/BUILD +++ b/lib/BUILD @@ -231,3 +231,9 @@ java_library( exports = [ '@icu4j//jar' ], visibility = ['//visibility:public'], ) + +java_library( + name = 'postgresql', + exports = ['@postgresql//jar'], + visibility = ['//visibility:public'], +) diff --git a/tools/bzl/pkg_war.bzl b/tools/bzl/pkg_war.bzl new file mode 100644 index 0000000000..e6ccdef51f --- /dev/null +++ b/tools/bzl/pkg_war.bzl @@ -0,0 +1,113 @@ +# Copyright (C) 2016 The Android Open Source Project +# +# 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. + +# War packaging. + +jar_filetype = FileType(['.jar']) + +def _add_context(in_file, output): + input_path = in_file.path + return [ + 'unzip -qd %s %s' % (output, input_path) + ] + +def _add_file(in_file, output): + output_path = output + input_path = in_file.path + short_path = in_file.short_path + n = in_file.basename + + # TODO(davido): Drop this when provided_deps added to java_library + if n.find('-jdk15on-') != -1: + return [] + + if short_path.startswith('gerrit-'): + n = short_path.split('/')[0] + '-' + n + + output_path += n + return [ + 'test -L %s || ln -s $(pwd)/%s %s' % (output_path, input_path, output_path) + ] + +def _make_war(input_dir, output): + return ''.join([ + '(root=$(pwd) && ', + 'cd %s && ' % input_dir, + 'zip -9qr ${root}/%s .)' % (output.path), + ]) + +def _war_impl(ctx): + war = ctx.outputs.war + build_output = war.path + '.build_output' + inputs = [] + + # Create war layout + cmd = [ + 'set -e;rm -rf ' + build_output, + 'mkdir -p ' + build_output, + 'mkdir -p %s/WEB-INF/lib' % build_output, + 'mkdir -p %s/WEB-INF/pgm-lib' % build_output, + ] + + # Add lib + transitive_lib_deps = set() + for l in ctx.attr.libs: + transitive_lib_deps += l.java.transitive_runtime_deps + + for dep in transitive_lib_deps: + cmd += _add_file(dep, build_output + '/WEB-INF/lib/') + inputs.append(dep) + + # Add pgm lib + transitive_pgmlib_deps = set() + for l in ctx.attr.pgmlibs: + transitive_pgmlib_deps += l.java.transitive_runtime_deps + + for dep in transitive_pgmlib_deps: + if dep not in inputs: + cmd += _add_file(dep, build_output + '/WEB-INF/pgm-lib/') + inputs.append(dep) + + # Add context + transitive_context_deps = set() + if ctx.attr.context: + for jar in ctx.attr.context: + if hasattr(jar, 'java'): + transitive_context_deps += jar.java.transitive_runtime_deps + elif hasattr(jar, 'files'): + transitive_context_deps += jar.files + for dep in transitive_context_deps: + cmd += _add_context(dep, build_output) + inputs.append(dep) + + # Add zip war + cmd.append(_make_war(build_output, war)) + + ctx.action( + inputs = inputs, + outputs = [war], + mnemonic = 'WAR', + command = '\n'.join(cmd), + use_default_shell_env = True, + ) + +pkg_war = rule( + attrs = { + 'context': attr.label_list(allow_files = True), + 'libs': attr.label_list(allow_files = jar_filetype), + 'pgmlibs': attr.label_list(allow_files = False), + }, + implementation = _war_impl, + outputs = {'war' : '%{name}.war'}, +)