7.3 KiB
How To Use Apache Yetus with Apache HBase
This document describes how to get up and running with Apache Yetus,
as pertains to the development of Apache HBase. Specifically this covers the use
of test-patch
, of which HBase developers make use for tasks related to code
quality. These are normally run via automation in the foundation's
Build infrastructure. They can also be run locally, which is the
subject of this document.
The Yetus project provides its own documentation of test-patch
in
Basic PreCommit. By comparison, this document is
intended to be highly abbreviated, hands-on, and focused on the HBase use-case.
See that document for more complete explanations and further details.
Installation
In order to run Yetus, you'll need to first install Yetus and its dependencies. This is somewhat simplified when used in Docker mode. Yetus can be retrieved from a distribution artifact. Homebrew/Linuxbrew users can install from the tap, the process for which is also described on the downloads page.
Usage Basics
Apache Yetus is comprised of a number of different components. The focus of our
interest is test-patch
. test-patch
is a modular system. Many modules depend
on some external tool to provide the underlying functionality. For example, the
compile
check delegates to a number of provider modules, for example maven
or gradle
for JVM projects. In order to use these modules, those tools must
be installed. Yetus calls these modules "plugins".
To see a list of all plugins available to test-patch
, use
$ test-patch --list-plugins
To see a list of all the options available in both the core modules as well as all the plugins, use
$ test-patch --plugins=all --help
An invocation of test-patch
requires use of one or more plugins. Often times,
when the full suite of checks are run, specify the meta-plugin "all". Otherwise,
a limited selection of plugins can be selected using the --plugins
argument.
The Workspace, The Patch
test-patch
operates within a "workspace," a checkout from a source control
repository. It has a number of options pertaining to this workspace, such as
the path to the workspace (--basedir
) and whether it will permit the presence
of uncommitted changes therein (--dirty-workspace
).
Onto this workspace, it can optionally apply a change, a.k.a., the "patch" in
"test patch." The patch can come from a number of sources, including a patch
file, a JIRA ID, a Pull Request, &c. Or, explicitly inform Yetus that no patch
file is provided, and the repository should be checked as is, by passing
--empty-patch
.
Personalities
test-patch
is extremely extensible. Even the functionality of its core
modules can be extended or overridden. It allows for this type of
"personalization" by way of "personality" overrides. Yetus ships a number of
these personalities; a pre-packaged personality can be selected via the
--project
parameter. There is a provided HBase personality in Yetus, however
the HBase project maintains its own within the HBase source repository. Specify
the path to the personality file using --personality
. The HBase repository
places this file under dev-support/hbase-personality.sh
.
Docker mode
Running Yetus in Docker mode simplifies the concerns of dependencies because
the provided Dockerfile
handles their installation automatically. However,
for MacOS users, there are a number of known issues with running Docker on OSX,
so it may be preferable to instead run outside of the container.
To run in Docker, of course you must install docker
or some container runtime
equivalent. Docker Desktop is an option for Mac and Windows
users.
When running test-patch
with HBase in docker mode, two parameters must be
provided. --docker
activates the docker
module, enabling the feature.
Additionally, --dockerfile
points Yetus at HBase's provided Dockerfile
,
instead of using the one provided out-of-the-box by Yetus. The HBase repository
places this file under dev-support/docker/Dockerfile
.
JVM and JAVA_HOME
HBase supports compilation and test execution on a number of different JVM
versions. To facilitate this, the Dockerfile
installs multiple JVMs. An
invocation of test-patch
requires additional parameters in order to specify
the target JVM. How you do this is slightly different based on whether you run
with or without Docker mode.
Setting JAVA_HOME
Outside of Docker Mode
Simply specify JAVA_HOME
in the environment in which test-patch
is launched.
Setting JAVA_HOME
Inside of Docker Mode
The docker image JDKs are available under /usr/lib/jvm
. Symlinks are provided
for each supported major version, i.e., java-11
. Use the test-patch
argument
--java-home
.
Example: Run SpotBugs
One of the checks supported by Yetus is the static analysis tool
SpotBugs. Let's put together all the above and run SpotBugs with
test-patch
.
The SpotBugs check depends on a SpotBugs installation. This is provided by the docker file. For running without docker, you'll need to download and unpack the SpotBugs binary distribution.
Running the SpotBugs check also depends on Apache Maven, the build
system used by HBase. In order for the check to function, both the maven
and spotbugs
plugins must be specified. If this dependency is omitted, Yetus
will error with a message similar to
ERROR: you can't specify maven as the buildtool if you don't enable the plugin.
To run just the SpotBugs check, we must explicitly specify spotbugs
and its
dependency using --plugins=maven,spotbugs
.
Without Docker
Putting it all together, without using docker:
$ cd /path/to/hbase
$ JAVA_HOME=/path/to/jdk-8 test-patch.sh \
--plugins=maven,spotbugs \
--spotbugs-home=/path/to/spotbugs/
--dirty-workspace \
--empty-patch \
--personality=./dev-support/hbase-personality.sh
With Docker
Putting it all together, using docker:
$ cd /path/to/hbase
$ test-patch.sh \
--plugins=maven,spotbugs \
--dirty-workspace \
--empty-patch \
--personality=./dev-support/hbase-personality.sh \
--docker \
--dockerfile=./dev-support/docker/Dockerfile \
--java-home=/usr/lib/jvm/java-8