Założenia wstępne do wdrożenia Argo CD
- OKD 4.19
- GitLab: https://gitlab.okdlab.local
- Repo na GitLab : https://gitlab.okdlab.local/dev-ops/healthlog-gui.git
- Repo na bastion: /repo/git/healthlog-gui
- Namespace Argo (OpenShift GitOps) : argocd
Twoje docelowe namespace’y aplikacji:
- healthlog-helm-dev
- healthlog-helm-prod
W OpenShift GitOps, żeby Argo mogło zarządzać innym namespace’em, musi on mieć label argocd.argoproj.io/managed-by=openshift-gitops.
Struktura repo na bastion
/repo/git/healthlog-gui
├── argocd
│ ├── app-healthlog-gui-dev.yaml
│ ├── app-healthlog-gui-prod.yaml
│ └── project-healthlog.yaml
├── argocd-bootstrap
│ └── bootstrap-app.yaml
├── Dockerfile
├── helm
│ ├── Chart.yaml
│ ├── templates
│ │ ├── configmap.yaml
│ │ ├── deployment.yaml
│ │ ├── route.yaml
│ │ ├── secret.yaml
│ │ └── service.yaml
│ └── values.yaml
├── index.php
└── kustomize
├── base
│ └── kustomization.yaml
└── overlays
├── dev
│ ├── kustomization.yaml
│ └── values-dev.yaml
└── prod
├── kustomization.yaml
└── values-prod.yamlInstalacja Argo CD na OKD (OpenShift GitOps)

W konsoli graficznej OKD 4.19 wybieramy z menu Operators -> OperatorHub i wpisujemy GitOps. Wybieramy Argo CD (Community)

Potwierdzamy przyciskiem Install

Ustawienia polecane:
Update channel: alpha
(bo tylko to jest dostępne)
Version: 0.17.0
Installation mode: All namespaces on the cluster (default)
To jest najlepsze na start, bo operator będzie mógł tworzyć instancje Argo CD w wybranych namespace’ach bez dodatkowych ograniczeń.
Installed Namespace: openshift-operators
To jest standardowy namespace dla operatorów “cluster-wide”.
Update approval: Automatic
Na labie najwygodniej.
Sama instalacja operatora nie uruchomi jeszcze Argo CD — operator tylko dodaje CRD i kontroler. Potem musisz stworzyć instancję Argo CD (zasób ArgoCD).
# Sprawdź, czy operator się zainstalował oc get csv -n openshift-operators | grep -i argo argocd-operator.v0.17.0 Argo CD 0.17.0 argocd-operator.v0.16.0 Succeeded # Utwórz namespace dla Argo CD (np.argocd) mkdir /repo/argocd nano /repo/argocd/argocd-instance.yaml
apiVersion: argoproj.io/v1alpha1
kind: ArgoCD
metadata:
name: argocd
namespace: argocd
spec: {}Utwórz instancję Argo CD (CR) w tym namespace
oc apply -f /repo/argocd/argocd-instance.yaml
Sprawdzamy czy Argo CD wstało
oc get pods -n argocd NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 2m14s argocd-redis-7896fc99b6-p2xb6 1/1 Running 0 2m14s argocd-repo-server-79cc9769f6-b2dq6 1/1 Running 0 2m14s argocd-server-5fd7b445df-bknjq 1/1 Running 0 2m14s
Wystawienie UI Argo CD (Route)
oc -n argocd get svc argocd-server -o yaml | egrep -n 'port:|targetPort:|name:'
6: service.beta.openshift.io/serving-cert-secret-name: argocd-server-tls
12: app.kubernetes.io/name: argocd-server
14: name: argocd-server
21: name: argocd
34: - name: http
35: port: 80
37: targetPort: 8080
38: - name: https
39: port: 443
41: targetPort: 8080
43: app.kubernetes.io/name: argocd-server
# Utwórz route typu edge na port http
oc -n argocd create route edge argocd-server --service=argocd-server --port=http
oc get route -n argocd
# przeglądarka wywala ERR_TOO_MANY_REDIRECTS
# - ArgoCD jest skonfigurowane z --insecure / bez TLS “po stronie serwera”
# - Route robi TLS (edge) i przekazuje HTTP do backendu,
# - ArgoCD próbuje wymusić https/redirect w sposób, który wchodzi w pętlę.
oc -n argocd get cm | grep -E 'cmd-params|argocd-cm|argocd.*cm'
argocd-cm 15 22m
argocd-cmd-params-cm 1 22m
argocd-gpg-keys-cm 0 22m
argocd-rbac-cm 3 22m
argocd-ssh-known-hosts-cm 1 22m
argocd-tls-certs-cm 0 22m
oc -n argocd patch cm argocd-cmd-params-cm --type merge -p '{
"data": {
"server.insecure": "true"
}
}'
configmap/argocd-cmd-params-cm patched
# zły publiczny URL
# w cm argocd-cm jest url: https://argocd-server
HOST=$(oc -n argocd get route argocd-server -o jsonpath='{.spec.host}')
echo $HOST
oc -n argocd patch cm argocd-cm --type merge -p "{\"data\": {\"url\": \"https://$HOST\"}}"
# weryfikacja zmian w cm
oc -n argocd get cm argocd-cm -o jsonpath='{.data.url}{"\n"}'
# Włącz server.insecure=true w cmd params
oc -n argocd patch cm argocd-cmd-params-cm --type merge -p '{"data":{"server.insecure":"true"}}'
oc -n argocd rollout restart deploy/argocd-server
oc -n argocd create route edge argocd-server --service=argocd-server --port=http
oc get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-metrics ClusterIP 172.30.238.43 <none> 8082/TCP 3m51s
argocd-redis ClusterIP 172.30.77.193 <none> 6379/TCP 3m51s
argocd-repo-server ClusterIP 172.30.86.53 <none> 8081/TCP,8084/TCP 3m51s
argocd-server ClusterIP 172.30.81.250 <none> 80/TCP,443/TCP 3m51s
argocd-server-metrics ClusterIP 172.30.9.26 <none> 8083/TCP 3m51s
# Procedura naprawcza III Włącz Route w CR ArgoCD
oc -n argocd patch argocd argocd --type merge -p '{
"spec": {
"server": {
"route": {
"enabled": true
}
}
}
}'
oc -n argocd get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
argocd-server argocd-server-argocd.apps.testcluster.okdlab.local argocd-server https reencrypt/Redirect None
# Ustaw server.insecure=true w sposób “operator-safe”
oc -n argocd patch cm argocd-cmd-params-cm --type merge -p '{"data":{"server.insecure":"true"}}'
oc -n argocd rollout restart deploy/argocd-server
# Po włączeniu route operator często sam ustawia url na adres route. Sprawdź:
[bastuser@bastion argocd]$ oc -n argocd get cm argocd-cm -o jsonpath='{.data.url}{"\n"}'
https://argocd-server-argocd.apps.testcluster.okdlab.localUstawienie hasła admina
NEWPASS='1234abcd.'
htpasswd -nbBC 10 "" "$NEWPASS" | tr -d ':\n' ; echo
$2y$10$IvDlnNG5yz/j/gAjPK1O7OEQwKxYfiHItft3NgR1rHaDdij/LA6QO
HASH='$2y$10$IvDlnNG5yz/j/gAjPK1O7OEQwKxYfiHItft3NgR1rHaDdij/LA6QO'
oc patch secret argocd-secret -n argocd --type merge -p "{\"stringData\": {\"admin.password\": \"${HASH}\", \"admin.passwordMtime\": \"$(date -Iseconds)\"}}"
secret/argocd-secret patched
# Zrestartuj argocd-server, żeby na pewno załapał
oc rollout restart deploy/argocd-server -n argocdZalogowanie się do Argo CD UI

Wchodzimy na adres https://argocd-server-argocd.apps.testcluster.okdlab.local/
Login: admin
Hasło: 1234abcd. (ustawione powyżej)

Po poprawnym zalogowaniu pokaże się główna strona Argo CD.
Dodaj cert GitLaba do ArgoCD (żeby HTTPS działał z self-signed)
# na maszynie gitlab
sudo cat /etc/gitlab/ssl/gitlab.okdlab.local.crt
# Wklej cert do ConfigMap ArgoCD, dodaj nowe pole data:
oc -n argocd edit cm argocd-tls-certs-cm
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: "2026-02-19T17:30:42Z"
labels:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: argocd-tls-certs-cm
app.kubernetes.io/part-of: argocd
operator.argoproj.io/tracked-by: argocd
name: argocd-tls-certs-cm
namespace: argocd
ownerReferences:
- apiVersion: argoproj.io/v1beta1
blockOwnerDeletion: true
controller: true
kind: ArgoCD
name: argocd
uid: c725395d-a1bc-45cc-87e1-6b5cdf1536e9
resourceVersion: "4734041"
uid: 718f81ac-10df-4ac8-a8ab-03de622527df
data:
gitlab.okdlab.local: |
-----BEGIN CERTIFICATE-----
MIIFHTCCAwWgAwIBAgIUJoHDYEJH/9QHqyB7WAIKOmyZ6MowDQYJKoZIhvcNAQEL
BQAwHjEcMBoGA1UEAwwTZ2l0bGFiLm9rZGxhYi5sb2NhbDAeFw0yNjAyMTkxNDEw
MDVaFw0yODA1MjQxNDEwMDVaMB4xHDAaBgNVBAMME2dpdGxhYi5va2RsYWIubG9j
YWwwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0rUagg6wGHVw7lstv
75SdwUrdm1sK9ayt1kGs9vO5XK4cGKqVmd/pnPzCwac+TDiX+a9SdrGTRnrOEZNA
zdKgf1rUqK1l0W0yvYHkhOSOtTyqAsftPh9HHxOpmALEcw4dsyFsThLbZus8Elz8
GaTHxVoL6l8Fx7N55sJOh35PLSMGfuWw78pxUQzrHz8i98fAYpmCOCEq+74UMSV3
ztjFLhYXMhX0ha+OXBP7ag8gUvcdKTiPPBXm1lK0JFqpVecvTussIhGCCE+Ue3Ku
i8Vugx2uh9cyT2JZ2cax0Rt/d9/pGeKHI3LJ+llK0Cf5KUpSjGBypZXaYaKCj5K9
o2ndfuEjGvBGTxOjMWeGhlu+ItGdpSNW89R9EJkmoXsXXgLRZpv6RLyAQtBF8OP3
UM4dhsayTXzEQ0p51L+lEMntZAYxai8Cfkpq0HX0mNFXptGI/jY8TfkOxQVwCJDx
iluteQrjwsItGYxxcMtUnQ5ADdX4iO206lNLyTzUzVfTJHjj9hHSOkeCjrlAKmly
YLPtLW00/qxNOh5AHEpwDosXR8YbnvT8vPFRt8LERp0H2S0qwt0Uw8eLeg2bRXo0
xwNN2UPFm24sOGyXPZ0auql/pMml4nKtx0uRZjs9zudVTmtBMbSXU25xuVMPDMIN
gkkhBaeUOV2pPWBNxnwyBVU8PQIDAQABo1MwUTAdBgNVHQ4EFgQUzdHN6Zk9yeDu
jeR0q1HVjxnTWnowHwYDVR0jBBgwFoAUzdHN6Zk9yeDujeR0q1HVjxnTWnowDwYD
VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAmXQfnmQdpyw9q04xEUM4
6bg5Fuh6mCZoGD1Uy7ldrumqlcEMLPc91rNcCtMihPE2tfLAp9i+1cozVPb5+8Bw
8bTOzNQd5mZs9X/RD6EifUs2W5czxXk3d30VWSFFQjX3zyXrPOSx1dSBneAS26c0
pikHUKQreEWs3vvEJhgPcHOZWn+I5AMPvYIb0gmWJ8BcwqE9TJ6k6cmqTYcqMiiQ
SqrhgUXD++geXXR3G25b06xe/J/p8bFYDfs9ublQu6wMfTb7MRNRlS/V98kVMH5b
kJR7RmUFI1RBa15pWULp7vh+9F0KetTDT1aL/7bvF/eMA1kSK3dZot+ssmcXsHyE
KJWQeS94SBo1sJSGPztrKn1C+2ddmLVgwHaK3KArLWOoi9hrK/Cc0xySdDdISLS2
TiGWg7AZ0mGGmYrHOJ/vmLD+2FbeHAODupafCZ2TCNC13qUZ+zfHrqM3R0UitOpj
6dQ+rzkkLFL0i2i5sMx3foUpBlK7Awj2fTyAGl3YBvRENBlI8QwjFb+6Zaw8NuNp
jegZzSY2LFr0g4c1swuTuj6NSVurrjfmdiBsUL4HQ4mKVa/nuE46Xq8GKBzpDD4d
GhZZ7yZUXIEFytsLQ/r06aM1O1YgwVi4TK+51BrWMEacEiEa8wBcVo/zAh2ap9Yi
1KhX1d5AIPu6uNSg3oB9ZGg=
-----END CERTIFICATE-----
# Po zapisaniu CM: restart repo-server
oc -n argocd rollout restart deploy/argocd-repo-server
# weryfikacja
oc -n argocd get cm argocd-tls-certs-cm -o yaml | sed -n '1,160p'Dodaj dostęp do prywatnego repo w GitLab (repo-creds secret)
PAT potrzebny w polu password wygenerowaliśmy we wpisie https://itadmin.vblog.ovh/klaster-okd-4-19-openshift-serwer-gitlab-pod-argo-cd-i-okd/#Konfiguracja_pod_Argo_CD_OKD_419_repo_access_token
apiVersion: v1
kind: Secret
metadata:
name: repo-gitlab-devops-creds
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repo-creds
type: Opaque
stringData:
url: https://gitlab.okdlab.local/dev-ops
username: argocd
password: glpat-_PrgXNpNHAimlj1YpTYIUm86MQp1OjUH.01.0w08mf9ogoc apply -f /repo/argocd/repo-gitlab-devops-creds.yaml # Sprawdź, czy secret istnieje: oc -n argocd get secret repo-gitlab-devops-creds -o yaml | egrep -i 'name:|secret-type|url:|username:'
Przygotuj namespace’y docelowe (dev/prod) pod ArgoCD
Wskazujemy, którymi projektami będzie zarządzać Argo CD
# Upewnij się, że istnieją: oc get ns healthlog-helm-dev >/dev/null 2>&1 || oc new-project healthlog-helm-dev oc get ns healthlog-helm-prod >/dev/null 2>&1 || oc new-project healthlog-helm-prod # Daj label “managed-by” wskazujący namespace ArgoCD (argocd) oc label ns healthlog-helm-dev argocd.argoproj.io/managed-by=argocd --overwrite oc label ns healthlog-helm-prod argocd.argoproj.io/managed-by=argocd --overwrite
Podmiana openshift-gitops → argocd w repo
Obecnie plikach yaml w/repo/git/healthlog-gui występuje namespace openshift-gitops, który trzeba zamienić na argocd
cd /repo/git/healthlog-gui grep -R "namespace:" -n argocd argocd-bootstrap argocd/project-healthlog.yaml:5: namespace: openshift-gitops argocd/project-healthlog.yaml:11: - namespace: healthlog-helm-dev argocd/project-healthlog.yaml:13: - namespace: healthlog-helm-prod argocd/app-healthlog-gui-dev.yaml:5: namespace: openshift-gitops argocd/app-healthlog-gui-dev.yaml:18: namespace: healthlog-helm-dev argocd/app-healthlog-gui-prod.yaml:5: namespace: openshift-gitops argocd/app-healthlog-gui-prod.yaml:18: namespace: healthlog-helm-prod argocd-bootstrap/bootstrap-app.yaml:5: namespace: openshift-gitops argocd-bootstrap/bootstrap-app.yaml:16: namespace: openshift-gitops cd /repo/git/healthlog-gui sed -i 's/namespace: openshift-gitops/namespace: argocd/g' argocd/*.yaml argocd-bootstrap/*.yaml grep -R "namespace:" -n argocd argocd-bootstrap argocd/project-healthlog.yaml:5: namespace: argocd argocd/project-healthlog.yaml:11: - namespace: healthlog-helm-dev argocd/project-healthlog.yaml:13: - namespace: healthlog-helm-prod argocd/app-healthlog-gui-dev.yaml:5: namespace: argocd argocd/app-healthlog-gui-dev.yaml:18: namespace: healthlog-helm-dev argocd/app-healthlog-gui-prod.yaml:5: namespace: argocd argocd/app-healthlog-gui-prod.yaml:18: namespace: healthlog-helm-prod argocd-bootstrap/bootstrap-app.yaml:5: namespace: argocd argocd-bootstrap/bootstrap-app.yaml:16: namespace: argocd
Commit + push zmian do GitLaba
cd /repo/git/healthlog-gui git add . git commit -m "Switch Argo CD namespace from openshift-gitops to argocd" [main 616163c] Switch Argo CD namespace from openshift-gitops to argocd 4 files changed, 5 insertions(+), 5 deletions(-) [bastuser@bastion healthlog-gui]$ git push Enumerating objects: 15, done. Counting objects: 100% (15/15), done. Delta compression using up to 4 threads Compressing objects: 100% (7/7), done. Writing objects: 100% (8/8), 707 bytes | 707.00 KiB/s, done. Total 8 (delta 5), reused 0 (delta 0), pack-reused 0 (from 0) To https://gitlab.okdlab.local/dev-ops/healthlog-gui.git 0309627..616163c main -> main
Zmiana repoURL w YAML-ach w repo (dev-ops)
Wysyłam git push https://gitlab.okdlab.local/dev-ops/healthlog-gui.git a Argo CD Bootstrap próbuje https://gitlab.okdlab.local/healthlog/healthlog-gui.git
cd /repo/git/healthlog-gui
[bastuser@bastion healthlog-gui]$ grep -R "gitlab.okdlab.local/" -n argocd argocd-bootstrap
argocd/project-healthlog.yaml:9: - https://gitlab.okdlab.local/healthlog/healthlog-gui.git
argocd/app-healthlog-gui-dev.yaml:9: repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git
argocd/app-healthlog-gui-prod.yaml:9: repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git
argocd-bootstrap/bootstrap-app.yaml:9: repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git
sed -i 's#https://gitlab\.okdlab\.local/healthlog/healthlog-gui\.git#https://gitlab.okdlab.local/dev-ops/healthlog-gui.git#g' \
argocd/*.yaml argocd-bootstrap/*.yaml
grep -R "repoURL:" -n argocd argocd-bootstrap
# Commit + push
cd /repo/git/healthlog-gui
git add .
git commit -m "Fix repoURL to dev-ops group for Argo CD apps"
git push
# Odśwież ArgoCD -> healthlog-gui-bootstrap kliknij REFRESH potem SYNC lub z liini poleceń
oc -n argocd get application healthlog-gui-bootstrap -o jsonpath='{.spec.source.repoURL}{"\n"}'Zastosowanie bootstrap z lokalnego pliku
oc apply -n argocd -f /repo/git/healthlog-gui/argocd-bootstrap/bootstrap-app.yaml oc -n argocd get applications
# błąd oznacza brak SAN w cercie gitlaba oc -n argocd edit cm argocd-tls-certs-cm Failed to load target state: failed to generate manifest for source 1 of 1: rpc error: code = Unknown desc = failed to list refs: Get "https://gitlab.okdlab.local/healthlog/healthlog-gui.git/info/refs?service=git-upload-pack": tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead
# błąd niepoprawnego adresu git-a Failed to load target state: failed to generate manifest for source 1 of 1: rpc error: code = Unknown desc = failed to list refs: authentication required: HTTP Basic: Access denied. If a password was provided for Git authentication, the password was incorrect or you're required to use a token instead of a password. If a token was provided, it was either incorrect, expired, or improperly scoped. See https://gitlab.okdlab.local/help/topics/git/troubleshooting_git.md#error-on-git-fetch-http-basic-access-denied
oc -n argocd get application healthlog-gui-bootstrap -o yaml | egrep -n 'repoURL:|path:|targetRevision:'
19: path: argocd
20: repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git
21: targetRevision: main
47: path: argocd
48: repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git
49: targetRevision: main
# patch zmieniajacy adres repo
oc -n argocd patch application healthlog-gui-bootstrap --type merge -p '{
"spec": {
"source": {
"repoURL": "https://gitlab.okdlab.local/dev-ops/healthlog-gui.git"
}
}
}'
# Wymuś odświeżenie aplikacji bootstrap
oc -n argocd annotate application healthlog-gui-bootstrap \
argocd.argoproj.io/refresh=hard --overwriteWykorzystanie obecnego środowiska CD (bez CI)

GitLab jest źródłem prawdy (desired state) dla manifestów.
ArgoCD non-stop robi reconcile: porównuje stan w klastrze z Gitem i (jeśli masz auto-sync) doprowadza klaster do tego co jest w repo.
To jest esencja GitOps.
Czy “git push” faktycznie coś zmieni w klastrze?
Jeśli zmienisz pliki, które ArgoCD śledzi (path + branch) i zrobisz git push, Argo:
wykryje commit (polling co chwilę; webhook możesz dodać później),
pokaże aplikację jako OutOfSync,
i jeśli masz włączone Auto-Sync, to sam wdroży zmiany,
jeśli nie masz auto-sync → klikniesz SYNC.
Najważniejsze ograniczenie (bez Jenkinsa / CI)
ArgoCD nie buduje obrazów.
Czyli możesz wdrażać:
zmiany w ConfigMap/Secrets/Route/Service/Deployment,
zmiany wartości Helm (np. env, replicas),
zmiany kustomize patchy,
zmiany namespaces / RBAC (jeśli masz to w repo),
ALE jeśli zmienisz index.php i zrobisz git push, to:
sam kod nie pojawi się w działającym podzie, dopóki nie zbudujesz nowego obrazu i nie zmienisz tagu w Deployment (lub nie odświeżysz ImageStream w OKD, jeśli tak to masz).
Bez CI masz dwie opcje:
Opcja A — “ręczny build + GitOps deploy”
robisz oc start-build …
obraz dostaje nowy tag (np. :latest lub lepiej :build-20260219-1)
w Git zmieniasz image: w values-dev/values-prod (albo w chart values)
git push → Argo wdraża nowy obraz
to jest najbardziej przewidywalne.
Opcja B — dalej używasz :latest
budujesz :latest,
a potem robisz w Git np. zmianę “dummy” żeby wymusić rollout,
lub w Deployment ustawisz imagePullPolicy: Always (średnio polecam na OKD),
albo robisz oc rollout restart deploy/… (ale to już nie GitOps-only).
Co możesz osiągnąć już teraz (bez CI)
A) Stabilne DEV/PROD z różnymi ustawieniami
Masz już values-dev.yaml i values-prod.yaml.
Możesz różnicować:
liczba replik
limity CPU/RAM
host route (np. healthlog-dev.apps… vs healthlog.apps…)
konfiguracja app (URL backendu, feature flags)
sekrety (patrz niżej)
Zasada: DEV zmieniasz szybciej, PROD wolniej (np. manual sync).
B) Pełna historia zmian i rollback
W ArgoCD masz:
historię synców
diff “co się zmieniło”
rollback do wcześniejszego commita/rewizji
To jest ogromny plus bez żadnych dodatkowych narzędzi.
C) Drift detection (ktoś kliknie oc edit i popsuje)
Jeśli ktoś ręcznie zmieni Deployment w klastrze:
Argo pokaże drift (OutOfSync)
i (przy auto-sync) cofnie zmianę do tego co w Git
To jest “strażnik porządku”.
Scenariusz I – zmiana w konfiguracji projektu
Co zostanie zmienione ?
Wartości w /repo/git/healthlog-gui/kustomize/overlays/prod/values-prod.yaml
Co się realnie stanie po zmianie values-prod.yaml?
values-prod.yaml to input do renderowania Helm chartu (wartości).
Jeśli healthlog-gui-prod jest skonfigurowany tak, że używa chartu z helm/ i w Application ma helm.valueFiles: [kustomize/overlays/prod/values-prod.yaml]
to po zmianie pliku ArgoCD:
- pobierze nowy commit z GitLaba,
- wyrenderuje Helm na serwerze repo-server (w klastrze),
- porówna wynik z tym co jest w OKD,
- i wdroży różnice (sync).
W values-prod.yaml masz HL_GUI_SHOW_ENVIRONMENT_VARIABLES: „0”
Ale w chart’cie Helm nie ma ani jednego miejsca, które używa tego klucza (grep w helm/templates nic nie znalazł)
Czyli ArgoCD robi dokładnie to, co powinien:
pobiera nowy commit,
renderuje Helm,
a wynik manifestów jest taki sam jak wcześniej,
więc aplikacja zostaje Synced i auto-sync nie ma czego wdrażać.
Żeby to działało, musisz sprawić, aby ta wartość z values-prod.yaml wpływała na manifesty — najprościej: wstrzyknąć ją jako zmienną środowiskową do kontenera albo do ConfigMap
cd /repo/git/healthlog-gui nano kustomize/overlays/prod/values-prod.yaml # Zmieniasz np.: # replicaCount # resources # zmienne env w configmapie jeśli chart je używa # host route # image tag (ważne przy deployu nowej wersji) cd /repo/git/healthlog-gui git add . git commit -m "prod: usatwiono HL_GUI_SHOW_ENVIRONMENT_VARIABLES: 1" # Nie uruchamiasz już ręcznie helm ani oc apply

Po jakimś czasie pojawi się informacja Synced i podany Autor oraz Komentarz z ostatniego git commit. Argo wykrywa więc zmiany ale ich nie wdraża automatycznie.
W tym momencie trzeba jeszcze ręcznie wykonać Sync dla aplikacji ealthlog-gui-prod, wchodząc w nią i klikając na Sync.

Po jakimś czasie pojawi się informacja Synced i podany Autor oraz Komentarz z ostatniego git commit. Argo wykrywa więc zmiany ale ich nie wdraża automatycznie.
W tym momencie trzeba jeszcze ręcznie wykonać Sync dla aplikacji ealthlog-gui-prod, wchodząc w nią i klikając na Sync.
# bez czekania, robisz hard refresh: oc -n argocd annotate app healthlog-gui-prod argocd.argoproj.io/refresh=hard --overwrite # podgląd zdarzeń sync oc -n argocd describe app healthlog-gui-prod | sed -n '/Events:/,$p' Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal OperationStarted 43m argocd-application-controller Initiated automated sync to 'f985a9324d2217609ce8e6c78ea680cd4ef814cd' Normal ResourceUpdated 43m argocd-application-controller Updated sync status: Synced -> OutOfSync Normal OperationCompleted 43m argocd-application-controller Sync operation to f985a9324d2217609ce8e6c78ea680cd4ef814cd succeeded Normal ResourceUpdated 43m argocd-application-controller Updated sync status: OutOfSync -> Synced Normal ResourceUpdated 43m argocd-application-controller Updated health status: Healthy -> Progressing Normal ResourceUpdated 43m argocd-application-controller Updated health status: Progressing -> Healthy Normal OperationStarted 37m argocd-application-controller Initiated automated sync to 'af8b5d0c3fa1fc77d56dc2065f8d25c60f630050' Normal ResourceUpdated 37m argocd-application-controller Updated sync status: Synced -> OutOfSync Normal OperationCompleted 37m argocd-application-controller Sync operation to af8b5d0c3fa1fc77d56dc2065f8d25c60f630050 succeeded Normal ResourceUpdated 37m argocd-application-controller Updated sync status: OutOfSync -> Synced Normal ResourceUpdated 37m argocd-application-controller Updated health status: Healthy -> Progressing Normal ResourceUpdated 37m argocd-application-controller Updated health status: Progressing -> Healthy Normal OperationStarted 7m21s argocd-application-controller Initiated automated sync to '24cb2cdcbdcaf906d813eb92bd2c4ad6e3718d01' Normal ResourceUpdated 7m21s argocd-application-controller Updated sync status: Synced -> OutOfSync Normal OperationCompleted 7m20s argocd-application-controller Sync operation to 24cb2cdcbdcaf906d813eb92bd2c4ad6e3718d01 succeeded Normal ResourceUpdated 7m20s argocd-application-controller Updated sync status: OutOfSync -> Synced Normal ResourceUpdated 7m20s argocd-application-controller Updated health status: Healthy -> Progressing Normal ResourceUpdated 7m7s argocd-application-controller Updated health status: Progressing -> Healthy
Scenariusz II – zmiana w kodzie aplikacji
Zmieniamy kod naszej aplikacji w index.php ew.Dockerfile i chcemy ją przetestować w aplikacji healthlog-gui-dev. Przyjmujemy, że będziemy używać wersji 1.0.2 i taki tag nadamy obrazowi.
# wrzucamy zmiany index.php do GitLab, mimo że obraz budujemy ręcznie ale warto mieć spójne źródło prawdy
cd /repo/git/healthlog-gui
# edycja
nano index.php
git add index.php Dockerfile
git commit -m "gui: change zmiana wyglądu"
git push
# zbuduj nowy obraz w DEV (OpenShift BuildConfig)
cd /repo/git/healthlog-gui
oc -n healthlog-helm-dev start-build healthlog-gui --from-dir=. --follow
oc -n healthlog-helm-dev tag healthlog-gui:latest healthlog-gui:1.0.2
# sprawdź ImageStream
oc -n healthlog-helm-dev get is healthlog-gui -o jsonpath='{range .status.tags[*]}{.tag}{"\n"}{end}'
1.0.2
latest
# zmieniamy tag tylko dla dev w kustomize/overlays/dev/values-dev.yaml
nano kustomize/overlays/dev/values-dev.yaml
...
image:
# jeśli budujesz obraz w tym samym projekcie, najlepiej używać wewnętrznego registry
repository: image-registry.openshift-image-registry.svc:5000/healthlog-helm-dev/healthlog-gui
tag: 1.0.3
...
# zapisujemy, commit+push:
git add kustomize/overlays/dev/values-dev.yaml
git commit -m "dev: deploy image 1.0.3"
git push
Po kilku minutach następuje Out of sync, później sync i podłączenie nowego obrazu aplikacji.

Widać zmiany w kodzie czyli np. ostatnie 4 pozycje z tabeli oraz wersję 1.0.3 na dole i w polu Zmienne środowiskowe
Scenariusz III – ręczne usunięcie projektu
# ktoś nieopatrznie usuwa cały projekt
oc delete project healthlog-helm-dev
# zakładamy go wiec od nowa
oc new-project healthlog-helm-dev
# Nadaj ArgoCD uprawnienia do namespace DEV
# Teraz Argo będzie miał prawo tworzyć zasoby w healthlog-helm-dev
oc adm policy add-role-to-user admin \
system:serviceaccount:argocd:argocd-application-controller \
-n healthlog-helm-dev
# potrzebne do “exec/portforward”, ale do deploy zwykle nie
oc adm policy add-role-to-user admin \
system:serviceaccount:argocd:argocd-server \
-n healthlog-helm-dev
# sprawdzamy czy aplikacja DEV w Argo ma poprawny destination namespace. Powinno być: healthlog-helm-dev
oc -n argocd get app healthlog-gui-dev -o jsonpath='{.spec.destination.namespace}{"\n"}'
healthlog-helm-dev
# Dodaj label “managed-by” do namespace DEV
oc label ns healthlog-helm-dev argocd.argoproj.io/managed-by=argocd --overwrite
# Największy brak po skasowaniu projektu: BuildConfig/ImageStream
oc new-build --name=healthlog-gui --binary --strategy=docker -n healthlog-helm-dev
cd /repo/git/healthlog-gui
# Zbuduj obraz z repo na bastionie
oc -n healthlog-helm-dev start-build healthlog-gui --from-dir=. --follow
# Nadaj tag zgodny z values-dev.yaml , ostatni tag ręczny
oc -n healthlog-helm-dev tag healthlog-gui:latest healthlog-gui:1.0.3
oc -n healthlog-helm-dev get is healthlog-gui -o jsonpath='{range .status.tags[*]}{.tag}{"\n"}{end}'
Argo zwykle samo zobaczy brak zasobów i zrobi self-heal, ale żeby nie czekać:
oc -n argocd annotate app healthlog-gui-dev argocd.argoproj.io/refresh=hard --overwrite
Po dłuższej chwili sprawdzamy
oc -n healthlog-helm-dev get all
W razie błędu: Failed to load live state: namespace „healthlog-helm-dev” for Secret „secret-healthlog-gui” is not managed
oc label ns healthlog-helm-dev argocd.argoproj.io/managed-by=argocd --overwrite

