We are developing distributed system with continuous delivery.
Releases are being scheduled, tagged with non-technical marketing version names. Each release aggregates set of changed components with desired features, verified by integration testing pipeline. We aren't deploying continuously to production, but we do deploy continuously to test environment for release candidates integration testing.
System components are frontend, backend, adapter module and a shared database. They are packaged as docker containers. We use Docker registry as an artifact repository and docker compose to integrate the latest
versions of each component for integration testing. See the following DAG diagram for pipelines and their dependencies. Basically change in the upstream project triggers a rebuild of each downstream project, until leaf nodes are reached. Integration testing is triggered, when leaf node docker image is pushed to registry. Trigger logic is codified in the registry webhooks.
Obviously components needs some technical version to associate production releases to particular builds of components for tracing and reproducing purposes. Currently, each master build is tagged with a semantic version. But is using SemVer and git tagging redundant in this case? Can we use just git hashes and build numbers instead? I don't see any additional value from using semantic versioning in this case. Automated changelog is a requirement.
Also, what is the best way include actual version number in docker container started with the latest
tag by integration testing pipeline? Ideally, from integration pipeline results I would like to see actual component versions used for successful test run.
I would like to also hear, if this solution contains any anti-pattern or sub-optimal design.