🔧 DevOps

파이프라인

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 }} 형태로 수정하겠습니다."

주의사항

더 배우기