= Gerrit Code Review - Building with Buck == Installation Note that you need to use Java 7 for building gerrit. There is currently no binary distribution of Buck, so it has to be manually built and installed. Apache Ant and gcc are required. Currently only Linux and Mac OS are supported. Clone the git and build it: ---- git clone https://github.com/facebook/buck cd buck git checkout $(cat ../gerrit/.buckversion) ant ---- If you don't have a `bin/` directory in your home directory, create one: ---- mkdir ~/bin ---- Add the `~/bin` folder to the path: ---- PATH=~/bin:$PATH ---- Note that the buck executable needs to be available in all shell sessions, so also make sure it is appended to the path globally. Add a symbolic link in `~/bin` to the buck and buckd executables: ---- ln -s `pwd`/bin/buck ~/bin/ ln -s `pwd`/bin/buckd ~/bin/ ---- Verify that `buck` is accessible: ---- which buck ---- To enable autocompletion of buck commands, install the autocompletion script from `./scripts/buck_completion.bash` in the buck project. Refer to the script's header comments for installation instructions. == Prerequisites Buck requires Python version 2.7 to be installed. The Maven download toolchain requires `curl` to be installed. [[eclipse]] == Eclipse Integration === Generating the Eclipse Project Create the Eclipse project: ---- tools/eclipse/project.py ---- and then follow the link:dev-eclipse.html#setup[setup instructions]. === Refreshing the Classpath If an updated classpath is needed, the Eclipse project can be refreshed and missing dependency JARs can be downloaded: ---- tools/eclipse/project.py ---- === Attaching Sources To save time and bandwidth source JARs are only downloaded by the buck build where necessary to compile Java source into JavaScript using the GWT compiler. Additional sources may be obtained, allowing Eclipse to show documentation or dive into the implementation of a library JAR: ---- tools/eclipse/project.py --src ---- [[build]] == Building on the Command Line === Gerrit Development WAR File To build the Gerrit web application that includes GWT UI and PolyGerrit UI: ---- buck build gerrit ---- The output executable WAR will be placed in: ---- buck-out/gen/gerrit/gerrit.war ---- To build the Gerrit web application that includes only GWT UI: ---- buck build gwtgerrit ---- The output executable WAR will be placed in: ---- buck-out/gen/gwtgerrit/gwtgerrit.war ---- === Headless Mode To build Gerrit in headless mode, i.e. without the GWT Web UI: ---- buck build headless ---- The output executable WAR will be placed in: ---- buck-out/gen/headless/headless.war ---- === Extension and Plugin API JAR Files To build the extension, plugin and GWT API JAR files: ---- buck build api ---- Java binaries, Java sources and Java docs are generated into corresponding project directories in `buck-out/gen`, here as example for plugin API: ---- buck-out/gen/gerrit-plugin-api/plugin-api.jar buck-out/gen/gerrit-plugin-api/plugin-api-javadoc/plugin-api-javadoc.jar buck-out/gen/gerrit-plugin-api/plugin-api-src.jar ---- Install {extension,plugin,gwt}-api to the local maven repository: ---- buck build api_install ---- Install gerrit.war to the local maven repository: ---- buck build war_install ---- === Plugins To build all core plugins: ---- buck build plugins:core ---- The output JAR files for individual plugins will be placed in: ---- buck-out/gen/plugins//.jar ---- The JAR files will also be packaged in: ---- buck-out/gen/plugins/core/core.zip ---- To build a specific plugin: ---- buck build plugins/: ---- The output JAR file will be be placed in: ---- buck-out/gen/plugins//.jar ---- Note that when building an individual plugin, the `core.zip` package is not regenerated. Additional plugins with BUCK files can be added to the build environment by cloning the source repository into the plugins subdirectory: ---- git clone https://gerrit.googlesource.com/plugins/ plugins/ echo /plugins/ >>.git/info/exclude ---- Additional plugin sources will be automatically added to Eclipse the next time project.py is run: ---- tools/eclipse/project.py ---- [[documentation]] === Documentation To build only the documentation for testing or static hosting: ---- buck build docs ---- The generated html files will NOT come with the search box, and will be placed in: ---- buck-out/gen/Documentation/searchfree__tmp/Documentation ---- The html files will also be bundled into `searchfree.zip` in this location: ---- buck-out/gen/Documentation/searchfree/searchfree.zip ---- To build the executable WAR with the documentation included: ---- buck build withdocs ---- The WAR file will be placed in: ---- buck-out/gen/withdocs/withdocs.war ---- [[soyc]] === GWT Compile Report The GWT compiler can output a compile report (or "story of your compile"), describing the size of the JavaScript and which source classes contributed to the overall download size. ---- buck build soyc ---- The report will be written as an HTML page to the extras directory, and can be opened and viewed in any web browser: ---- extras/gerrit_ui/soycReport/compile-report/index.html ---- Only the "Split Point Report" is created, "Compiler Metrics" are not output. [[release]] === Gerrit Release WAR File To build the release of the Gerrit web application, including documentation and all core plugins: ---- buck build release ---- The output release WAR will be placed in: ---- buck-out/gen/release/release.war ---- [[tests]] == Running Unit Tests To run all tests including acceptance tests (but not flaky tests): ---- buck test --exclude flaky ---- To exclude flaky and slow tests: ---- buck test --exclude flaky slow ---- To run only a specific group of acceptance tests: ---- buck test --include api ---- The following groups of tests are currently supported: * acceptance * api * edit * flaky * git * pgm * rest * server * ssh * slow To run a specific test group, e.g. the rest-account test group: ---- buck test //gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account:rest-account ---- To create test coverage report: ---- buck test --code-coverage --code-coverage-format html --no-results-cache ---- The HTML report is created in `buck-out/gen/jacoco/code-coverage/index.html`. == Dependencies Dependency JARs are normally downloaded automatically, but Buck can inspect its graph and download any missing JAR files. This is useful to enable subsequent builds to run without network access: ---- tools/download_all.py ---- When downloading from behind a proxy (which is common in some corporate environments), it might be necessary to explicitly specify the proxy that is then used by `curl`: ---- export http_proxy=http://:@: ---- Redirection to local mirrors of Maven Central and the Gerrit storage bucket is supported by defining specific properties in `local.properties`, a file that is not tracked by Git: ---- echo download.GERRIT = http://nexus.my-company.com/ >>local.properties echo download.MAVEN_CENTRAL = http://nexus.my-company.com/ >>local.properties ---- The `local.properties` file may be placed in the root of the gerrit repository being built, or in `~/.gerritcodereview/`. The file in the root of the gerrit repository has precedence. == Building against unpublished Maven JARs To build against unpublished Maven JARs, like gwtorm or PrologCafe, the custom JARs must be installed in the local Maven repository (`mvn clean install`) and `maven_jar()` must be updated to point to the `MAVEN_LOCAL` Maven repository for that artifact: [source,python] ---- maven_jar( name = 'gwtorm', id = 'gwtorm:gwtorm:42', license = 'Apache2.0', repository = MAVEN_LOCAL, ) ---- == Building against artifacts from custom Maven repositories To build against custom Maven repositories, two modes of operations are supported: with rewrite in local.properties and without. Without rewrite the URL of custom Maven repository can be directly passed to the maven_jar() function: [source,python] ---- GERRIT_FORGE = 'http://gerritforge.com/snapshot' maven_jar( name = 'gitblit', id = 'com.gitblit:gitblit:1.4.0', sha1 = '1b130dbf5578ace37507430a4a523f6594bf34fa', license = 'Apache2.0', repository = GERRIT_FORGE, ) ---- When the custom URL has to be rewritten, then the same logic as with Gerrit known Maven repository is used: Repo name must be defined that matches an entry in local.properties file: ---- download.GERRIT_FORGE = http://my.company.mirror/gerrit-forge ---- And corresponding BUCK excerpt: [source,python] ---- GERRIT_FORGE = 'GERRIT_FORGE:' maven_jar( name = 'gitblit', id = 'com.gitblit:gitblit:1.4.0', sha1 = '1b130dbf5578ace37507430a4a523f6594bf34fa', license = 'Apache2.0', repository = GERRIT_FORGE, ) ---- === Caching Build Results Build results can be locally cached, saving rebuild time when switching between Git branches. Buck's documentation covers caching in link:http://facebook.github.io/buck/concept/buckconfig.html[buckconfig]. The trivial case using a local directory is: ---- cat >.buckconfig.local < .buckjavaargs <