Deploying the service to an environment is outside the scope of this tutorial, and the steps will vary depending on the type of environment. However, below is information you may file useful when the time comes to deploy your services.


Versioning is handled by the excellent Gradle plugin.

The aggregate template comes preconfigured to increment the patch version on each build. This ensures each code change results in a new Docker image, with a unique version, being built. Ensuring its easy to trace back a Docker image running in an environment, to the version of the code its running.

See the aggregate template docs for more info.

Docker Images

Building Docker images

The repository comes preconfigured with the necessary tasks to build each service’s Docker image using the most excellent com.bmuschko.docker-remote-api Gradle plugin. Run the following to build the docker image:

./gradlew buildAppImage

This will build a docker container named

ProTip: The Docker image name is defined both in the service’s descriptor and the service’s buildAppImage Gradle task. These must be kept in sync if system tests are to work.

Publishing Docker images

The repository comes preconfigured to publish each service’s Docker image back to GitHub’s Container Registry. The publishing is done by the CI GitHub workflow on a push, with each new push creating a new Docker image version.

For example, the handle-occurrence-service this tutorial creates is published here by the completed tutorial handle-occurrence-service-image.

Under the hood the workflow is using the pushAppImage Gradle task to push the Docker images:

./gradlew pushAppImage

…which can be customised as needed.


The repository comes preconfigured to publish its api jar back to GitHub’s Gradle Registry as part of the CI GitHub workflow. This is handled by the publish Gradle task:

./gradlew publish

…which can be customised as needed.

Environment variables


The service requires, as a minimum, the KAFKA_BOOTSTRAP_SERVERS environment variable set to the location of the Kafka cluster to use. This maps to the bootstrap.servers Kafka client config.

ProTip: More information about the environment variables supported by the Kafka Streams extension in the extension’s documentation.