GitOps-deployflöde: publicering till GHCR + Argo CD-synk
Klustret följer git — ingen CI-process har kubectl-åtkomst: - Nytt publiceringsflöde (.github/workflows/publicera.yml): varje main-push bygger de tre bilderna, publicerar till GHCR taggade med git-SHA (endast GITHUB_TOKEN, inga externa hemligheter), uppdaterar produktions-overlayens taggar med kustomize edit set image och committar tillbaka — overlayen ombyggs som verifiering före commit, och paths-ignore + [skip ci] förhindrar triggerloopar. - Produktions-overlay (infra/overlays/produktion): GitOps-sanningen för vad som kör; bas = infra/k8s. Rollback = git revert. - Argo CD-applikation (infra/gitops/argocd-application.yaml): automatisk synk med prune + selfHeal; hemligheten ligger medvetet utanför både git och synken. Bootstrap = ett kubectl apply. - DRIFT.md: CI/CD-avsnitt med flödesdiagram, bootstrap, rollback och repo-variabeln PLATTFORM_URL. Verifierat med riktig kustomize v5.4.3: overlayen bygger 17 objekt, bildbytet slår igenom på alla tre tjänsterna, postgres-init genereras, och workflowens exakta edit set image-kommandon fungerar. Alla workflow-/manifest-YAML validerade; 29 vitest-tester gröna. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
# CD-halvan av GitOps-flödet: varje push till main bygger och publicerar
|
||||
# de tre bilderna till GHCR taggade med git-SHA:t, och uppdaterar sedan
|
||||
# produktions-overlayens taggar i git. Argo CD ser ändringen och synkar
|
||||
# klustret — ingen kubectl-åtkomst från CI, klustret drar själv.
|
||||
name: Publicera
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths-ignore:
|
||||
- "infra/overlays/**" # gitops-commiten ska inte trigga en ny publicering
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
|
||||
env:
|
||||
REGISTER: ghcr.io/${{ github.repository_owner }}
|
||||
|
||||
jobs:
|
||||
publicera:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Bygg och publicera web
|
||||
run: |
|
||||
docker build -t "$REGISTER/guidad-felsokning-web:${{ github.sha }}" \
|
||||
--build-arg VITE_PLATTFORM_URL="${{ vars.PLATTFORM_URL }}" \
|
||||
--build-arg VITE_AI_ORKESTER_URL="${{ vars.PLATTFORM_URL }}" .
|
||||
docker push "$REGISTER/guidad-felsokning-web:${{ github.sha }}"
|
||||
- name: Bygg och publicera ai-orkester
|
||||
run: |
|
||||
docker build -t "$REGISTER/guidad-felsokning-ai-orkester:${{ github.sha }}" services/ai-orkester
|
||||
docker push "$REGISTER/guidad-felsokning-ai-orkester:${{ github.sha }}"
|
||||
- name: Bygg och publicera plattform
|
||||
run: |
|
||||
docker build -t "$REGISTER/guidad-felsokning-plattform:${{ github.sha }}" services/plattform
|
||||
docker push "$REGISTER/guidad-felsokning-plattform:${{ github.sha }}"
|
||||
|
||||
- name: Uppdatera produktions-overlayen (GitOps)
|
||||
run: |
|
||||
curl -sL "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.4.3/kustomize_v5.4.3_linux_amd64.tar.gz" | tar xz
|
||||
cd infra/overlays/produktion
|
||||
for tjanst in web ai-orkester plattform; do
|
||||
../../../kustomize edit set image \
|
||||
"ghcr.io/ORGANISATION/guidad-felsokning-$tjanst=$REGISTER/guidad-felsokning-$tjanst:${{ github.sha }}"
|
||||
done
|
||||
../../../kustomize build . > /dev/null # verifiera att overlayen fortfarande bygger
|
||||
- name: Committa overlay-uppdateringen
|
||||
run: |
|
||||
git config user.name "gitops-bot"
|
||||
git config user.email "gitops@users.noreply.github.com"
|
||||
git add infra/overlays/produktion/kustomization.yaml
|
||||
git diff --cached --quiet || git commit -m "gitops: driftsätt ${{ github.sha }} [skip ci]"
|
||||
git push
|
||||
+18
-2
@@ -74,6 +74,22 @@ Integrationstestet (`services/plattform/integrationstest.sh`, körs även i CI m
|
||||
- Alla containrar kör **non-root** utan capabilities; backend-tjänsterna med read-only rotfilsystem. Båda failar closed utan sina hemligheter.
|
||||
- **HPA** 2–10 pods per tjänst på 70 % CPU; **PDB** minst en pod uppe vid noddränering; readiness/liveness-prober överallt (`pg_isready` för Postgres).
|
||||
|
||||
## CI
|
||||
## CI/CD med GitOps
|
||||
|
||||
`.github/workflows/ci.yml` kör tester + produktionsbygge och verifierar alla tre Dockerfilerna på varje push/PR. Publicering och `kubectl apply` läggs i ett separat behörighetsstyrt deploy-flöde (GitOps via Argo CD/Flux rekommenderas).
|
||||
**CI** (`.github/workflows/ci.yml`): tester, produktionsbygge, integrationstest mot riktig Postgres och verifierande containerbyggen på varje push/PR.
|
||||
|
||||
**CD** (`.github/workflows/publicera.yml` + Argo CD): klustret följer git — ingen CI-process har kubectl-åtkomst.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
P[Push till main] --> B[Bygg + publicera\n3 bilder till GHCR\ntaggade med git-SHA]
|
||||
B --> O[Uppdatera\ninfra/overlays/produktion\n+ commit till git]
|
||||
O --> A[Argo CD ser ändringen] --> S[Synkar klustret\nprune + selfHeal]
|
||||
```
|
||||
|
||||
1. Varje main-push bygger de tre bilderna, publicerar till GHCR (`GITHUB_TOKEN`, inga externa hemligheter) och uppdaterar produktions-overlayens taggar med `kustomize edit set image` — overlayen ombyggs som verifiering innan commiten.
|
||||
2. **Argo CD är enda vägen in i klustret.** Bootstrap en gång: installera Argo CD, ersätt repo-URL:en i `infra/gitops/argocd-application.yaml` och `kubectl apply -f` den. Därefter: `prune` tar bort det som försvinner ur git, `selfHeal` återställer manuella klusteravvikelser.
|
||||
3. **Rollback = `git revert`** av gitops-commiten — Argo CD synkar tillbaka föregående SHA-taggade bilder.
|
||||
4. Repo-variabeln `PLATTFORM_URL` (Settings → Variables) styr webbyggets `VITE_PLATTFORM_URL`/`VITE_AI_ORKESTER_URL`. Hemligheten `felsokning-hemligheter` ligger utanför både git och synken.
|
||||
|
||||
Manuell `kubectl apply -k infra/k8s` (avsnittet Driftsätta ovan) fungerar fortfarande för miljöer utan Argo CD.
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# Argo CD-applikationen: klustret följer git — appliceras EN gång i
|
||||
# argocd-namespacet, därefter sköter Argo CD all synk automatiskt.
|
||||
#
|
||||
# kubectl apply -f infra/gitops/argocd-application.yaml
|
||||
#
|
||||
# prune tar bort resurser som försvunnit ur git; selfHeal återställer
|
||||
# manuella ändringar i klustret. Hemligheten felsokning-hemligheter
|
||||
# ligger medvetet utanför git och utanför synken.
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: guidad-felsokning
|
||||
namespace: argocd
|
||||
spec:
|
||||
project: default
|
||||
source:
|
||||
repoURL: https://github.com/ERSATT-MIG/ERSATT-MIG.git # ersätt med ert repo
|
||||
targetRevision: main
|
||||
path: infra/overlays/produktion
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
syncPolicy:
|
||||
automated:
|
||||
prune: true
|
||||
selfHeal: true
|
||||
syncOptions:
|
||||
- ServerSideApply=true
|
||||
@@ -0,0 +1,19 @@
|
||||
# Produktions-overlay — GitOps-sanningen för vad som kör i klustret.
|
||||
# Bildtaggarna uppdateras av publiceringsflödet (.github/workflows/
|
||||
# publicera.yml) med git-SHA:t för varje main-push; Argo CD synkar
|
||||
# klustret från den här katalogen. Ändra aldrig taggar för hand —
|
||||
# rulla tillbaka genom att revertera commiten.
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- ../../k8s
|
||||
images:
|
||||
- name: ghcr.io/ORGANISATION/guidad-felsokning-web
|
||||
newName: ghcr.io/ersatt-mig/guidad-felsokning-web
|
||||
newTag: latest
|
||||
- name: ghcr.io/ORGANISATION/guidad-felsokning-ai-orkester
|
||||
newName: ghcr.io/ersatt-mig/guidad-felsokning-ai-orkester
|
||||
newTag: latest
|
||||
- name: ghcr.io/ORGANISATION/guidad-felsokning-plattform
|
||||
newName: ghcr.io/ersatt-mig/guidad-felsokning-plattform
|
||||
newTag: latest
|
||||
Reference in New Issue
Block a user