CollabOps

AWS Docker 배포

AWS ECR에 이미지를 빌드/푸시하고 EKS에 배포하는 파이프라인

AWS 환경에서 Docker 이미지를 빌드하고 EKS 클러스터에 배포하는 파이프라인입니다.

사전 준비

다음 secrets와 vars를 미리 등록해야 합니다:

종류KeyDescription
SecretAWS_ACCESS_KEY_IDAWS Access Key
SecretAWS_SECRET_ACCESS_KEYAWS Secret Key
VarAWS_REGIONAWS 리전 (예: ap-northeast-2)
VarAWS_ACCOUNT_IDAWS 계정 ID
VarEKS_CLUSTEREKS 클러스터 이름

전체 코드

name: aws-deploy

# main 브랜치 push 시 실행
triggers:
  push:
    branches: [main]
    paths: [src/**, Dockerfile, package.json]

env:
  AWS_REGION: "${{ vars.AWS_REGION }}"
  ECR_REGISTRY: "${{ vars.AWS_ACCOUNT_ID }}.dkr.ecr.${{ vars.AWS_REGION }}.amazonaws.com"
  IMAGE_NAME: "my-app"

jobs:
  # ─────────────────────────────────────────
  # 1. 소스코드 체크아웃
  # ─────────────────────────────────────────
  checkout:
    phase: source
    steps:
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"

  # ─────────────────────────────────────────
  # 2. AWS 인증 + ECR 인증
  # ─────────────────────────────────────────
  auth:
    phase: source
    needs: [checkout]
    steps:
      # AWS 자격증명 설정
      - name: aws-auth
        uses: "collabops/aws-auth@v1"
        with:
          access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          region: ${{ vars.AWS_REGION }}

      # ECR Docker 인증
      - name: ecr-auth
        uses: "collabops/aws-ecr-auth@v1"
        with:
          region: ${{ vars.AWS_REGION }}

  # ─────────────────────────────────────────
  # 3. 테스트
  # ─────────────────────────────────────────
  test:
    phase: test
    needs: [checkout]
    steps:
      - name: unit-test
        image: node:18
        run: |
          cd /workspace/source
          npm ci
          npm test
        env:
          CI: "true"

  # ─────────────────────────────────────────
  # 4. Docker 이미지 빌드 및 ECR 푸시
  # ─────────────────────────────────────────
  build:
    phase: build
    needs: [auth, test]          # 인증 + 테스트 모두 완료 후
    steps:
      # 커밋 SHA를 이미지 태그로 사용
      - name: prepare-tag
        id: tag
        run: |
          SHORT_SHA=$(echo "${{ collabops.sha }}" | cut -c1-7)
          echo "image_tag=${SHORT_SHA}" >> $COLLABOPS_OUTPUT

      - name: build-push
        uses: "collabops/docker-build-push@v1"
        with:
          tags: |
            ${{ env.ECR_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
            ${{ env.ECR_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.image_tag }}
          build-args: |
            NODE_ENV=production

  # ─────────────────────────────────────────
  # 5. EKS 배포
  # ─────────────────────────────────────────
  deploy:
    phase: deploy
    needs: [build]
    if: "collabops.ref == 'refs/heads/main' && collabops.event_name == 'push'"
    steps:
      # EKS 클러스터 인증 및 kubectl 설정
      - name: eks-setup
        uses: "collabops/aws-eks-setup@v1"
        with:
          region: ${{ vars.AWS_REGION }}
          cluster-name: ${{ vars.EKS_CLUSTER }}

      # kubectl로 배포
      - name: rollout
        image: amazon/aws-cli:2.22.35
        run: |
          SHORT_SHA=$(echo "${{ collabops.sha }}" | cut -c1-7)
          IMAGE="${{ env.ECR_REGISTRY }}/${{ env.IMAGE_NAME }}:${SHORT_SHA}"

          # Deployment 이미지 업데이트
          kubectl set image deployment/${{ env.IMAGE_NAME }} \
            app=${IMAGE} \
            -n production

          # 롤아웃 완료 대기 (최대 5분)
          kubectl rollout status deployment/${{ env.IMAGE_NAME }} \
            -n production \
            --timeout=300s

          echo "Deployed: ${IMAGE}"

  # ─────────────────────────────────────────
  # 6. Slack 알림
  # ─────────────────────────────────────────
  notify:
    needs: [deploy]
    if: "always()"
    steps:
      - name: slack
        uses: "collabops/slack-notify@v1"
        with:
          webhook-url: ${{ secrets.SLACK_WEBHOOK }}
          message: "EKS 배포: ${{ env.IMAGE_NAME }} (${{ collabops.sha }})"
          title: "Deploy to EKS"
          color: good

실행 흐름

checkout
  ├── auth (AWS + ECR 인증)
  └── test (유닛 테스트)
        └── build (Docker 빌드 & ECR 푸시)
              └── deploy (EKS 배포, main push만)
                    └── notify (Slack 알림, 항상)

목차