CD 파이프라인 구축 - KimGyuBek/Threadly GitHub Wiki
master브랜치에 push되는 경우 새로운 이미지를 빌드하여 Docker Hub에 푸시하고, EC2 서버에서 blue-green 방식으로 무중단 배포한다.
on:
push:
branches: [ master ]
paths-ignore:
# 제외 항목 설정
workflow_dispatch:-
push:master브랜치로 푸시될 때 CD 워크플로우 수행 -
paths-ignore: 문서나 설정 파일만 변경된 경우 생략 -
workflow_dispatch: 필요 시 수동 실행 지원
concurrency:
group: deploy-master
cancel-in-progress: true- 그룹:
deploy-master단일 그룹으로 묶어 동시 배포 1개만 허용 - 취소: 새 실행이 시작된면 진행중이던 워크 플로우 자동 취소
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- 배포에 필요한 파일들을 아티팩트로 업로드
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 이미지 정리 |