How we to manage Source Code

We are using Github for:

  • all code repositories

  • tickets/issues

  • code reviews

  • building our components

Working in a project like this together, with multiple developers contributing, requires that each developer can work on different branches until he finishes his task. Than he merges his changes into to main branch (the master) to make them available to others.

CCVS (centralized version control systems) support this process just not as good as DVCS. Whoever worked with multiple branches in eg. SVN knows how complicated it is there to merge branches.

The drawback of DCVS, that they are admittedly harder to understand, does not count too much for us, as the whole core team already knows GIT. We also consider DCVS/GIT as the defacto standard in Software Development. So this should not stop others from contributing.

We have chosen GIT as the concrete representative of a DCVS, as we consider it as the most used system with the best tooling support.

GitHub, is just the most used public available service that offer Git. It is free for usage in open source projects like this one. It offers additional issues/tickets, some ci/cd functionality via actions and is due to it’s popularity well known among developers.

Package

We are using Apache Maven to build our Software and wrap it into Docker Container. While Maven is kind of standard, it could be that we switch to Gradle when we need this flexibility.

In the world of Containers, Docker is for sure the standard with nothing currently really competing as of know. We the recent changes in Management in the Company behind Docker, this could change in future, but as of now, we are safe.

Build/Deploy

The build will be triggered in GitHub via GitHub-Actions. Once the project has been build as a Docker Image, it will be uploaded to GitHub Packages.

Then the following will be triggered

  1. Fetch the docker image from GitHub-Packages

  2. Create new Server-Instance in Hetzner-Cloud via CLI-Tool or Cloud API

  3. Bootstrap the Server-instance by installing docker in it

  4. Load and start the docker image in the instance

  5. Retarget the load balancer (NGINX?) to the new instance if applicable.

  6. Destroy the old instance if everything works