ADR002: Use Multiple Repositories instead of one Large Repository
- 
Status: accepted
 - 
Deciders:
- 
Florian Waibel
 - 
Lars Francke
 - 
Lukas Menzel
 - 
Oliver Hessel
 - 
Sönke Liebau
 
 - 
 - 
Date: 19.08.2020
 
Context and Problem Statement
Should we use one large repository for all components of the project or structure this into multiple smaller repositories?
Decision Drivers
- 
Useability of repository structure
 - 
Impact on related infrastructure like CI / Testing / …
 - 
Impact on release strategy
 
Decision Outcome
Chosen option: "Multiple Repositories", because it comes out best (see below)].
How to split the components into repositories will be decided throughout the runtime of the project.
Initially the following repositories were identified:
- 
Orchestrator
 - 
Agent
 - 
ADR / Documentation
 - 
Operators (most probably one repository per operator)
 - 
Stackbit Sources (most probably one repository per product)
 
Pros and Cons of the Options
Single Repository
- 
Good, because it makes implementing dependencies between modules easier
 - 
Good, because it provides a single place to search for things
 - 
Bad, because it can become large and difficult to manage
 - 
Bad, because it keeps things that should be loosely coupled in the same place which might promote tighter coupling
 - 
Bad, because tagging a release of a component will unnecessarily include the rest of the repository
 - 
Bad, because changes to a component may accidentally impact other components
 - 
Bad, because the commit history is mixed for all components
 - 
Bad, because a single commit may change multiple components making tracking these changes harder
 - 
Bad, because the CI pipeline would need to identify the changed components to avoid triggering tests for all other components
 - 
Bad, because clone times might be much higher
 
Multiple Repositories
- 
Good, because it keeps the individual repositories simpler
 - 
Good, because it allows proper separation of modules
 - 
Good, because it allows proper tagging of releases
 - 
Bad, because implementing dependent changes in separate components becomes harder
 - 
Bad, because it makes finding individual pieces of code potentially harder if the repository is unknown