Strategie voor Branching en Merging
Categories:
Probleem
In een GitOps-opzet met Ansible vereist het beheren van wijzigingen over meerdere omgevingen zoals ontwikkeling, staging en productie een gestructureerde aanpak om fouten te vermijden, testen te waarborgen en beveiliging te handhaven. Zonder duidelijke branchingbeleid lopen teams het risico om ongeteste code uit te rollen, conflicterende wijzigingen of ongeautoriseerde aanpassingen aan kritieke branches.
Context
GitOps-praktijken omvatten het gebruik van Git als de enige bron van waarheid voor infrastructuur- en applicatieconfiguraties. In projecten gebaseerd op Ansible betekent dit het opslaan van inventarissen, playbooks en variabelen in een Git-repository, in een zogenaamd Ansible-inventarisproject. Branches kunnen verschillende omgevingen vertegenwoordigen, waardoor wijzigingen via merge requests (MRs) kunnen worden gepromoot. Beschermde branches in tools zoals GitLab of GitHub dwingen reviews, goedkeuringen en CI/CD-pipelines af voordat merges plaatsvinden, zodat wijzigingen worden gecontroleerd en automatisch getest.
Oplossing
Implementeer een branchingstrategie die aansluit bij GitOps-principes, met behulp van omgevingsspecifieke omgevings-branches en merge requests voor promoties. Dwing beleid af met beschermde branches om controle en traceerbaarheid te behouden.
Volg deze richtlijnen:
Definieer Kernbranches: Creëer permanente branches voor elke omgeving. Dit zijn zogenaamde omgevings-branches. Het is belangrijk dat ze overeenkomen met een omgeving bestaande uit hosts die deel uitmaken van dezelfde Ansible-omgevingsgroep.
master
: Dient als de stabiele, langetermijnbranch die de laatste productiestatus weergeeft na succesvolle promoties.development
: Voor lopende ontwikkeling en featurewerk.staging
: Voor het testen van wijzigingen voordat ze naar productie gaan.production
: Vertegenwoordigt de live productieomgeving; merge alleen vanuit staging na goedkeuringen.
Branchingbeleid:
- Featurebranches: Creëer kortlevende branches vanuit
development
voor nieuwe features of bugfixes (bijv.feature/add-new-playbook
). - Hotfixbranches: Voor urgente productiefixes, branch direct vanuit
production
(bijv.hotfix/issue-12345
). - Vermijd directe commits naar omgevings-branches; gebruik altijd MRs voor wijzigingen.
- Featurebranches: Creëer kortlevende branches vanuit
Mergingworkflow:
- Ontwikkel en test in
development
. - Merge van
development
naarstaging
via MR voor integratietesten. - Merge van
staging
naarproduction
via MR na goedkeuringen en succesvolle CI/CD-runs. - Merge tenslotte
production
terug naarmaster
om deze up-to-date te houden. - Voor hotfixes: Pas eerst toe op
production
via MR, en backport vervolgens naar andere branches.
- Ontwikkel en test in
Beschermde Branches:
- Configureer branchbescherming voor alle
omgevings-branches en voor
master
in je Git-platform (bijv. GitLab):- Vereis MR-goedkeuringen (bijv. minstens 2 reviewers).
- Dwing succesvolle CI/CD-pipelines af voordat er gemerged wordt.
- Beperk wie kan pushen of mergen (bijv. alleen admins voor
production
). - Voorkom force pushes en branchverwijdering.
- Configureer branchbescherming voor alle
omgevings-branches en voor
Integratie van Automatisering:
- Gebruik GitLab CI/CD of vergelijkbaar om Ansible-playbooks te triggeren bij merges, waarbij wijzigingen worden uitgerold naar de corresponderende omgeving. Typisch wordt AAP gebruikt; soms, als AAP niet wordt gebruikt, kan GitLab CI/CD worden ingezet.
- Tag releases (bijv. semantic versioning) bij merges om versies te tracken.
Voordelen
- Consistentie en Veiligheid: Vermindert uitrolrisico’s door reviews en geautomatiseerde testen af te dwingen.
- Traceerbaarheid: MRs bieden een audittrail van wijzigingen en goedkeuringen.
- Schaalbaarheid: Ondersteunt teamcollaboratie zonder werk te overschrijven.
- Gemakkelijke Rollback: Omgevings-branches maken snelle revert mogelijk bij problemen.
Alternatieven (Optioneel)
Hoewel Git Flow of GitHub Flow gebruikelijk zijn, passen ze mogelijk niet perfect bij de op omgeving gebaseerde promoties van GitOps. Een eenvoudigere trunk-based development kan werken voor kleinere teams, maar mist de gefaseerde promotie die nodig is voor gereguleerde omgevingen; de beschreven strategie is voorkeur voor Ansible GitOps-opzetten die duidelijke scheiding vereisen.
Voorbeelden en Implementatie
In een typisch Ansible GitOps-project structureer je je repository met branches die omgevingen vertegenwoordigen. Gebruik merge requests om wijzigingen te promoten, waardoor CI/CD-pipelines worden getriggerd die Ansible-playbooks uitvoeren voor uitrol.
Hier is een voorbeeld van een Git-workflow gevisualiseerd met Mermaid:
gitGraph commit id: "Initial commit" branch development checkout development branch staging checkout staging branch production checkout production checkout development commit commit commit id: " " tag: "1.0.0" checkout staging merge development tag: "1.0.0" checkout production merge staging tag: "1.0.0" commit id: "Production release 1.0.0" checkout main merge production tag: "1.0.0" checkout production branch hotfix-12345-fix-something commit id: "Hotfix applied" tag: "1.0.1-hotfix-issue-12345" checkout main merge hotfix-12345-fix-something tag: "1.0.1-hotfix-issue-12345" checkout development merge hotfix-12345-fix-something tag: "1.0.1-hotfix-issue-12345" checkout staging merge hotfix-12345-fix-something tag: "1.0.1-hotfix-issue-12345"
Deze diagram illustreert:
- Initiële opzet van branches.
- Ontwikkelwerk gemerged naar staging, dan productie.
- Een hotfix toegepast op productie en gebackport naar andere branches.
- Finale merge naar
master
voor een stabiel record.
Om te implementeren in GitLab:
- Navigeer naar Repository > Branches > Protected branches.
- Stel
production
in als beschermd, vereis MRs en goedkeuringen. - Configureer
.gitlab-ci.yml
om Ansible-jobs uit te voeren bij merge-events. Bijvoorbeeld:
stages:
- deploy
deploy_to_staging:
stage: deploy
script:
- ansible-playbook -i inventory/staging site.yml
only:
- staging
Aanvullende Informatie
- Ansible-inventarisproject: Een gestructureerde verzameling bestanden die worden gebruikt voor het beheren van hosts en configuraties. Het omvat doorgaans inventarisbestanden, playbooks, hostvariabelen, groepsvariabelen en Ansible Vault-bestanden.
Feedback
Was deze pagina nuttig?
Fijn om te horen! Vertel ons alstublieft hoe we kunnen verbeteren.
Jammer om dat te horen. Vertel ons alstublieft hoe we kunnen verbeteren.