CD 파이프라인 구축 - KimGyuBek/Threadly GitHub Wiki

CD(Continuous Deployment) 파이프라인


개요

master 브랜치에 push되는 경우 새로운 이미지를 빌드하여 Docker Hub에 푸시하고, EC2 서버에서 blue-green 방식으로 무중단 배포한다.


동작 프로세스

CI/CD 동작 프로세스


CD 파이프라인 상세

1. 트리거 조건

on:
  push:
    branches: [ master ]
    paths-ignore:
      # 제외 항목 설정
  workflow_dispatch:
  • push: master 브랜치로 푸시될 때 CD 워크플로우 수행
  • paths-ignore: 문서나 설정 파일만 변경된 경우 생략
  • workflow_dispatch: 필요 시 수동 실행 지원

2. 동시 실행 제어

concurrency:
  group: deploy-master
  cancel-in-progress: true
  • 그룹: deploy-master 단일 그룹으로 묶어 동시 배포 1개만 허용
  • 취소: 새 실행이 시작된면 진행중이던 워크 플로우 자동 취소

3. Job 구성

build

1). 체크아웃/BuildX 준비

- name: 체크아웃
  uses: actions/checkout@v4
- name: Buildx 설정
  uses: docker/setup-buildx-action@v3
  • 최신 커밋으로 체크아웃
  • Docker BuildX 빌드 환경 준비

2). 이미지 태그 생성 후 변수 설정

      - name: Run build-deploy.sh
        run: |
          chmod +x ./infra/scripts/build-deploy.sh
          ./infra/scripts/build-deploy.sh
      - name: IMAGE_TAG 설정
        id: read_tag
        run: |
          echo "IMAGE_TAG=$(cat image_tag.txt)" >> $GITHUB_ENV
  • build-deploy.sh를 실행하여 배포 버전 태그 생성
  • 생성한 태그를 GITHUB_ENV에 기록

3). 도커 이미지 빌드 후 푸시

      - name: 도커 이미지 빌드
        run: |
          docker build --no-cache -t ${{secrets.DOCKER_IMAGE_NAME }}:$IMAGE_TAG -f ./infra/docker/app/Dockerfile .

      - name: 도커 로그인
        uses: docker/login-action@v3
        with:
          # Docker 로그인

      - name: 도커 허브 푸시
        run: |
          docker push ${{ secrets.DOCKER_IMAGE_NAME }}:$IMAGE_TAG
  • 도커 로그인
  • Docker파일을 이용하여 빌드
  • 빌드한 이미지 Docker Hub에 업로드

4). 배포용 docker-compose 파일 아티팩트 업로드

      - name: Docker compose file 업로드 준비
        run: |
          mkdir -p deploy
          cp -r ./infra/compose/prod/* ./deploy
#        ...
      - name: Artifact 업로드
        uses: actions/upload-artifact@v4
        with:
          name: infra
          path: ./deploy
  • 배포에 필요한 파일들을 아티팩트로 업로드

deploy

1). 아티팩트 다운로드

      - name: Artifact 다운로드
        uses: actions/download-artifact@v4
        with:
          name: infra
          path: ./infra
  • deploy job에서 업로드한 아티팩트를 /.infra에 다운로드 한다

2). 필요한 환경 변수 파일 생성

      - name: 환경변수 생성 및 전송
        run: |
          echo "SPRING_PROFILES_ACTIVE=${{ secrets.SPRING_PROFILE_ACTIVE }}" >> .env
#          ...
          env 생성
#          ...
          echo "JWT_SECRET=${{ secrets.JWT_SECRET }}" >> .env
          cp .env ./infra/app
  • git actions secret에서 민감 값 주입
  • 완성된 .env 파일을 ./infra/app으로 복사

3). EC2 서버로 파일 전송

      - name: SCP 전송
        uses: appleboy/[email protected]
        with:
          # 연결 설정
          source: |
            ./infra
          target: "/home/ubuntu/threadly"

4). SSH를 이용한 원격 배포

      - name: 환경 변수 주입 및 배포
        uses: appleboy/[email protected]
        with:
          # 연결 설정
          script: |
            # 배포 실행

스크립트

상세 문서: 배포 스크립트 가이드

스크립트 역할
build-deploy.sh 배포 태그 생성
blue-green-deploy.sh 무중단 배포 과정 수행
clean-old-images.sh 구버전/미사용 Docker 이미지 정리

관련 문서

⚠️ **GitHub.com Fallback** ⚠️