genrule() can only produce one output. This is critical to the way
buck caching works for build results. The solution I learned from
the Buck team is to have the genrule() produce a ZIP file containing
all of the outputs, and use a unique genrule() to extract each
output from the ZIP.
Developers can now opt-into the buck cache by writing a local
config file:
cat >.buckconfig.local <<EOF
[cache]
mode = dir
dir = buck-cache
EOF
This can be very useful when switching commits around with GWT UI
code. If the UI code does not modify between commits there is no
rebuild time. If UI code does modify, rebuild time is reduced to
0 when switching back to a prior version you had previously built.
The cache needs local disk, so its not enabled by default.
Change-Id: If8f79637004fbc13ea37c419e5c9bb582a489ab5
Buck upstream now supports a daemon mode[1] which allows BUILD
files to be cached across invocations. This saves considerable
time on startup, especially for no-op incremental builds:
no-op without buckd: 10.6s
no-op with buckd: 5.2s
However the current daemon implementation is insecure. Users
should only run it on dedicated machines where they trust all
other running processes.
Buck now requires Java 7. If it is missing the build will fail.
[1] http://facebook.github.io/buck/command/buckd.html
Change-Id: I55dec63e467f8f4db5a799296fb7f588ce4b2aa1
Implement a new build system using Buck[1], Facebook's
open source clone of Google's internal build system.
Pros:
- Concise build language
- Test and build output is concise
- Test failures and stack traces show on terminal
- Reliable incrementals; clean is unnecessary
- Extensible with simple blocks of Python
- Fast
buck: clean: 0.452s, full 1m21.083s [*], no-op: 7.145s,
mvn: clean: 4.596s, full 2m53.776s, no-op: 59.108s,
[*] full build includes downloading all dependencies,
time can vary due to remote server performance.
Cons:
- No Windows support
- No native Maven Central support (added by macros)
- No native GWT, Prolog, or WAR support (added by macros)
- Bootstrap of buck requires Ant
Getting started:
git clone https://gerrit.googlesource.com/buck
cd buck
ant
Mac OS X:
PATH="`pwd`/bin:/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands:$PATH"
Linux:
PATH="`pwd`/bin:$PATH"
Importing into Eclipse:
$ time buck build :eclipse
0m48.949s
Import existing project from `pwd`
Import 'gerrit' (do not import other Maven based projects)
Expand 'gerrit'
Right click 'buck-out' > Properties
Under Attributes check 'Derived'
If the code doesn't currently compile but an updated classpath
is needed, refresh the configs and obtain missing JARs:
$ buck build :eclipse_project :download
Running JUnit tests:
$ time buck test --all -e slow # skip slow tests
0m19.320s
$ time buck test --all # includes acceptance tests
5m17.517s
Building WAR:
$ buck build :gerrit
$ java -jar buck-out/gen/gerrit.war
Building release:
$ buck test --all && buck build :api :release
$ java -jar buck-out/gen/release.war
$ ls -lh buck-out/gen/{extension,plugin}-api.jar
Downloading dependencies:
Dependencies are normally downloaded automatically, but Buck can
inspect its graph and download missing dependencies so future
compiles can run without the network:
$ buck build :download
[1] http://facebook.github.io/buck/
Change-Id: I40853b108bd8e153cefa0896a5280a9a5ff81655
These files keep showing up when I run git add . and it's throwing off
the release script, so I am telling git to forget about them.
Change-Id: I4c12e9c4d72acf8e8dc1345b6903cfa224e621ed
We now load our database settings in hosted development mode from
the $site_path/etc/gerrit.config, just like we would under daemon.
This reduces the number of weird configurations that are supported.
Change-Id: I0a13f16dd74bdb034d05650eadd5e36771109f3e
Signed-off-by: Shawn O. Pearce <sop@google.com>
We now can launch the daemon correctly from within the Eclipse debugger
without having to switch to using the WAR in our CLASSPATH. This works
by allowing Eclipse to supply all of the CLASSPATH, but we have to go
find our WAR resource content in gerrit-gwtui/target.
Bug: 340
Change-Id: I7dfbc0654cdc10099fb3de3041e615a9fda5fdb4
Signed-off-by: Shawn O. Pearce <sop@google.com>
This refactoring splits the code up into different components, with
their own per-component CLASSPATH. By moving all of our classes
into isolated components we can better isolate the classpaths and
try to avoid unexpected dependency problems. It also allows us to
more clearly define which components are used by the GWT UI and
thus must be compiled under GWT, and which components are run on
the server and can therefore use more of the J2SE API.
Change-Id: I833cc22bacc5655d1c9099ed7c2b0e0a5b08855a
Signed-off-by: Shawn O. Pearce <sop@google.com>
The pain in the neck thing is, we have to use their new WAR style
output, which requires us to run "mvn war:inplace" before we can
start debugging, or if any dependencies change, but we also need
to clean that out.
All RPC handles also moved inside of the module directory, which
makes it easier to debug in the hosted mode browser but breaks any
existing browser client, even though the JSON payloads have not
changed in format.
Bug: GERRIT-75
Signed-off-by: Shawn O. Pearce <sop@google.com>
This might exist if the developer is trying to test directly from
the source directory by running something like:
mvn package && java -jar target/gerrit-*.war foo
and the "foo" subcommand requires GerritServer.properties to speak
to the database.
Signed-off-by: Shawn O. Pearce <sop@google.com>
In general we map one Maven project description to one Git
repository, as each Maven project has its own unique version
number for its artifact.
This change pulls everything up one level so its a much more
typical directory layout, where the pom.xml is at the root
of the directory structure.
Signed-off-by: Shawn O. Pearce <sop@google.com>
This way we can easily depend upon other projects which also use
Maven, without needing to embed all of their dependencies directly
within our repository.
Signed-off-by: Shawn O. Pearce <sop@google.com>
We've made some schema changes about how patch data is stored and
represented in the Gerrit 2 database, so we need to import all of
the patch entities over again. This change includes a CLI tool
that can be run to re-import one or more patch set entities from
the corresponding Git commit.
Signed-off-by: Shawn O. Pearce <sop@google.com>
We also include .gz versions of every static resource, because
this allows Jetty (and possibly other servers) to efficiently
send the pre-compressed static resource to the client.
Signed-off-by: Shawn O. Pearce <sop@google.com>
This script is just a simple tool to help me export the current
PostgreSQL database into a format that is safe to send to a 3rd
party. All of the data is public on Gerrit's website, except for
the user's physical address contact information. We scrub that
out because we do not have consent from our users to disclose
that information.
Signed-off-by: Shawn O. Pearce <sop@google.com>
We don't need to track these files from hosted mode crashes.
Keeping them in .gitignore makes it easier to "git add ." and
not worry about them being included into the project.
Signed-off-by: Shawn O. Pearce <sop@google.com>
Gerrit 2 is a ground-up rewrite of Gerrit, using GWT (Google Web
Toolkit) for the client side user interface and a Java servlet
based backend.
Signed-off-by: Shawn O. Pearce <sop@google.com>