핵심 흐름은 DevOps와 CI/CD 개념 -> 파이프라인 구조 -> Jenkins -> GitHub Actions -> GitOps/Argo CD -> AWS 네이티브 CI/CD 순서로 이해하면 된다.

DevOps는 Development와 Operations의 합성어이며, 개발과 운영을 분리된 조직으로만 보지 않고 서비스 생명주기 전체를 함께 책임지는 방식이다.
DevOps는 특정 도구 이름이 아니라 다음을 포함하는 문화와 실천 방식이다.
전통적인 방식에서는 개발팀, 테스트팀, 운영팀이 강하게 분리되는 경우가 많다. 이를 사일로 구조라고 한다.
문제점:
| 요소 | 의미 |
|---|---|
| Culture | 책임 공유, 협업, 빠른 피드백 |
| Automation | 빌드, 테스트, 배포, 모니터링 자동화 |
| Measurement / Monitoring | 운영 상태를 수치와 로그로 관찰 |
| Sharing | 지식, 이력, 장애 원인, 운영 절차 공유 |
CI는 Continuous Integration, 즉 지속적 통합이다.
핵심:
CI의 목적:
CD는 문맥에 따라 두 가지 의미로 쓰인다.
| 구분 | 의미 |
|---|---|
| Continuous Delivery | 배포 가능한 상태까지 자동화하고 운영 반영은 사람이 승인 |
| Continuous Deployment | 검증 통과 후 운영까지 자동 배포 |
암기:
Delivery = 배포 준비 자동화 + 사람 승인 가능Deployment = 운영 배포까지 자동소스코드 변경이 발생한 뒤 빌드, 테스트, 패키징, 배포, 검증까지 이어지는 자동화 흐름이다.
기본 흐름:
Source
-> Build
-> Test
-> Package / Artifact
-> Publish
-> Deploy
-> Verify
중요:
파이프라인의 시작점이다.
트리거:
pushpull_requestmergetagSource 단계 산출물:
소스코드를 실행 가능하거나 배포 가능한 형태로 변환한다.
예:
자동 검증 단계다.
테스트 종류:
다음 단계로 넘어가기 위한 품질 기준이다.
예:
빌드 결과물을 배포 가능한 단위로 정리하는 단계다.
Artifact 예:
중요:
Artifact를 저장소에 업로드한다.
예:
Artifact를 특정 환경에 반영한다.
환경 예:
배포 방식:
| 방식 | 의미 |
|---|---|
| In-place | 기존 서버 위에 직접 교체 |
| Rolling | 일부씩 순차 교체 |
| Blue/Green | 새 환경 준비 후 트래픽 전환 |
| Canary | 일부 사용자/트래픽에 먼저 배포 |
배포 후 실제 서비스가 정상인지 확인한다.
확인 예:
Feature Flag를 쓰면 배포와 릴리스를 분리할 수 있다.
Jenkins는 반복 작업을 자동화하는 오픈소스 자동화 서버다.
주요 역할:
Jenkins는 CI 실행 엔진이면서 CD 파이프라인 제어 도구가 될 수 있다.
GitHub
-> Jenkins
-> Build/Test
-> Docker Registry
-> Deploy Target
| 구성 | 역할 |
|---|---|
| Controller | UI, Job 설정, 스케줄링, 플러그인, 권한 관리 |
| Agent | 실제 빌드/테스트/스크립트 실행 |
Controller와 Agent를 분리하는 이유:
| 유형 | 특징 |
|---|---|
| Freestyle | UI 기반 단순 작업 |
| Pipeline | Jenkinsfile 기반 파이프라인 |
| Multibranch Pipeline | 브랜치별 Jenkinsfile 자동 인식 |
빌드, 테스트, 패키징, 배포 단계를 코드 형태로 정의하고 실행하는 방식이다.
파이프라인 정의를 UI가 아니라 코드 파일로 저장소에 함께 보관하는 방식이다.
Jenkins에서는 이 파일이 보통 Jenkinsfile이다.
장점:
Jenkins Pipeline 정의 파일이다.
보통 저장소 루트에 위치한다.
my-app/
├ src/
├ Dockerfile
└ Jenkinsfile
| 구분 | Declarative | Scripted |
|---|---|---|
| 특징 | 정해진 문법 구조 | Groovy 기반 자유도 높음 |
| 장점 | 읽기 쉽고 표준화 쉬움 | 복잡한 로직 가능 |
| 단점 | 자유도 제한 | 가독성/관리 난이도 |
| 입문/표준 | 권장 | 고급 상황 |
pipeline {
agent any
stages {
stage('Checkout') {
steps {
echo 'checkout'
}
}
stage('Build') {
steps {
echo 'build'
}
}
}
post {
success {
echo 'success'
}
failure {
echo 'failure'
}
}
}
pipeline: 전체 파이프라인agent: 실행 노드stages: 단계 묶음stage: 개별 단계steps: 실제 명령post: 후처리environment: 환경 변수parameters: 실행 입력값when: 조건 실행input: 승인 대기options: 실행 옵션실습 흐름:
GitHub
-> Jenkins Pipeline
-> Docker Build
-> Docker Hub Push
실습에서 중요한 점은 빌드 결과물이 단순 파일이 아니라 Docker 이미지라는 점이다.
Source Code + Dockerfile
-> docker build
-> docker image
-> docker push
-> Registry 저장
비밀번호나 토큰을 Jenkinsfile에 직접 쓰면 안 된다.
대신 Jenkins Credentials에 등록하고 withCredentials로 사용한다.
GitHub에 push가 발생했을 때 Jenkins에 이벤트를 전달해 자동 실행한다.
Webhook 확인 포인트:
GitHub 저장소 이벤트를 기준으로 자동화 작업을 수행하는 플랫폼이다.
주요 용도:
| 구성 | 의미 |
|---|---|
| Workflow | 자동화 절차 전체 |
| Job | Workflow 안의 작업 단위 |
| Step | Job 안의 개별 실행 단위 |
| Runner | 실제 실행 환경 |
.github/workflows/
GitHub는 이 디렉토리의 YAML 파일을 Workflow로 인식한다.
| 구분 | 특징 |
|---|---|
| GitHub-hosted Runner | GitHub가 제공, 관리 부담 낮음 |
| Self-hosted Runner | 사용자가 직접 운영, 사내망/특수 환경 접근 가능 |
대표 이벤트:
pushpull_requestworkflow_dispatchreleasescheduletagname: CI Workflow
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Run command
run: echo "hello"
name: Workflow 표시 이름on: 실행 트리거jobs: 실행할 Job 목록runs-on: Runner 환경steps: 실행 단계uses: 재사용 Action 호출run: 직접 명령 실행uses와 run 차이| 요소 | 의미 |
|---|---|
uses | 이미 만들어진 Action 재사용 |
run | 쉘 명령 직접 실행 |
env: 환경 변수defaults: 기본 실행 설정if: 조건부 실행needs: Job 간 의존성strategy.matrix: 여러 환경 조합 병렬 실행secrets: 민감정보workflow_dispatch: 수동 실행needs 사용Secret은 로그에 노출되지 않도록 보호되며, 배포/인증에서 중요하다.
실습에서 다룬 내용:
push
-> checkout
-> setup-python
-> pip install
-> pytest
-> 결과 확인
빌드나 테스트 결과물을 GitHub Actions 실행 결과에 저장한다.
예:
브랜치 전략과 Workflow 트리거를 연결할 수 있다.
예:
dev: 테스트만main: 빌드 + 배포tag: 릴리스GitHub Secrets에 EC2 접속 정보나 SSH Key를 저장하고, Workflow에서 SSH/SCP로 배포할 수 있다.
주의:
| 항목 | Jenkins | GitHub Actions |
|---|---|---|
| 운영 방식 | 직접 설치/운영 | GitHub 내장형 |
| 실행 구조 | Controller / Agent | Workflow / Runner |
| 확장 방식 | Plugin | Marketplace Actions |
| 설정 위치 | Jenkinsfile 또는 UI | .github/workflows/*.yml |
| 자체 인프라 | 강함 | Self-hosted Runner로 가능 |
| 시작 난이도 | 상대적으로 높음 | 낮음 |
| 운영 부담 | 높음 | 낮음 |
운영 환경이 어떤 상태여야 하는지를 Git에 선언하고, 실제 시스템이 Git 상태를 기준으로 동기화되도록 만드는 방식이다.
핵심:
Git = 운영 상태의 Single Source of Truth
| 개념 | 의미 |
|---|---|
| Declarative | 원하는 상태를 선언 |
| Single Source of Truth | Git이 운영 기준 |
| Reconciliation | 실제 상태를 Git 기준으로 동기화 |
CI 도구
-> 운영 환경에 직접 kubectl apply / SSH / 배포 명령
문제:
CI
-> 이미지 빌드/Push
-> GitOps 저장소 매니페스트 변경
-> GitOps 도구가 Git 변경 감지
-> 클러스터에 Sync
장점:
CI 역할:
GitOps 역할:
Kubernetes 환경에서 GitOps 방식 배포를 구현하는 대표적인 오픈소스 도구다.
Argo CD는 Git 저장소를 원하는 상태로 보고, 클러스터 실제 상태를 그 상태와 맞춘다.
Git 저장소에 매니페스트 존재
-> Argo CD가 저장소 감시
-> 변경 감지
-> 원하는 상태 렌더링
-> 클러스터 실제 상태와 비교
-> 차이가 있으면 Sync
-> 클러스터 상태를 Git 기준으로 맞춤
| 개념 | 의미 |
|---|---|
| Application | 배포/동기화 관리 단위 |
| Source | Git 저장소, 경로, 브랜치 |
| Destination | 대상 클러스터/네임스페이스 |
| Sync Policy | 수동/자동 동기화 정책 |
| 상태 | 의미 |
|---|---|
| Sync Status | Git 기준 상태와 실제 상태가 같은가 |
| Health Status | 리소스가 정상 동작하는가 |
중요:
Synced여도 Pod가 Crash이면 Health는 나쁠 수 있음Healthy여도 Git과 다르면 OutOfSync일 수 있음| 방식 | 특징 |
|---|---|
| Manual Sync | 사람이 동기화 승인 |
| Auto Sync | Git 변경 감지 시 자동 반영 |
Git에 없는 수동 변경으로 실제 클러스터 상태가 Git과 달라진 상태다.
Argo CD는 Drift를 감지하고, 정책에 따라 원래 Git 상태로 되돌릴 수 있다.
소스코드 수정
-> GitHub Actions 실행
-> Docker 이미지 빌드
-> Docker Hub Push
-> GitOps 저장소 deployment.yaml 이미지 태그 변경
-> Argo CD가 Git 변경 감지
-> EKS에 Sync
-> 새 Pod 생성
-> 기존 Pod 종료
| 서비스 | 역할 |
|---|---|
| CodeCommit | Git 소스 저장소 |
| CodeBuild | 빌드 수행 |
| CodeDeploy | EC2/ECS/Lambda 배포 |
| CodePipeline | 전체 단계 오케스트레이션 |
| S3 | Artifact 저장 |
| EC2 | 배포 대상 서버 |
Developer
-> CodeCommit push
-> CodePipeline 변경 감지
-> CodeBuild 빌드
-> S3 Artifact 저장
-> CodeDeploy EC2 배포
-> Nginx 웹서버 반영
AWS 관리형 Git 저장소다.
역할:
빌드 실행 서비스다.
buildspec.yml을 읽어서 빌드 단계를 수행한다.
version: 0.2
phases:
install:
commands:
- echo "install"
build:
commands:
- mkdir -p output
- cp -r index.html appspec.yml scripts output/
artifacts:
files:
- "**/*"
base-directory: output
중요:
phases: install/build/post_build 등 빌드 단계artifacts: 다음 단계로 넘길 결과물base-directory: Artifact 기준 디렉토리배포 대상 서버에 Artifact를 반영하는 서비스다.
EC2 배포에서는 대상 서버에 CodeDeploy Agent가 필요하다.
CodeDeploy가 배포 파일을 어디에 복사하고 어떤 Hook을 실행할지 정의한다.
핵심:
files: 파일 복사 규칙permissions: 파일 권한hooks: 배포 생명주기 스크립트BeforeInstallApplicationStartValidateService중요:
ValidateService에서 curl -f 같은 검증을 수행전체 단계를 연결하는 오케스트레이션 서비스다.
Source -> Build -> Deploy
각 단계:
CodePipeline/CodeBuild가 중간 산출물을 저장하는 위치다.
중요:
| 항목 | CI | CD |
|---|---|---|
| 목적 | 코드 통합과 검증 | 배포 가능/운영 반영 |
| 주요 작업 | Build, Test | Package, Deploy, Verify |
| 항목 | Delivery | Deployment |
|---|---|---|
| 운영 반영 | 사람 승인 가능 | 자동 |
| 핵심 | 언제든 배포 가능 | 자동 운영 배포 |
| 항목 | Jenkins | GitHub Actions |
|---|---|---|
| 운영 | 직접 운영 | GitHub 내장 |
| 실행 단위 | Job/Pipeline | Workflow/Job/Step |
| 실행 환경 | Agent | Runner |
| 확장 | Plugin | Marketplace Action |
| 적합 | 복잡한 자체 환경 | GitHub 중심 빠른 자동화 |
| 항목 | Push 방식 | GitOps Pull 방식 |
|---|---|---|
| 배포 주체 | CI 도구 | 클러스터 내부 GitOps 도구 |
| 운영 권한 | CI가 직접 가짐 | Argo CD 등 배포 도구가 가짐 |
| Drift 감지 | 약함 | 강함 |
| 기준점 | 배포 스크립트/실행 결과 | Git 저장소 |
| 항목 | CodePipeline | Jenkins/GitHub Actions |
|---|---|---|
| 성격 | AWS 네이티브 오케스트레이션 | 범용 자동화 도구 |
| 통합 | AWS 서비스와 강함 | 외부 서비스 연동 다양 |
| 관리 부담 | 낮음 | 도구별 상이 |
| 항목 | CodeBuild | CodeDeploy |
|---|---|---|
| 역할 | 빌드 수행 | 배포 수행 |
| 기준 파일 | buildspec.yml | appspec.yml |
| 결과 | Artifact 생성 | 대상 환경 반영 |
Source
-> Build
-> Test
-> Artifact
-> Publish
-> Deploy
-> Verify
GitHub push
-> Jenkins Webhook
-> Jenkins Pipeline
-> Docker Build
-> Docker Hub Push
GitHub push
-> Workflow 실행
-> Checkout
-> Python 설치
-> 의존성 설치
-> pytest
-> 결과/Artifact 확인
App repo push
-> GitHub Actions
-> Docker image build/push
-> GitOps repo image tag update
-> Argo CD Sync
-> Kubernetes Pod 교체
CodeCommit
-> CodePipeline
-> CodeBuild
-> S3 Artifact
-> CodeDeploy
-> EC2
needs 사용uses는 Action 재사용, run은 명령 실행Synced와 Healthy는 다름buildspec.yml은 CodeBuild용, appspec.yml은 CodeDeploy용ValidateService가 실패하면 파일 복사가 되어도 배포 실패로 판단될 수 있음.github/workflows 아래 YAML로 정의CI/CD의 핵심은 소스 변경을 검증 가능한 Artifact로 만들고, 통제된 방식으로 배포하며, 운영 상태를 지속적으로 확인하고 되돌릴 수 있게 만드는 자동화 흐름이다.