|  | = Gerrit Code Review - Building plugins | 
|  |  | 
|  |  | 
|  | From build process perspective there are three types of plugins: | 
|  |  | 
|  | * Maven driven | 
|  | * Bazel tree driven | 
|  | * Bazel standalone | 
|  |  | 
|  | These types can be combined: if both files in plugin's root directory exist: | 
|  |  | 
|  | * `BUILD` | 
|  | * `pom.xml` | 
|  |  | 
|  | the plugin can be built with both Bazel and Maven. | 
|  |  | 
|  |  | 
|  | == Maven driven build | 
|  |  | 
|  | If plugin contains `pom.xml` file, it can be built with Maven as usually: | 
|  |  | 
|  | ---- | 
|  | mvn clean package | 
|  | ---- | 
|  |  | 
|  | Exceptions from the rule above: | 
|  |  | 
|  | === Exception 1: | 
|  |  | 
|  |  | 
|  | Plugin's `pom.xml` references snapshot version of plugin API: | 
|  | `2.8-SNAPSHOT`. In this case there are two possibilities: | 
|  |  | 
|  | * switch to release API. Change plugin API version in `pom.xml` from | 
|  | `2.8-SNAPSHOT` to `2.8.1` and repeat step 1 above. | 
|  | * build and install `SNAPSHOT` version of plugin API in local Maven repository: | 
|  |  | 
|  | ---- | 
|  | ./tools/maven/api.sh install | 
|  | ---- | 
|  |  | 
|  | === Exception 2: | 
|  |  | 
|  | Plugin's `pom.xml` references other own or foreign (unpublished) libraries or | 
|  | even other Gerrit plugins. These libraries and/or plugins must be built and | 
|  | installed in local Maven repository. Clone the related projects and issue | 
|  |  | 
|  | ---- | 
|  | mvn install | 
|  | ---- | 
|  |  | 
|  | Repeat step 1. above. | 
|  |  | 
|  |  | 
|  | == Bazel in tree driven | 
|  |  | 
|  |  | 
|  | The fact that plugin contains `BUILD` file doesn't mean that building this | 
|  | plugin from the plugin directory works. | 
|  |  | 
|  | Bazel in tree driven means it can only be built from within Gerrit tree. Clone | 
|  | or link the plugin into gerrit/plugins directory: | 
|  |  | 
|  | ---- | 
|  | cd gerrit | 
|  | bazel build plugins/<plugin-name>:<plugin-name> | 
|  | ---- | 
|  |  | 
|  | The output can be normally found in the following directory: | 
|  |  | 
|  | ---- | 
|  | bazel-genfiles/plugins/<plugin-name>/<plugin-name>.jar | 
|  | ---- | 
|  |  | 
|  | Some plugins describe their build process in `src/main/resources/Documentation/build.md` | 
|  | file. It may worth checking. | 
|  |  | 
|  | === Plugins with external dependencies === | 
|  |  | 
|  | If the plugin has external dependencies, then they must be included from Gerrit's | 
|  | own WORKSPACE file. This can be achieved by including them in `external_plugin_deps.bzl`. | 
|  | During the build in Gerrit tree, this file must be copied over the dummy one in | 
|  | `plugins` directory. | 
|  |  | 
|  | Example for content of `external_plugin_deps.bzl` file: | 
|  |  | 
|  | ---- | 
|  | load("//tools/bzl:maven_jar.bzl", "maven_jar") | 
|  |  | 
|  | def external_plugin_deps(): | 
|  | maven_jar( | 
|  | name = 'org_apache_tika_tika_core', | 
|  | artifact = 'org.apache.tika:tika-core:1.12', | 
|  | sha1 = '5ab95580d22fe1dee79cffbcd98bb509a32da09b', | 
|  | ) | 
|  | ---- | 
|  |  | 
|  | === Bundle custom plugin in release.war === | 
|  |  | 
|  | To bundle custom plugin(s) in the link:dev-bazel.html#release[release.war] artifact, | 
|  | add them to the CUSTOM_PLUGINS list in `tools/bzl/plugins.bzl`. | 
|  |  | 
|  | Example of `tools/bzl/plugins.bzl` with custom plugin `my-plugin`: | 
|  |  | 
|  | ---- | 
|  | CORE_PLUGINS = [ | 
|  | "commit-message-length-validator", | 
|  | "download-commands", | 
|  | "hooks", | 
|  | "replication", | 
|  | "reviewnotes", | 
|  | "singleusergroup", | 
|  | ] | 
|  |  | 
|  | CUSTOM_PLUGINS = [ | 
|  | "my-plugin", | 
|  | ] | 
|  |  | 
|  | CUSTOM_PLUGINS_TEST_DEPS = [ | 
|  | # Add custom core plugins with tests deps here | 
|  | ] | 
|  | ---- | 
|  |  | 
|  | If the plugin(s) being bundled in the release have external dependencies, include them | 
|  | in `plugins/external_plugin_deps`. You should alias `external_plugin_deps()` so it | 
|  | can be imported for multiple plugins. For example: | 
|  |  | 
|  | ---- | 
|  | load(":my-plugin/external_plugin_deps.bzl", my_plugin="external_plugin_deps") | 
|  | load(":my-other-plugin/external_plugin_deps.bzl", my_other_plugin="external_plugin_deps") | 
|  |  | 
|  | def external_plugin_deps(): | 
|  | my_plugin() | 
|  | my_other_plugin() | 
|  | ---- | 
|  |  | 
|  | [NOTE] | 
|  | Since `tools/bzl/plugins.bzl` and `plugins/external_plugin_deps.bzl` are part of | 
|  | Gerrit's source code and the version of the war is based on the state of the git | 
|  | repository that is built; you should commit this change before building, otherwise | 
|  | the version will be marked as 'dirty'. | 
|  |  | 
|  | == Bazel standalone driven | 
|  |  | 
|  | Only few plugins support that mode for now: | 
|  |  | 
|  | ---- | 
|  | cd reviewers | 
|  | bazel build reviewers | 
|  | ---- | 
|  |  | 
|  | GERRIT | 
|  | ------ | 
|  | Part of link:index.html[Gerrit Code Review] | 
|  |  | 
|  | SEARCHBOX | 
|  | --------- |