-
Notifications
You must be signed in to change notification settings - Fork 0
178 lines (155 loc) · 6.33 KB
/
deploy-java.yml
File metadata and controls
178 lines (155 loc) · 6.33 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
name: Deploy
on:
workflow_run:
workflows: ["CI (Java)"]
types: [completed]
jobs:
deploy:
name: Deploy to AWS EC2
runs-on: ubuntu-latest
if: |
github.event.workflow_run.conclusion == 'success' &&
startsWith(github.event.workflow_run.head_branch, 'user-service-v')
steps:
- uses: actions/checkout@v4
- name: Create env file and config folder
run: |
echo "DB_HOST=${{ secrets.DB_HOST }}" > .env.prod
echo "DB_PORT=${{ secrets.DB_PORT }}" >> .env.prod
echo "DB_USER=${{ secrets.DB_USER }}" >> .env.prod
echo "DB_PASS=${{ secrets.DB_PASS }}" >> .env.prod
echo "DB_NAME=${{ secrets.DB_NAME }}" >> .env.prod
echo "LOKI_HOST=${{ secrets.LOKI_HOST }}" >> .env.prod
echo "LOKI_USERNAME=${{ secrets.LOKI_USERNAME }}" >> .env.prod
echo "LOKI_PASSWORD=${{ secrets.LOKI_PASSWORD }}" >> .env.prod
echo "ENV_NAME=${{ secrets.ENV_NAME }}" >> .env.prod
echo "FASTAPI_SERVER_HOST=${{ secrets.FASTAPI_SERVER_HOST }}" >> .env.prod
echo "GRAFANA_CLOUD_PROMETHEUS_URL=${{ secrets.GRAFANA_CLOUD_PROMETHEUS_URL }}" >> .env.prod
echo "GRAFANA_CLOUD_PROMETHEUS_USER=${{ secrets.GRAFANA_CLOUD_PROMETHEUS_USER }}" >> .env.prod
echo "GRAFANA_CLOUD_API_KEY=${{ secrets.GRAFANA_CLOUD_API_KEY }}" >> .env.prod
echo "MAIL_USERNAME=${{ secrets.MAIL_USERNAME }}" >> .env.prod
echo "MAIL_PASSWORD=${{ secrets.MAIL_PASSWORD }}" >> .env.prod
# Create config folder and copy config files
mkdir -p config
cp apps/user-service/src/main/resources/application-production.yml config/
cp apps/user-service/src/main/resources/log4j2-production.yml config/
- name: Set repo lowercase
run: echo "REPO_LC=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV
- name: Copy docker compose files to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ubuntu
key: ${{ secrets.SERVER_SSH_KEY }}
source: "docker/production/docker-compose.yml"
target: "~/app"
overwrite: true
- name: Copy .env.prod file to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ubuntu
key: ${{ secrets.SERVER_SSH_KEY }}
source: ".env.prod"
target: "~/app/docker/production/"
overwrite: true
- name: Copy Caddyfile to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ubuntu
key: ${{ secrets.SERVER_SSH_KEY }}
source: "docker/production/Caddyfile"
target: "~/app"
overwrite: true
- name: Copy promtail-config to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ubuntu
key: ${{ secrets.SERVER_SSH_KEY }}
source: "docker/production/promtail-config.yml"
target: "~/app"
- name: Copy agent-config to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ubuntu
key: ${{ secrets.SERVER_SSH_KEY }}
source: "docker/production/agent-config.yml"
target: "~/app"
overwrite: true
- name: Copy application-production.yml to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ubuntu
key: ${{ secrets.SERVER_SSH_KEY }}
source: "config/application-production.yml"
target: "~/app/docker/production/"
overwrite: true
- name: Copy log4j2-production.yml to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ubuntu
key: ${{ secrets.SERVER_SSH_KEY }}
source: "config/log4j2-production.yml"
target: "~/app/docker/production/"
overwrite: true
- name: Deploy on EC2
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ubuntu
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
cd ~/app/docker/production
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
# 최신 이미지 pull
docker-compose pull
# 기존 컨테이너 종료 및 제거
docker-compose down
# 새 컨테이너 배포
docker-compose up -d
# 컨테이너 상태 확인
sleep 5
docker-compose ps
# 헬스 체크 (컨테이너가 healthy 상태가 될 때까지 대기)
echo "Waiting for containers to become healthy..."
for i in {1..30}; do
unhealthy=$(docker ps --filter "health=unhealthy" --format "{{.Names}}")
starting=$(docker ps --filter "health=starting" --format "{{.Names}}")
if [ -z "$unhealthy" ] && [ -z "$starting" ]; then
echo "All containers are healthy!"
break
fi
echo "Waiting... ($i/30)"
sleep 2
done
# 사용하지 않는 dangling 이미지 정리
docker image prune -f
- name: Send Discord notification - Success
if: success()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL }}
with:
args: |
**배포 성공**
**Repository:** ${{ env.REPO_LC }}
**Tag:** ${{ github.ref_name }}
**Server:** ${{ secrets.SERVER_HOST }}
**Status:** Success!
- name: Send Discord notification - Failure
if: failure()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL }}
with:
args: |
**배포 실패**
**Repository:** ${{ env.REPO_LC }}
**Tag:** ${{ github.ref_name }}
**Error:** 배포 중 오류가 발생했습니다.
**Check:** ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}