이번 글에서는
Docker 이미지 자동 빌드 → 레지스트리 업로드
→ Kubernetes YAML 자동 업데이트→ ArgoCD 자동 배포
CI/CD 파이프라인
을 구축해 보겠습니다.

[전체 아키텍처 흐름]
Code Push
→ GitHub Actions 실행
→ Docker 이미지 빌드
→ Docker Registry Push
→ k8s YAML 이미지 태그 자동 변경
→ Git Commit
→ ArgoCD Sync
→ Kubernetes 자동 배포
1단계. Docker Hub 계정 및 Access Token 생성
컨테이너 이미지를 저장할 저장소가 필요합니다.
여기서는 Docker에서 제공하는 Docker Hub를 사용합니다.
진행 방법
1. Docker Hub 회원가입 / 로그인
2. Profile → Account Settings → Security → New Access Token
3. Token 이름: github-actions
4. 권한: Read / Write
5. 생성 후 토큰 복사 (1회만 표시됨)

2단계. GitHub Secrets 등록
CI/CD가 Docker Hub에 로그인하려면 인증 정보가 필요합니다.
여기서는 GitHub Secrets 기능을 사용합니다.

- 등록 위치
Repository → Settings → Secrets and variables → Actions
- 생성할 Secret
Secret 이름값
| DOCKER_USERNAME | Docker Hub ID |
| DOCKER_PASSWORD | Docker Access Token |
->실제 Docker 비밀번호 ❌
-> Access Token 사용 ⭕
3단계. GitHub Actions CI 워크플로우 작성
- 파일 위치
.github/workflows/backend-ci.yml
<backend-ci.yml>
name: Backend CI/CD
on:
push:
branches: [ "main" ]
paths:
- 'services/product-service/**' # 백엔드 코드가 바뀔 때만 실행
- '.github/workflows/backend-ci.yml'
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 코드 체크아웃
- name: Checkout code
uses: actions/checkout@v3
# 2. Docker Hub 로그인
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 3. 이미지 태그 생성 (시간 기반 + 커밋 해시 앞 7자리)
- name: Set image tag
id: vars
run: echo "TAG=$(date +%s)-$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
# 4. Docker 이미지 빌드 및 푸시
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: ./services/product-service # Dockerfile이 있는 위치
push: true
# 주의: 본인 DockerHub ID로 변경 필요하지만, secrets를 썼다면 아래 형식 유지
tags: ${{ secrets.DOCKER_USERNAME }}/product-service:${{ steps.vars.outputs.TAG }}
# 5. k8s YAML 파일 수정 (이미지 태그 업데이트)
- name: Update Kubernetes Manifest
run: |
# k8s/backend.yaml 파일에서 image: 부분을 찾아서 새 태그로 변경
# 기존: image: product-service:local 또는 다른 태그
# 변경: image: dockerhub-id/product-service:새로운태그
cd k8s
sed -i "s|image: .*|image: ${{ secrets.DOCKER_USERNAME }}/product-service:${{ steps.vars.outputs.TAG }}|g" backend.yaml
# 변경 확인 (디버깅용)
cat backend.yaml
# 6. 변경된 YAML 파일을 GitHub에 다시 커밋 & 푸시
- name: Commit and Push changes
run: |
git config --global user.email "${{ secrets.DOCKER_USERNAME }}@users.noreply.github.com"
git config --global user.name "GitHub Actions"
git add backend.yaml
git commit -m "Update backend image tag to ${{ steps.vars.outputs.TAG }}"
git push
4단계. Kubernetes YAML 수정 (⭐ 중요)
- 변경 전 (로컬 이미지 사용)
image: product-service:local
imagePullPolicy: Never
- 변경 후 (Docker Hub 이미지 사용)
image: dockerhubID/product-service:init
imagePullPolicy: Always
+) imagePullPolicy 설명
| Always | 항상 최신 이미지 Pull |
| IfNotPresent | 없으면 Pull |
| Never | 절대 Pull 안함 |
👉 GitOps 환경에서는 보통
✔ Always
✔ IfNotPresent
사용
[전체 자동 배포 동작 시나리오]
1. 코드 수정
services/product-service/index.js 수정
2. Git Push
git add .
git commit
git push
3. CI 자동 실행
✔ Docker 이미지 빌드
✔ Docker Hub Push
✔ k8s YAML 자동 수정
✔ Git 자동 Commit
4. ArgoCD 자동 Sync
✔ Git 변경 감지
✔ 새 이미지 Pull
✔ Pod Rolling Update
실제 결과
Old Pod → Terminate
New Pod → Start (New Image)
Frontend도 자동화하려면?
- 변경 포인트

backend-ci.yml 복사 후 아래만 수정
| paths | apps/web-frontend/** |
| context | ./apps/web-frontend |
| tags | web-frontend 이미지명 |
| sed 대상 | frontend.yaml |

[핵심 포인트]
이 구조가 좋은 이유
1. 완전 자동 배포
2. 휴먼 실수 제거
3. 롤백 쉬움
4. 변경 이력 추적 가능
5. Git 기반 운영
한 줄 핵심 정리
Code Push → CI → Image Push → YAML 변경 → Git Push → ArgoCD Sync → 자동 배포
'Cloud > CICD' 카테고리의 다른 글
| [CICD] Github Token 생성 (0) | 2026.03.03 |
|---|---|
| [CICD] GitOps 환경구축 #1 (Github Actions) (0) | 2026.02.20 |
| [CICD] GitOps 환경구축 (ECR) (0) | 2026.02.15 |
| [CICD] Local GitOps 환경 구축 #1 (0) | 2026.02.13 |