파이프라인
Pipeline
자동화된 작업 흐름. CI/CD 파이프라인이 대표적. 빌드, 테스트, 배포 단계 연결.
Pipeline
자동화된 작업 흐름. CI/CD 파이프라인이 대표적. 빌드, 테스트, 배포 단계 연결.
파이프라인(Pipeline)은 소프트웨어 개발에서 자동화된 작업 흐름을 의미합니다. CI/CD 파이프라인이 대표적으로, 코드 커밋부터 프로덕션 배포까지 빌드, 테스트, 배포 단계를 자동으로 연결합니다.
파이프라인은 순차적 스테이지(Stage)와 병렬 잡(Job)으로 구성됩니다. 각 스테이지는 이전 스테이지 성공 후 실행되고, 스테이지 내 잡은 병렬로 실행될 수 있습니다. 실패 시 전체 파이프라인이 중단되어 빠른 피드백을 제공합니다.
주요 도구로 Jenkins, GitHub Actions, GitLab CI, CircleCI, Azure Pipelines가 있습니다. YAML이나 DSL로 파이프라인을 정의하고, Git 저장소에서 버전 관리합니다. 환경 변수와 시크릿으로 민감 정보를 안전하게 전달합니다.
실무에서는 PR마다 테스트 파이프라인을 실행하고, main 브랜치 머지 시 배포 파이프라인을 트리거합니다. 스테이징 자동 배포, 프로덕션 수동 승인 게이트를 설정합니다. 캐싱과 병렬화로 파이프라인 시간을 10분 이내로 유지합니다.
# GitHub Actions CI/CD Pipeline
name: CI/CD Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
# 1. 테스트 스테이지
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Run tests
run: npm run test:ci
- name: Upload coverage
uses: codecov/codecov-action@v3
# 2. 빌드 스테이지
build:
needs: test
runs-on: ubuntu-latest
outputs:
image_tag: ${{ steps.meta.outputs.tags }}
steps:
- uses: actions/checkout@v4
- name: Login to Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
# 3. 배포 스테이지 (Staging)
deploy-staging:
needs: build
runs-on: ubuntu-latest
environment: staging
steps:
- name: Deploy to Staging
run: |
kubectl set image deployment/web \
web=${{ needs.build.outputs.image_tag }}
# 4. 배포 스테이지 (Production - 수동 승인)
deploy-production:
needs: [build, deploy-staging]
runs-on: ubuntu-latest
environment: production # 승인 필요
if: github.ref == 'refs/heads/main'
steps:
- name: Deploy to Production
run: |
kubectl set image deployment/web \
web=${{ needs.build.outputs.image_tag }}
시니어: "파이프라인 시간이 20분이나 걸리네요. 최적화가 필요해 보여요."
주니어: "테스트를 병렬로 분할하고 캐싱 추가하면 10분대로 줄일 수 있을 것 같아요."
면접관: "CI/CD 파이프라인을 설계할 때 고려해야 할 사항은 무엇인가요?"
지원자: "속도를 위해 캐싱과 병렬화를 적용하고, 빠른 피드백을 위해 테스트를 앞에 배치합니다. 보안을 위해 시크릿 관리와 최소 권한 원칙을 적용하고, 운영 배포에는 승인 게이트를 설정합니다."
리뷰어: "시크릿을 환경 변수로 직접 넘기는 것보다 secrets context를 쓰는 게 안전해요."
개발자: "네, env 대신 ${{ secrets.API_KEY }} 형태로 수정하겠습니다."