[{"data":1,"prerenderedAt":379},["ShallowReactive",2],{"post-document:\u002Fdevops\u002Fci-cd\u002F2026\u002F08\u002F17\u002Fci-cd-03-gitops-deployment\u002F":3},{"id":4,"title":5,"body":6,"categories":357,"date":360,"description":361,"extension":362,"image":363,"key_concepts":363,"last_modified_at":363,"legacyPath":364,"meta":365,"navigation":77,"part":237,"path":367,"published":77,"robots":363,"seo":368,"series":369,"stem":370,"strengths":363,"summary":363,"tags":371,"tradeoffs":363,"__hash__":378},"posts\u002Fposts\u002FCI-CD-Docker\u002FCI-CD\u002F2026-08-17-ci-cd-03-gitops-deployment.md","CI\u002FCD 기초 3편: Jenkins와 Argo CD를 이용한 GitOps 배포",{"type":7,"value":8,"toc":352},"minimark",[9,14,18,180,188,288,293,332,348],[10,11,13],"h2",{"id":12},"참고-cicdcontinuous-integration-continuous-deployment","참고: CI\u002FCD(Continuous Integration & Continuous Deployment)",[15,16,17],"p",{},"애플리케이션을 컨테이너 이미지로 Build, Push한 후 실행 환경에 배포하는 흐름이다.",[19,20,25],"pre",{"className":21,"code":22,"language":23,"meta":24,"style":24},"language-mermaid shiki shiki-themes github-light github-dark","flowchart LR\n    DEV[개발자\u003Cbr\u002F>코드 작성]\n    SRC[(Source Repository\u003Cbr\u002F>애플리케이션 소스 코드)]\n    CI[Jenkins\u003Cbr\u002F>CI\u002FCD Pipeline]\n    REG[(Docker Registry\u003Cbr\u002F>컨테이너 이미지 저장)]\n    GITOPS[(GitOps Repository\u003Cbr\u002F>배포 설정 저장)]\n    ARGO[Argo CD\u003Cbr\u002F>배포 상태 동기화]\n\n    subgraph K8S[Kubernetes 실행 환경]\n        DEV_CLUSTER[DEV Cluster\u003Cbr\u002F>개발 환경]\n        UAT_CLUSTER[UAT Cluster\u003Cbr\u002F>검증 환경]\n        RELEASE_CLUSTER[Release Cluster\u003Cbr\u002F>운영 환경]\n    end\n\n    DEV -->|1. Commit & Push| SRC\n    SRC -->|2. 변경 감지| CI\n    CI -->|3. Build & Push| REG\n    CI -->|4. Image Tag 등\u003Cbr\u002F>배포 값 변경| GITOPS\n    GITOPS -->|5. Webhook 또는 Poll| ARGO\n    ARGO -->|6. Sync| DEV_CLUSTER\n    ARGO -->|6. Sync| UAT_CLUSTER\n    ARGO -->|6. Sync| RELEASE_CLUSTER\n    REG -.->|7. Image Pull| DEV_CLUSTER\n    REG -.->|7. Image Pull| UAT_CLUSTER\n    REG -.->|7. Image Pull| RELEASE_CLUSTER\n","mermaid","",[26,27,28,36,42,48,54,60,66,72,79,85,91,97,103,109,114,120,126,132,138,144,150,156,162,168,174],"code",{"__ignoreMap":24},[29,30,33],"span",{"class":31,"line":32},"line",1,[29,34,35],{},"flowchart LR\n",[29,37,39],{"class":31,"line":38},2,[29,40,41],{},"    DEV[개발자\u003Cbr\u002F>코드 작성]\n",[29,43,45],{"class":31,"line":44},3,[29,46,47],{},"    SRC[(Source Repository\u003Cbr\u002F>애플리케이션 소스 코드)]\n",[29,49,51],{"class":31,"line":50},4,[29,52,53],{},"    CI[Jenkins\u003Cbr\u002F>CI\u002FCD Pipeline]\n",[29,55,57],{"class":31,"line":56},5,[29,58,59],{},"    REG[(Docker Registry\u003Cbr\u002F>컨테이너 이미지 저장)]\n",[29,61,63],{"class":31,"line":62},6,[29,64,65],{},"    GITOPS[(GitOps Repository\u003Cbr\u002F>배포 설정 저장)]\n",[29,67,69],{"class":31,"line":68},7,[29,70,71],{},"    ARGO[Argo CD\u003Cbr\u002F>배포 상태 동기화]\n",[29,73,75],{"class":31,"line":74},8,[29,76,78],{"emptyLinePlaceholder":77},true,"\n",[29,80,82],{"class":31,"line":81},9,[29,83,84],{},"    subgraph K8S[Kubernetes 실행 환경]\n",[29,86,88],{"class":31,"line":87},10,[29,89,90],{},"        DEV_CLUSTER[DEV Cluster\u003Cbr\u002F>개발 환경]\n",[29,92,94],{"class":31,"line":93},11,[29,95,96],{},"        UAT_CLUSTER[UAT Cluster\u003Cbr\u002F>검증 환경]\n",[29,98,100],{"class":31,"line":99},12,[29,101,102],{},"        RELEASE_CLUSTER[Release Cluster\u003Cbr\u002F>운영 환경]\n",[29,104,106],{"class":31,"line":105},13,[29,107,108],{},"    end\n",[29,110,112],{"class":31,"line":111},14,[29,113,78],{"emptyLinePlaceholder":77},[29,115,117],{"class":31,"line":116},15,[29,118,119],{},"    DEV -->|1. Commit & Push| SRC\n",[29,121,123],{"class":31,"line":122},16,[29,124,125],{},"    SRC -->|2. 변경 감지| CI\n",[29,127,129],{"class":31,"line":128},17,[29,130,131],{},"    CI -->|3. Build & Push| REG\n",[29,133,135],{"class":31,"line":134},18,[29,136,137],{},"    CI -->|4. Image Tag 등\u003Cbr\u002F>배포 값 변경| GITOPS\n",[29,139,141],{"class":31,"line":140},19,[29,142,143],{},"    GITOPS -->|5. Webhook 또는 Poll| ARGO\n",[29,145,147],{"class":31,"line":146},20,[29,148,149],{},"    ARGO -->|6. Sync| DEV_CLUSTER\n",[29,151,153],{"class":31,"line":152},21,[29,154,155],{},"    ARGO -->|6. Sync| UAT_CLUSTER\n",[29,157,159],{"class":31,"line":158},22,[29,160,161],{},"    ARGO -->|6. Sync| RELEASE_CLUSTER\n",[29,163,165],{"class":31,"line":164},23,[29,166,167],{},"    REG -.->|7. Image Pull| DEV_CLUSTER\n",[29,169,171],{"class":31,"line":170},24,[29,172,173],{},"    REG -.->|7. Image Pull| UAT_CLUSTER\n",[29,175,177],{"class":31,"line":176},25,[29,178,179],{},"    REG -.->|7. Image Pull| RELEASE_CLUSTER\n",[19,181,186],{"className":182,"code":184,"language":185,"meta":24},[183],"language-text","개발자 → Source Repository → Jenkins → Docker Registry\n                              │\n                              └→ GitOps Repository ↔ Argo CD\n                                                       ├→ DEV Cluster\n                                                       ├→ UAT Cluster\n                                                       └→ Release Cluster\n","text",[26,187,184],{"__ignoreMap":24},[189,190,191,207],"table",{},[192,193,194],"thead",{},[195,196,197,201,204],"tr",{},[198,199,200],"th",{},"단계",[198,202,203],{},"동작",[198,205,206],{},"결과",[208,209,210,222,233,244,255,266,277],"tbody",{},[195,211,212,216,219],{},[213,214,215],"td",{},"1",[213,217,218],{},"개발자가 코드를 Commit하고 Source Repository에 Push",[213,220,221],{},"소스 코드 변경",[195,223,224,227,230],{},[213,225,226],{},"2",[213,228,229],{},"Jenkins가 변경을 감지하여 CI\u002FCD Pipeline 실행",[213,231,232],{},"Build와 테스트 시작",[195,234,235,238,241],{},[213,236,237],{},"3",[213,239,240],{},"컨테이너 이미지를 Build하고 Docker Registry에 Push",[213,242,243],{},"배포할 이미지 저장",[195,245,246,249,252],{},[213,247,248],{},"4",[213,250,251],{},"GitOps Repository의 Image Tag 등 배포 설정 갱신",[213,253,254],{},"원하는 배포 상태 기록",[195,256,257,260,263],{},[213,258,259],{},"5",[213,261,262],{},"Argo CD가 Webhook 또는 Poll 방식으로 변경 감지",[213,264,265],{},"실제 상태와 원하는 상태 비교",[195,267,268,271,274],{},[213,269,270],{},"6",[213,272,273],{},"Argo CD가 각 Kubernetes Cluster에 설정 동기화",[213,275,276],{},"DEV, UAT, Release 환경에 배포",[195,278,279,282,285],{},[213,280,281],{},"7",[213,283,284],{},"Kubernetes가 Registry에서 컨테이너 이미지를 Pull",[213,286,287],{},"새 버전 컨테이너 실행",[289,290,292],"h3",{"id":291},"ci와-cd의-역할","CI와 CD의 역할",[189,294,295,308],{},[192,296,297],{},[195,298,299,302,305],{},[198,300,301],{},"구분",[198,303,304],{},"의미",[198,306,307],{},"담당 작업",[208,309,310,321],{},[195,311,312,315,318],{},[213,313,314],{},"CI",[213,316,317],{},"Continuous Integration, 지속적 통합",[213,319,320],{},"코드 통합, Build, 테스트, 이미지 생성과 Push",[195,322,323,326,329],{},[213,324,325],{},"CD",[213,327,328],{},"Continuous Deployment, 지속적 배포",[213,330,331],{},"배포 설정 변경 감지, 실행 환경 동기화, 컨테이너 배포",[333,334,335,339,342,345],"ul",{},[336,337,338],"li",{},"Jenkins는 애플리케이션을 Build하고 컨테이너 이미지를 Registry에 Push한다.",[336,340,341],{},"GitOps Repository에는 Kubernetes가 어떤 이미지 버전을 실행해야 하는지 기록한다.",[336,343,344],{},"Argo CD는 GitOps Repository의 원하는 상태와 Kubernetes의 실제 상태를 비교하고 동기화한다.",[336,346,347],{},"DEV, UAT, Release Cluster는 목적이 다른 실행 환경이며 동일한 방식으로 배포할 수 있다.",[349,350,351],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":24,"searchDepth":38,"depth":38,"links":353},[354],{"id":12,"depth":38,"text":13,"children":355},[356],{"id":291,"depth":44,"text":292},[358,359],"DevOps","CI-CD","2026-08-17 14:30:00 +0900","컨테이너 이미지를 Build, Push하고 GitOps Repository와 Argo CD를 통해 Kubernetes에 배포하는 흐름을 정리한다.","md",null,"\u002Fdevops\u002Fci-cd\u002F2026\u002F08\u002F17\u002Fci-cd-03-gitops-deployment\u002F",{"layout":366},"post","\u002Fposts\u002Fci-cd-docker\u002Fci-cd\u002F2026-08-17-ci-cd-03-gitops-deployment",{"title":5,"description":361},"Docker 기반 CI\u002FCD","posts\u002FCI-CD-Docker\u002FCI-CD\u002F2026-08-17-ci-cd-03-gitops-deployment",[372,373,374,375,376,377],"CI\u002FCD","Docker","Jenkins","GitOps","Argo CD","Kubernetes","FE9M_0UAhXriplqwLXRKqKcl2sWQwAMV3MjwZXkSaGM",1788744787425]