| # Gerrit Deployment on Kubernetes | 
 |  | 
 | Container images, configurations, [helm charts](https://helm.sh/) and a Kubernetes | 
 | Operator for installing [Gerrit](https://www.gerritcodereview.com/) on | 
 | [Kubernetes](https://kubernetes.io/). | 
 |  | 
 | # Deploying Gerrit on Kubernetes | 
 |  | 
 | This project provides helm-charts to install Gerrit either as a primary instance | 
 | or a replica on Kubernetes. | 
 |  | 
 | The helm-charts are located in the `./helm-charts`-directory. Currently, the | 
 | charts are not published in a registry and have to be deployed from local sources. | 
 |  | 
 | For a detailed guide of how to install the helm-charts refer to the respective | 
 | READMEs in the helm-charts directories: | 
 |  | 
 | - [gerrit](helm-charts/gerrit/README.md) | 
 | - [gerrit-replica](helm-charts/gerrit-replica/README.md) | 
 |  | 
 | These READMEs detail the prerequisites required by the charts as well as all | 
 | configuration options currently provided by the charts. | 
 |  | 
 | To evaluate and test the helm-charts, they can be installed on a local machine | 
 | running Minikube. Follow this [guide](Documentation/minikube.md) to get a detailed | 
 | description how to set up the Minikube cluster and install the charts. | 
 |  | 
 | Alternatively, a Gerrit Operator can be used to install and operate Gerrit in a | 
 | Kubernetes cluster. The [documentation](./Documentation/operator.md) describes | 
 | how to build and deploy the Gerrit Operator and how to use it to install Gerrit. | 
 |  | 
 | # Docker images | 
 |  | 
 | This project provides the sources for docker images used by the helm-charts. | 
 | The images are also provided on [Dockerhub](https://hub.docker.com/u/k8sgerrit). | 
 |  | 
 | The project also provides scripts to build and publish the images so that custom | 
 | versions can be used by the helm-charts. This requires however a docker registry | 
 | that can be accessed from the Kubernetes cluster, on which Gerrit will be | 
 | deployed. The functionality of the scripts is described in the following sub- | 
 | sections. | 
 |  | 
 | ## Building images | 
 |  | 
 | To build all images, the `build`-script in the root directory of the project can | 
 | be used: | 
 |  | 
 | ``` | 
 | ./build | 
 | ``` | 
 |  | 
 | If a specific image should be built, the image name can be specified as an argument. | 
 | Multiple images can be specified at once: | 
 |  | 
 | ``` | 
 | ./build gerrit git-gc | 
 | ``` | 
 |  | 
 | The build-script usually uses the `latest`-tag to tag the images. By using the | 
 | `--tag TAG`-option, a custom tag can be defined: | 
 |  | 
 | ``` | 
 | ./build --tag test | 
 | ``` | 
 |  | 
 | The version of Gerrit built into the images can be changed by providing a download | 
 | URL for a `.war`-file containing Gerrit: | 
 |  | 
 | ``` | 
 | ./build --gerrit-url https://example.com/gerrit.war | 
 | ``` | 
 |  | 
 | The version of a health-check plugin built into the images can be changed by | 
 | providing a download URL for a `.jar`-file containing the plugin: | 
 |  | 
 | ``` | 
 | ./build --healthcheck-jar-url https://example.com/healthcheck.jar | 
 | ``` | 
 |  | 
 | The build script will in addition tag the image with the output of | 
 | `git describe --dirty`. | 
 |  | 
 | The single component images inherit a base image. The `Dockerfile` for the base | 
 | image can be found in the `./base`-directory. It will be | 
 | automatically built by the `./build`-script. If the component images are built | 
 | manually, the base image has to be built first with the target | 
 | `base:latest`, since it is not available in a registry and thus has | 
 | to exist locally. | 
 |  | 
 | ## Publishing images | 
 |  | 
 | The publish script in the root directory of the project can be used to push the | 
 | built images to the configured registry. To do so, log in first, before executing | 
 | the script. | 
 |  | 
 | ``` | 
 | docker login <registry> | 
 | ``` | 
 |  | 
 | To configure the registry and image version, the respective values can be | 
 | configured via env variables `REGISTRY` and `TAG`. In addition, these values can | 
 | also be passed as command line options named `--registry` and `--tag` in which | 
 | case they override the values from env variables: | 
 |  | 
 | ``` | 
 | ./publish <component-name> | 
 | ``` | 
 |  | 
 | The `<component-name>` is one of: `apache-git-http-backend`, `git-gc`, `gerrit` | 
 | or `gerrit-init`. | 
 |  | 
 | Adding the `--update-latest`-flag will also update the images tagged `latest` in | 
 | the repository: | 
 |  | 
 | ``` | 
 | ./publish --update-latest <component-name> | 
 | ``` | 
 |  | 
 | ## Running images in Docker | 
 |  | 
 | The container images are meant to be used by the helm-charts provided in this | 
 | project. The images are thus not designed to be used in a standalone setup. To | 
 | run Gerrit on Docker use the | 
 | [docker-gerrit](https://gerrit-review.googlesource.com/admin/repos/docker-gerrit) | 
 | project. | 
 |  | 
 | # Running tests | 
 |  | 
 | The tests are implemented using Python and `pytest`. To ensure a well-defined | 
 | test-environment, `pipenv` is meant to be used to install packages and provide a | 
 | virtual environment in which to run the tests. To install pipenv, use `brew`: | 
 |  | 
 | ```sh | 
 | brew install pipenv | 
 | ``` | 
 |  | 
 | More detailed information can be found in the | 
 | [pipenv GitHub repo](https://github.com/pypa/pipenv). | 
 |  | 
 | To create the virtual environment with all required packages, run: | 
 |  | 
 | ```sh | 
 | pipenv install | 
 | ``` | 
 |  | 
 | To run all tests, execute: | 
 |  | 
 | ```sh | 
 | pipenv run pytest -m "not smoke" | 
 | ``` | 
 |  | 
 | ***note | 
 | The `-m "not smoke"`-option excludes the smoke tests, which will fail, since | 
 | no Gerrit-instance will be running, when they are executed. | 
 | *** | 
 |  | 
 | Some tests will need to create files in a temporary directory. Some of these | 
 | files will be mounted into docker containers by tests. For this to work make | 
 | either sure that the system temporary directory is accessible by the Docker | 
 | daemon or set the base temporary directory to a directory accessible by Docker | 
 | by executing: | 
 |  | 
 | ```sh | 
 | pipenv run pytest --basetemp=/tmp/k8sgerrit -m "not smoke" | 
 | ``` | 
 |  | 
 | By default the tests will build all images from scratch. This will greatly | 
 | increase the time needed for testing. To use already existing container images, | 
 | a tag can be provided as follows: | 
 |  | 
 | ```sh | 
 | pipenv run pytest --tag=v0.1 -m "not smoke" | 
 | ``` | 
 |  | 
 | The tests will then use the existing images with the provided tag. If an image | 
 | does not exist, it will still be built by the tests. | 
 |  | 
 | By default the build of the container images will not use the build cache | 
 | created by docker. To enable the cache, execute: | 
 |  | 
 | ```sh | 
 | pipenv run pytest --build-cache -m "not smoke" | 
 | ``` | 
 |  | 
 | Slow tests may be marked with the decorator `@pytest.mark.slow`. These tests | 
 | may then be skipped as follows: | 
 |  | 
 | ```sh | 
 | pipenv run pytest --skip-slow -m "not smoke" | 
 | ``` | 
 |  | 
 | There are also other marks, allowing to select tests (refer to | 
 | [this section](#test-marks)). | 
 |  | 
 | To run specific tests, execute one of the following: | 
 |  | 
 | ```sh | 
 | # Run all tests in a directory (including subdirectories) | 
 | pipenv run pytest tests/container-images/base | 
 |  | 
 | # Run all tests in a file | 
 | pipenv run pytest tests/container-images/base/test_container_build_base.py | 
 |  | 
 | # Run a specific test | 
 | pipenv run \ | 
 |   pytest tests/container-images/base/test_container_build_base.py::test_build_base | 
 |  | 
 | # Run tests with a specific marker | 
 | pipenv run pytest -m "docker" | 
 | ``` | 
 |  | 
 | For a more detailed description of how to use `pytest`, refer to the | 
 | [official documentation](https://docs.pytest.org/en/latest/contents.html). | 
 |  | 
 | ## Test marks | 
 |  | 
 | ### docker | 
 |  | 
 | Marks tests which start up docker containers. These tests will interact with | 
 | the containers by either using `docker exec` or sending HTTP-requests. Make | 
 | sure that your system supports this kind of interaction. | 
 |  | 
 | ### incremental | 
 |  | 
 | Marks test classes in which the contained test functions have to run | 
 | incrementally. | 
 |  | 
 | ### integration | 
 |  | 
 | Marks integration tests. These tests test interactions between containers, | 
 | between outside clients and containers and between the components installed | 
 | by a helm chart. | 
 |  | 
 | ### kubernetes | 
 |  | 
 | Marks tests that require a Kubernetes cluster. These tests are used to test the | 
 | functionality of the helm charts in this project and the interaction of the | 
 | components installed by them. The cluster should not be used for other purposes | 
 | to minimize unforeseen interactions. | 
 |  | 
 | These tests require a storage class with ReadWriteMany access mode within the | 
 | cluster. The name of the storage class has to be provided with the | 
 | `--rwm-storageclass`-option (default: `shared-storage`). | 
 |  | 
 | ### slow | 
 |  | 
 | Marks tests that need an above average time to run. | 
 |  | 
 | ### structure | 
 |  | 
 | Marks structure tests. These tests are meant to test, whether certain components | 
 | exist in a container. These tests ensure that components expected by the users | 
 | of the container, e.g. the helm charts, are present in the containers. | 
 |  | 
 | ## Running smoke tests | 
 |  | 
 | To run smoke tests, use the following command: | 
 |  | 
 | ```sh | 
 | pipenv run pytest \ | 
 |   -m "smoke" \ | 
 |   --basetemp="<tmp-dir for tests>" \ | 
 |   --ingress-url="<Gerrit URL>" \ | 
 |   --gerrit-user="<Gerrit user>" \ | 
 |   --gerrit-pwd | 
 | ``` | 
 |  | 
 | The smoke tests require a Gerrit user that is allowed to create and delete | 
 | projects. The username has to be given by `--gerit-user`. Setting the | 
 | `--gerrit-pwd`-flag will cause a password prompt to enter the password of the | 
 | Gerrit-user. | 
 |  | 
 | # Contributing | 
 |  | 
 | Contributions to this project are welcome. If you are new to the Gerrit workflow, | 
 | refer to the [Gerrit-documentation](https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough.html) | 
 | for guidance on how to contribute changes. | 
 |  | 
 | The contribution guidelines for this project can be found | 
 | [here](Documentation/developer-guide.md). | 
 |  | 
 | # Roadmap | 
 |  | 
 | The roadmap of this project can be found [here](Documentation/roadmap.md). | 
 |  | 
 | Feature requests can be made by pushing a change for the roadmap. This can also | 
 | be done to announce/discuss features that you would like to provide. | 
 |  | 
 | # Contact | 
 |  | 
 | The [Gerrit Mailing List](https://groups.google.com/forum/#!forum/repo-discuss) | 
 | can be used to post questions and comments on this project or Gerrit in general. |