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