Skip to content

agile-lab-dev/witboost-java-scaffold

Repository files navigation

witboost

Designed by Agile Lab, witboost is a versatile platform that addresses a wide range of sophisticated data engineering challenges. It enables businesses to discover, enhance, and productize their data, fostering the creation of automated data platforms that adhere to the highest standards of data governance. Want to know more about witboost? Check it out here or contact us!.

This repository is part of our Starter Kit meant to showcase witboost's integration capabilities and provide a "batteries-included" product.

Java Scaffold

Overview

This project provides a scaffold to develop a Specific Provisioner from scratch using Java & SpringBoot.

What's a Specific Provisioner?

A Specific Provisioner is a microservice which is in charge of deploying components that use a specific technology. When the deployment of a Data Product is triggered, the platform generates it descriptor and orchestrates the deployment of every component contained in the Data Product. For every such component the platform knows which Specific Provisioner is responsible for its deployment, and can thus send a provisioning request with the descriptor to it so that the Specific Provisioner can perform whatever operation is required to fulfill this request and report back the outcome to the platform.

You can learn more about how the Specific Provisioners fit in the broader picture here.

Software stack

This microservice is written in Java 17, using SpringBoot for the HTTP layer. Project is built with Apache Maven and supports packaging and Docker image, ideal for Kubernetes deployments (which is the preferred option).

Git hooks

Hooks are programs you can place in a hooks directory to trigger actions at certain points in git’s execution. Hooks that don’t have the executable bit set are ignored.

The hooks are all stored in the hooks subdirectory of the Git directory. In most projects, that’s .git/hooks.

Out of the many available hooks supported by Git, we use pre-commit hook in order to check the code changes before each commit. If the hook returns a non-zero exit status, the commit is aborted.

Setup Pre-commit hooks

In order to use pre-commit hook, you can use pre-commit framework to set up and manage multi-language pre-commit hooks.

To set up pre-commit hooks, follow the below steps:

  • Install pre-commit framework either using pip (or) using homebrew (if your Operating System is macOS):

    • Using pip:
      pip install pre-commit
    • Using homebrew:
      brew install pre-commit
  • Once pre-commit is installed, you can execute the following:

pre-commit --version

If you see something like pre-commit 3.3.3, your installation is ready to use!

  • To use pre-commit, create a file named .pre-commit-config.yaml inside the project directory. This file tells pre-commit which hooks needed to be installed based on your inputs. Below is an example configuration:
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.4.0
    hooks:
      - id: trailing-whitespace

The above configuration says to download the pre-commit-hooks project and run its trailing-whitespace hook on the project.

  • Run the below command to install pre-commit into your git hooks. pre-commit will then run on every commit.
pre-commit install

Building

Requirements:

  • Java 17
  • Apache Maven 3.9+

Version: the version is set dynamically via an environment variable, PROVISIONER_VERSION. Make sure you have it exported, even for local development. Example:

export PROVISIONER_VERSION=0.0.0-SNAPHSOT

Build:

The scaffold uses the openapi-generator Maven plugin to generate the API endpoints from the interface specification located in src/main/resources/interface-specification.yml. For more information on the documentation, check API docs.

mvn compile

Type check: is handled by Checkstyle:

mvn checkstyle:check

Bug checks: are handled by SpotBugs:

mvn spotbugs:check

Tests: are handled by JUnit:

mvn test

Artifacts & Docker image: the project leverages Maven for packaging. Build artifacts (normal and fat jar) with:

mvn package spring-boot:repackage

The Docker image can be built with:

docker build .

More details can be found here.

Note: when running in the CI/CD pipeline the version for the project is automatically computed using information gathered from Git, using branch name and tags. Unless you are on a release branch 1.2.x or a tag v1.2.3 it will end up being 0.0.0. You can follow this branch/tag convention or update the version computation to match your preferred strategy. When running locally if you do not care about the version (ie, nothing gets published or similar) you can manually set the environment variable PROVISIONER_VERSION to avoid warnings and oddly-named artifacts; as an example you can set it to the build time like this:

export PROVISIONER_VERSION=$(date +%Y%m%d-%H%M%S);

CI/CD: the pipeline is based on GitLab CI as that's what we use internally. It's configured by the .gitlab-ci.yaml file in the root of the repository. You can use that as a starting point for your customizations.

Implementing server logic

The Java Scaffold utilizes the openapi-generator Maven plugin to generate the Spring endpoint methods from the interface specification located in src/main/resources/interface-specification.yml. The files are generated at compile/build time, so they can't be modified as they'd be rewritten everytime you build the application. You can find the generated sources at common/target/generated-sources/openapi/src/main/java.

The generated files include one Java interface per each existing endpoint version. That is, for /v1 endpoints it will generate the V1ApiDelegate.java interface containing all endpoints starting with /v1, for /v2 the V2ApiDelegate.java and so on. The interface defaults the endpoints to answer with 501 Not Implemented unless overridden. We provide a class it.agilelab.witboost.javascaffold.controller.SpecificProvisionerController as an example class with one overridden method. To implement the specific provisioner logic, implement the necessary methods and start developing.

Exceptions are handled using Spring @RestControllerAdvice annotation. We provide a basic implementation on it.agilelab.witboost.javascaffold.controller.SpecificProvisionerExceptionHandler which handles both business and runtime exceptions, but be free to modify this exception handler based on your business requirements.

Running

To run the server locally, use:

mvn -pl common spring-boot:run

By default, the server binds to port 8888 on localhost. After it's up and running you can make provisioning requests to this address. You can access the running application here.

SwaggerUI is configured and hosted on the path /docs. You can access it here

Deploying

This microservice is meant to be deployed to a Kubernetes cluster with the included Helm chart and the scripts that can be found in the helm subdirectory. You can find more details here.

License

This project is available under the Apache License, Version 2.0; see LICENSE for full details.

About us

Agile Lab

Agile Lab creates value for its Clients in data-intensive environments through customizable solutions to establish performance driven processes, sustainable architectures, and automated platforms driven by data governance best practices.

Since 2014 we have implemented 100+ successful Elite Data Engineering initiatives and used that experience to create Witboost: a technology-agnostic, modular platform, that empowers modern enterprises to discover, elevate and productize their data both in traditional environments and on fully compliant Data mesh architectures.

Contact us or follow us on:

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages