target-tracking-service는 deployment.yaml에 image: sm010422/target-tracking-service:v1로 태그가 고정돼 있어서, 코드를 고쳐 Docker Hub에 새 이미지를 올려도 인프라 리포의 태그 문자열이 그대로면 ArgoCD가 diff를 못 찾아 자동 반영이 안 됐다. 태그를 바꿀 때마다 deployment.yaml을 손으로 고쳐 커밋하는 걸 없애기 위해 ArgoCD Image Updater를 붙인 기록.
apps/target-tracking-service/deployment.yaml의 imagePullPolicy: Always는 pod가 재시작될 때 최신 이미지를 다시 받아오게 할 뿐, ArgoCD가 알아서 재배포를 트리거해주지는 않음argocd/applications/target-tracking-service.yaml에 syncPolicy.automated(selfHeal: true)가 켜져 있어 이 인프라 리포의 git 상태는 자동 반영되지만, Docker Hub에 새 이미지를 올리는 것과 이 리포의 git 상태는 별개target-tracking-service 리포 push (main)
→ GitHub Actions (.github/workflows/deploy.yml)
→ Docker 이미지 빌드
→ Docker Hub push: sm010422/target-tracking-service:<git-sha>, :latest
→ ArgoCD Image Updater (2분 간격 폴링)
→ :latest 태그의 digest 변경 감지
→ k3s-msa-infrastructure 리포에 SSH로 커밋+push (kustomize edit set image)
→ ArgoCD (selfHeal: true)
→ git 변경 감지, 자동 sync
→ k3s 클러스터에 새 이미지로 롤아웃
파이프라인이 target-tracking-service(코드/CI)와 k3s-msa-infrastructure(배포/GitOps) 두 리포에 걸쳐 있어서, "연결"을 담당하는 코드가 각각 어디 있는지 정리:
<table header-row="true"><tr><td>리포</td><td>파일</td><td>역할</td></tr><tr><td>target-tracking-service</td><td>.github/workflows/deploy.yml</td><td>main에 src/, build.gradle, Dockerfile 등이 바뀌어 push되면 트리거. arm64 이미지 빌드 후 Docker Hub에 :{sha}, :latest 두 태그로 push</td></tr><tr><td>k3s-msa-infrastructure</td><td>argocd/image-updater.yaml</td><td>ImageUpdater CR. sm010422/target-tracking-service:latest의 digest 변화를 감지하는 설정 (4.3절)</td></tr><tr><td>k3s-msa-infrastructure</td><td>argocd/git-creds (Secret)</td><td>Image Updater가 write-back 커밋을 push할 때 쓰는 SSH Deploy Key. 리포 전용 키라 계정 전체가 아니라 이 리포에만 쓰기 권한 있음 (4.1절)</td></tr><tr><td>k3s-msa-infrastructure</td><td>apps/target-tracking-service/kustomization.yaml</td><td>Image Updater가 새 digest 감지 시 kustomize edit set image로 실제 이미지 참조를 고쳐 쓰는 대상. 없으면 Application의 source type이 Directory로 인식돼 write-back이 아예 안 됨 (4.2절)</td></tr><tr><td>k3s-msa-infrastructure</td><td>apps/target-tracking-service/deployment.yaml</td><td>최종적으로 적용되는 Deployment</td></tr><tr><td>k3s-msa-infrastructure</td><td>argocd/applications/target-tracking-service.yaml</td><td>ArgoCD Application 정의. syncPolicy.automated(selfHeal: true, prune: true)로 자동 반영</td></tr></table>
연결 관계 한 줄 요약: CI(deploy.yml)는 Docker Hub까지만 책임지고, Docker Hub와 k3s-msa-infrastructure 리포 사이를 이어주는 건 image-updater.yaml(감지) + git-creds(쓰기 권한) + kustomization.yaml(쓰기 대상)이고, k3s-msa-infrastructure 리포와 실제 클러스터 사이를 이어주는 건 applications/target-tracking-service.yaml의 syncPolicy.automated다.
.github/workflows/deploy.yml 신규 작성. 기존 다른 프로젝트(travel-core-service)의 워크플로우를 참고했으나 다음을 이 리포 구조에 맞게 바꿈:
branches: [ "main" ] — 참고 예시는 develop, 이 리포는 main만 씀context: . / file: Dockerfile — 이 리포는 services/xxx 하위구조가 아니라 루트에 Dockerfile${{ github.sha }} + latest 둘 다 push하도록 함시크릿: DOCKERHUB_USERNAME, DOCKERHUB_TOKEN을 gh secret set으로 등록. GitHub 시크릿은 리포 단위로 격리되고 공유되지 않는다.
흔한 실수: docker/build-push-action@v5의 Dockerfile 경로 입력 파라미터는 dockerfile이 아니라 file이다. dockerfile: Dockerfile로 잘못 써도 액션이 그냥 무시하고 컨텍스트 기본 위치의 Dockerfile을 쓰기 때문에 에러 없이 넘어가서 눈치채기 어렵다.