-
Notifications
You must be signed in to change notification settings - Fork 0
135 lines (113 loc) · 6.13 KB
/
deploy-dev.yml
File metadata and controls
135 lines (113 loc) · 6.13 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
# 도커 허브에 이미지 push 후 서버에 배포하는 방식 (25.10.30 이후)
name: Front Test Server (Develop)
on:
push:
branches:
- develop # develop 브랜치에 push가 발생하면 실행
jobs:
build-and-push-image: # 도커 이미지 빌드 및 도커 허브 push
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: ENV 파일 생성
run: |
echo "NEXT_PUBLIC_API_BASE_URL=${{ secrets.NEXT_PUBLIC_API_BASE_URL }}" > .env
echo "NEXT_PUBLIC_KAKAO_CLIENT_ID=${{ secrets.NEXT_PUBLIC_KAKAO_CLIENT_ID }}" >> .env
echo "NEXT_PUBLIC_GOOGLE_CLIENT_ID=${{ secrets.NEXT_PUBLIC_GOOGLE_CLIENT_ID }}" >> .env
echo "NEXT_PUBLIC_CLARITY_PROJECT_ID=${{ secrets.NEXT_PUBLIC_CLARITY_PROJECT_ID }}" >> .env
echo "NEXT_PUBLIC_GOOGLE_SHEETS_ID=${{ secrets.NEXT_PUBLIC_GOOGLE_SHEETS_ID }}" >> .env
echo "GOOGLE_SERVICE_ACCOUNT_EMAIL=${{ secrets.GOOGLE_SERVICE_ACCOUNT_EMAIL }}" >> .env
echo "GOOGLE_PRIVATE_KEY=${{ secrets.GOOGLE_PRIVATE_KEY }}" >> .env
echo "NEXT_PUBLIC_STRAPI_URL=${{ secrets.NEXT_PUBLIC_STRAPI_URL }}" >> .env
echo "NEXT_PUBLIC_TOSS_CLIENT_KEY=${{ secrets.NEXT_PUBLIC_TOSS_CLIENT_KEY }}" >> .env
- name: DockerHub 로그인
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Docker 이미지 빌드 및 push
run: |
docker build -f Dockerfile.dev -t zerooneitkr/frontend:develop .
docker push zerooneitkr/frontend:develop
deploy-image-to-server: # 도커 허브 pull 후 서버에 배포
runs-on: ubuntu-latest
needs: build-and-push-image
steps:
- name: Install cloudflared
run: |
echo "Downloading cloudflared..."
curl -L --output /tmp/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x /tmp/cloudflared
sudo mv /tmp/cloudflared /usr/local/bin/cloudflared
cloudflared --version || echo "cloudflared 설치 확인 실패"
- name: Install sshpass
run: |
echo "Installing sshpass..."
sudo apt-get update -qq
sudo apt-get install -y -qq sshpass
sshpass -V || echo "sshpass 설치 확인 실패"
- name: Setup SSH config
run: |
echo "Setting up SSH config..."
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# known_hosts 설정 (실패해도 계속 진행)
ssh-keyscan -p 24 -H ssh.zeroone.it.kr >> ~/.ssh/known_hosts 2>&1 || echo "ssh-keyscan 실패 (계속 진행)"
# SSH config 생성
cat > ~/.ssh/config << 'SSHCONFIG'
Host ssh.zeroone.it.kr
HostName ssh.zeroone.it.kr
User zero_one
Port 24
ProxyCommand cloudflared access ssh --hostname %h
StrictHostKeyChecking no
SSHCONFIG
chmod 600 ~/.ssh/config
echo "SSH config 생성 완료"
cat ~/.ssh/config
- name: 서버 배포
run: |
SUDO_PASSWORD='${{ secrets.SSH_PASSWORD }}'
sshpass -p '${{ secrets.SSH_PASSWORD }}' ssh ssh.zeroone.it.kr bash << EOF
set -e
echo "사용하지 않는 컨테이너, 이미지, 네트워크 정리 중 (볼륨제외)..."
echo "$SUDO_PASSWORD" | sudo -S docker stop frontend-dev || true
echo "$SUDO_PASSWORD" | sudo -S docker rm frontend-dev || true
echo "$SUDO_PASSWORD" | sudo -S docker system prune -a -f
# 여기다 도커 컴포즈 파일 갖다놓았기 때문임
cd ~/front/study-platform-client-dev || {
echo "디렉토리가 없습니다. 생성합니다..."
mkdir -p ~/front/study-platform-client-dev
cd ~/front/study-platform-client-dev
}
echo ".env 파일 생성 (런타임에 필요한 모든 환경변수 포함)"
echo "NEXT_PUBLIC_API_BASE_URL=${{ secrets.NEXT_PUBLIC_API_BASE_URL }}" > .env
echo "NEXT_PUBLIC_KAKAO_CLIENT_ID=${{ secrets.NEXT_PUBLIC_KAKAO_CLIENT_ID }}" >> .env
echo "NEXT_PUBLIC_GOOGLE_CLIENT_ID=${{ secrets.NEXT_PUBLIC_GOOGLE_CLIENT_ID }}" >> .env
echo "NEXT_PUBLIC_CLARITY_PROJECT_ID=${{ secrets.NEXT_PUBLIC_CLARITY_PROJECT_ID }}" >> .env
echo "NEXT_PUBLIC_GOOGLE_SHEETS_ID=${{ secrets.NEXT_PUBLIC_GOOGLE_SHEETS_ID }}" >> .env
echo "NEXT_PUBLIC_STRAPI_URL=${{ secrets.NEXT_PUBLIC_STRAPI_URL }}" >> .env
echo "NEXT_PUBLIC_TOSS_CLIENT_KEY=${{ secrets.NEXT_PUBLIC_TOSS_CLIENT_KEY }}" >> .env
echo "GOOGLE_SERVICE_ACCOUNT_EMAIL=${{ secrets.GOOGLE_SERVICE_ACCOUNT_EMAIL }}" >> .env
echo "GOOGLE_PRIVATE_KEY=${{ secrets.GOOGLE_PRIVATE_KEY }}" >> .env
echo "docker-compose.dev.yml 파일 생성"
echo "services:" > docker-compose.dev.yml
echo " frontend:" >> docker-compose.dev.yml
echo " container_name: frontend-dev" >> docker-compose.dev.yml
echo " image: zerooneitkr/frontend:develop" >> docker-compose.dev.yml
echo " ports:" >> docker-compose.dev.yml
echo " - '14855:14855'" >> docker-compose.dev.yml
echo " env_file:" >> docker-compose.dev.yml
echo " - .env" >> docker-compose.dev.yml
echo " restart: unless-stopped" >> docker-compose.dev.yml
echo "기존 컨테이너 완전 제거"
echo "$SUDO_PASSWORD" | sudo -S docker compose -f docker-compose.dev.yml down || true
echo "$SUDO_PASSWORD" | sudo -S docker stop frontend-dev || true
echo "$SUDO_PASSWORD" | sudo -S docker rm frontend-dev || true
echo "도커 이미지 pull"
echo "$SUDO_PASSWORD" | sudo -S docker pull zerooneitkr/frontend:develop
echo "도커 컴포즈 재시작"
echo "$SUDO_PASSWORD" | sudo -S docker compose -f docker-compose.dev.yml up -d
echo "테스트 서버 배포 완료"
EOF