-
Notifications
You must be signed in to change notification settings - Fork 1
181 lines (164 loc) · 6.58 KB
/
CD.yml
File metadata and controls
181 lines (164 loc) · 6.58 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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
name: ClassLog CD
on:
push:
branches: ["dev"]
permissions:
contents: read
packages: write
env:
IMAGE_TAG: ${{ github.sha }}
BACKEND_IMAGE: ${{ secrets.DOCKER_USERNAME }}/classlog-backend
FRONTEND_IMAGE: ${{ secrets.DOCKER_USERNAME }}/classlog-frontend
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name : Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
working-directory: ./backend
run: chmod +x gradlew
- name: Build with Gradle
working-directory: ./backend
run: ./gradlew clean bootJar
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build & Push Backend Image
run: |
docker build -t ${BACKEND_IMAGE}:latest -t ${BACKEND_IMAGE}:${IMAGE_TAG} ./backend
docker push ${BACKEND_IMAGE}:latest
docker push ${BACKEND_IMAGE}:${IMAGE_TAG}
- name: Build & Push Frontend Image
run: |
docker build -t ${FRONTEND_IMAGE}:latest -t ${FRONTEND_IMAGE}:${IMAGE_TAG} ./frontend
docker push ${FRONTEND_IMAGE}:latest
docker push ${FRONTEND_IMAGE}:${IMAGE_TAG}
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: Create backend/.env on server
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
mkdir -p /home/ubuntu/classlog/backend
cat > /home/ubuntu/classlog/backend/.env <<EOF
DB_USERNAME=${{ secrets.DB_USERNAME }}
DB_PASSWORD=${{ secrets.DB_PASSWORD }}
DB_NAME=${{ secrets.DB_NAME }}
DB_HOST=${{ secrets.DB_HOST }}
DB_PORT=${{ secrets.DB_PORT }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
REDIS_PORT=${{ secrets.REDIS_PORT }}
JWT_SECRET=${{ secrets.JWT_SECRET }}
MAIL_HOST=${{ secrets.MAIL_HOST }}
MAIL_PORT=${{ secrets.MAIL_PORT }}
MAIL_USERNAME=${{ secrets.MAIL_USERNAME }}
MAIL_PASSWORD=${{ secrets.MAIL_PASSWORD }}
AWS_REGION=${{ secrets.AWS_REGION }}
AWS_ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_KEY=${{ secrets.AWS_SECRET_KEY }}
AWS_S3_BUCKET_NAME=${{ secrets.AWS_S3_BUCKET_NAME }}
AI_SERVER_URL=${{ secrets.AI_SERVER_URL }}
OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}
KAKAO_API_KEY=${{ secrets.KAKAO_API_KEY }}
KAKAO_REDIRECT_URI=${{ secrets.KAKAO_REDIRECT_URI }}
CORS_ORIGIN=${{ secrets.CORS_ORIGIN}}
EOF
- name: Create frontend/.env on server
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
mkdir -p /home/ubuntu/classlog/frontend
cat > /home/ubuntu/classlog/frontend/.env <<EOF
NEXT_PUBLIC_API_BASE_URL=${{secrets.NEXT_PUBLIC_API_BASE_URL}}
NEXT_PUBLIC_WS_URL=${{secrets.NEXT_PUBLIC_WS_URL}}
EOF
- name: Create .env for docker compose
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
mkdir -p /home/ubuntu/classlog
cat > /home/ubuntu/classlog/.env <<EOF
DOCKERHUB_USERNAME=${{ secrets.DOCKER_USERNAME }}
IMAGE_TAG=${{ github.sha }}
EOF
- name: Deploy containers
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
docker compose down
docker compose pull
docker compose up -d
docker image prune -f
- name: Notify on Discord (Success)
if: success()
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK }}
run: |
payload=$(cat <<'JSON'
{
"username": "CD Bot",
"embeds": [{
"title": "✅ 배포 성공",
"description": "프로덕션 배포가 완료되었습니다.",
"color": 3066993,
"fields": [
{ "name": "Repo", "value": "${{ github.repository }}", "inline": true },
{ "name": "Branch", "value": "${{ github.ref_name }}", "inline": true },
{ "name": "Commit", "value": "[${{ github.sha }}](https://github.com/${{ github.repository }}/commit/${{ github.sha }})" },
{ "name": "Actor", "value": "${{ github.actor }}", "inline": true },
{ "name": "Workflow", "value": "${{ github.workflow }}", "inline": true }
]
}]
}
JSON
)
curl -sS -X POST -H "Content-Type: application/json" \
-d "$payload" "$DISCORD_WEBHOOK_URL"
- name: Notify on Discord (Fail)
if: failure()
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK }}
run: |
payload=$(cat <<'JSON'
{
"username": "CD Bot",
"embeds": [{
"title": "❌ 배포 실패",
"description": "워크플로우 중 오류가 발생했습니다.\nActions 로그를 확인해주세요.",
"color": 15158332,
"fields": [
{ "name": "Repo", "value": "${{ github.repository }}", "inline": true },
{ "name": "Branch", "value": "${{ github.ref_name }}", "inline": true },
{ "name": "Commit", "value": "[${{ github.sha }}](https://github.com/${{ github.repository }}/commit/${{ github.sha }})" },
{ "name": "Actor", "value": "${{ github.actor }}", "inline": true },
{ "name": "Run", "value": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" }
]
}]
}
JSON
)
curl -sS -X POST -H "Content-Type: application/json" \
-d "$payload" "$DISCORD_WEBHOOK_URL"