diff --git a/.github/workflows/publicera.yml b/.github/workflows/publicera.yml new file mode 100644 index 0000000..d25a23e --- /dev/null +++ b/.github/workflows/publicera.yml @@ -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 diff --git a/docs/DRIFT.md b/docs/DRIFT.md index 3492fe8..c8b4a0b 100644 --- a/docs/DRIFT.md +++ b/docs/DRIFT.md @@ -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. diff --git a/infra/gitops/argocd-application.yaml b/infra/gitops/argocd-application.yaml new file mode 100644 index 0000000..3e548fc --- /dev/null +++ b/infra/gitops/argocd-application.yaml @@ -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 diff --git a/infra/overlays/produktion/kustomization.yaml b/infra/overlays/produktion/kustomization.yaml new file mode 100644 index 0000000..9340856 --- /dev/null +++ b/infra/overlays/produktion/kustomization.yaml @@ -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