target-tracking-service는 deployment.yaml에 image: sm010422/target-tracking-service:v1로 태그가 고정돼 있어서, 코드를 고쳐 Docker Hub에 새 이미지를 올려도 인프라 리포의 태그 문자열이 그대로면 ArgoCD가 diff를 못 찾아 자동 반영이 안 됐다. 태그를 바꿀 때마다 deployment.yaml을 손으로 고쳐 커밋하는 걸 없애기 위해 ArgoCD Image Updater를 붙인 기록.

1. 배경 — 왜 필요했나

2. 전체 파이프라인

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 클러스터에 새 이미지로 롤아웃

2.1 두 리포 연결 관련 코드 위치

파이프라인이 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다.

3. CI 파이프라인 (target-tracking-service 리포)

.github/workflows/deploy.yml 신규 작성. 기존 다른 프로젝트(travel-core-service)의 워크플로우를 참고했으나 다음을 이 리포 구조에 맞게 바꿈:

시크릿: DOCKERHUB_USERNAME, DOCKERHUB_TOKEN을 gh secret set으로 등록. GitHub 시크릿은 리포 단위로 격리되고 공유되지 않는다.

흔한 실수: docker/build-push-action@v5의 Dockerfile 경로 입력 파라미터는 dockerfile이 아니라 file이다. dockerfile: Dockerfile로 잘못 써도 액션이 그냥 무시하고 컨텍스트 기본 위치의 Dockerfile을 쓰기 때문에 에러 없이 넘어가서 눈치채기 어렵다.

4. ArgoCD Image Updater 설치