-
Notifications
You must be signed in to change notification settings - Fork 2
142 lines (122 loc) · 5.02 KB
/
Copy pathreact-basic-cicd.yml
File metadata and controls
142 lines (122 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
name: react cicd
on:
push:
branches: # 워크플로 대상 브랜치
- main
paths-ignore: # 제외 경로
- 'CHANGELOG.md'
- 'package.json'
- 'package-lock.json'
env:
PROJECT_NAME: project-name # 프로젝트 명
DOCKERHUB_REPO: ${{ secrets.DOCKERHUB_USERNAME }}
APP_IMAGE_SUFFIX: "-web"
MAIN_PORT: "3001"
TEST_PORT: "3002"
APP_EXPOSE_PORT: "3000"
jobs:
build:
if: ${{ !startsWith(github.event.head_commit.message, 'version(') }} # 특정 커밋 메시지 워크플로 실행 제외
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
# 브랜치별 .env.production 생성
- name: Create .env.production file
run: |
if [ "${{ github.ref_name }}" = "main" ]; then
echo -e "${{ secrets.ENV_MAIN }}" > .env.production
elif [ "${{ github.ref_name }}" = "test" ]; then
echo -e "${{ secrets.ENV_TEST }}" > .env.production
else
echo -e "${{ secrets.ENV_MAIN }}" > .env.production
fi
- name: Docker setup
uses: docker/setup-buildx-action@v3
- name: Docker login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.PROJECT_NAME }}${{ env.APP_IMAGE_SUFFIX }}:${{ github.ref_name }}
# build-args 에 환경변수 등록 필요
build-args: |
VITE_API_BASE_URL=https://example.com
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Deploy
uses: appleboy/ssh-action@v1.0.3
env:
PROJECT_NAME: ${{ env.PROJECT_NAME }}
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
password: ${{ secrets.SERVER_PASSWORD }}
port: ${{ secrets.SERVER_PORT }}
envs: PROJECT_NAME
script: |
set -e
export PATH=$PATH:/usr/local/bin
echo "환경변수 설정.."
PW="${{ secrets.SERVER_PASSWORD }}"
BRANCH="${{ github.ref_name }}"
REPO="${{ env.DOCKERHUB_REPO }}"
PROJECT="${{ env.PROJECT_NAME }}"
IMG_SUFFIX="${{ env.APP_IMAGE_SUFFIX }}"
IMAGE="${REPO}/${PROJECT}${IMG_SUFFIX}:${BRANCH}"
CONTAINER_NAME="${PROJECT_NAME}${IMG_SUFFIX}"
APP_PORT="${{ env.APP_EXPOSE_PORT }}"
MAIN_PORT="${{ env.MAIN_PORT }}"
TEST_PORT="${{ env.TEST_PORT }}"
echo "브랜치=${BRANCH}"
echo "이미지=${IMAGE}"
echo "MAIN_PORT=${MAIN_PORT} | TEST_PORT=${TEST_PORT}"
if [ "$BRANCH" = "main" ]; then
PORT="${MAIN_PORT}"
elif [ "$BRANCH" = "test" ]; then
CONTAINER_NAME="${CONTAINER_NAME}-test"
PORT="${TEST_PORT}"
else
echo "지원하지 않는 브랜치: ${BRANCH}"
exit 1
fi
echo "브랜치: ${BRANCH}"
echo "컨테이너 이름: ${CONTAINER_NAME}"
echo "포트: ${PORT}"
echo "도커 이미지 풀 : ${IMAGE}"
echo $PW | sudo -S docker pull "${IMAGE}"
echo "컨테이너 ${CONTAINER_NAME} 존재 여부 확인 중..."
if sudo docker ps -a --format '{{.Names}}' | grep -Eq "^${CONTAINER_NAME}\$"; then
echo "컨테이너 ${CONTAINER_NAME} 이(가) 존재합니다. 중지 및 삭제 중..."
echo $PW | sudo -S docker rm -f "${CONTAINER_NAME}"
echo "컨테이너 ${CONTAINER_NAME} 이(가) 삭제되었습니다."
else
echo "존재하는 컨테이너 ${CONTAINER_NAME} 이(가) 없습니다."
fi
echo "브랜치별 .env.production 생성..."
if [ "$BRANCH" = "main" ]; then
echo "${{ secrets.ENV_MAIN }}" > .env.production
elif [ "$BRANCH" = "test" ]; then
echo "${{ secrets.ENV_TEST }}" > .env.production
else
echo "${{ secrets.ENV_MAIN }}" > .env.production
fi
echo "새로운 컨테이너 ${CONTAINER_NAME} 실행 중..."
echo $PW | sudo -S docker run -d -p "${PORT}":"${APP_PORT}" --name "${CONTAINER_NAME}" \
--restart unless-stopped \
--env-file .env.production \
"${IMAGE}"
# <none> 태그로 남은 이미지 정리
echo "불필요한 dangling(<none>) 이미지 정리..."
echo $PW | sudo -S docker image prune -af
echo "배포가 성공적으로 완료되었습니다."