blob: b0aa3c454f64a7da51baafef2302975c4d1ed8b5 [file] [log] [blame] [view]
# Gerrit high-availability docker setup example
The Docker Compose project in the docker directory contains a simple test
environment of two Gerrit primary servers in HA configuration, with their
git repos hosted on NFS filesystem.
## How to build
The project can be built using docker compose.
To build the Docker VMs:
```bash
docker compose build
```
### Building the Docker VMs using a non-default user id
First, update the user id in the [NFS Dockerfile](./docker/nfs/Dockerfile).
This is done simply by modifying the file setting the non-default user id.
Then, run the following:
```
$ export GERRIT_UID=$(id -u)
$ docker compose build --build-arg GERRIT_UID
```
Above, exporting that UID is optional and will be 1000 by default.
Build the gerrit images this way only if the user with id 1000 on your
host is not owned by you. For example, some corporate environments use a
restricted 1000 user (id). In that case, the containerized application
may fail to write towards the host (through volumes).
**Important:** The user id in gerrit must be the same as the uid in the
NFS server, otherwise you will encounter file ownership problems on any
filesystem operation.
That UID will be the one set for the containerized gerrit user. Latter's
group will remain as default (1000). This is because groups known from
the host need to be redefined for containers. Setting that user's group
in the container is not necessary for writing anyway, as opposed to its
user id. The individual gerrit user's writing permission does suffice.
## How to run
Use the 'up' target to startup the Docker Compose VMs.
```
$ docker compose up -d
```
## Background on using an NFS server
We are using the `erichough/nfs-server` image mainly because it's easy to use
& we had success with it. The work has been inspired by
[this blog post](https://nothing2say.co.uk/running-a-linux-based-nfs-server-in-docker-on-windows-b64445d5ada2).
The containers start with the `privileged` flag set, which is a security risk
but necessary to work around permission issues.
It is worth noting that we are exposing the `/var/gerrit/git` directory as the
nfs-share. This is because more often than not it's the git directory that's
shared over the network. You can change this in the nfs server and gerrit
docker files, and in the `exports.txt` file.
The NFS server is using a static IP. The Docker Compose YAML file defines a
bridge network with the subnet `192.168.1.0/24` (this is what allows us to
give the NFS Server a known, static IP).
The `addr=192.168.1.5` option (in the `nfs-client-volume` volume) is the
reason we need a static IP for the server (and hence a configured subnet
for the network). Note that using a name (ie. addr=nfs-server) we weren't
able to get the DNS resolution to work properly.
Also in the Docker Compose file we can see that the `nfs-server` container
uses a `healthcheck`, this is necessary to control when the `gerrit`
services will start up (they need to start after the nfs server is fully
up-and-running).
Finally, we are providing an `exports.txt` file, which again utilises the
subnet we provided during the bridge network creation. This file is baked
into the image sacrificing a bit of flexibility, but we feel this is
a small price to pay to have everything automated.
## Gerrit high-availability local setup example
1. Init gerrit instances with high-availability plugin installed:
1. Optionally, set http port of those instance to 8081 and 8082.
2. Make sure ssh ports on those instances are different. (i.e. 29418 and 29419)
3. Make sure instances share the same git repo.
4. Create and provide shared directory to those instances.
2. Set up high-availability plugin.
1. main.sharedDirectory = "the created shared directory above".
2. peerInfo.strategy = static
3. peerInfo "static".url = other_instance_url (i.e http://localhost:8081 or http://localhost:8082)
## How to test
Consider the
[instructions](https://gerrit-review.googlesource.com/Documentation/dev-e2e-tests.html)
on how to use Gerrit core's Gatling framework, to run non-core test
scenarios such as this plugin one below:
```
$ sbt "gatling:testOnly com.ericsson.gerrit.plugins.highavailability.scenarios.CloneUsingHAGerrit2"
```
This is a scenario that can serve as an example for how to start
testing an HA Gerrit system. That scenario tries to clone a project
created on gerrit 1 (port 8081) but from gerrit 2 (on 8082). The
scenario therefore expects Gerrit HA to have properly synchronized
the new project from 1 to 2. That project gets deleted after, here
using HA Gerrit straight (through default http port 80).
Scenario scala source files and their companion json resource ones are
stored under the usual src/test directories. That structure follows the
scala package one from the scenario classes. The core framework expects
such a directory structure for both the scala and resources (json data)
files.
Alternatively, the TEST_HA script can be used to run Gatling tests which
provides a minimum configuration to run the test.
## How to stop
Simply type CTRL+C on the window that started the environment
and all the VMs will stop. Their state will be persisted and the next
run will continue with the same data.
## How to clean
If you want to stop and cleanup all the previous state, use the 'down'
target.
```
$ docker compose down
```