본문 바로가기
Cloud/CICD

[CICD] Local GitOps 환경 구축 #2

by Tenma2 2026. 2. 14.
이번 글에서는

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