-
Notifications
You must be signed in to change notification settings - Fork 0
135 lines (110 loc) · 4.58 KB
/
deploy.yml
File metadata and controls
135 lines (110 loc) · 4.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
name: CI/CD
on:
push:
branches: [ develop ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Make gradlew executable
run: chmod +x gradlew
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
run: ./gradlew clean bootJar -x test
- name: Show artifact
run: ls -la build/libs/
- name: Copy JAR to EC2
uses: appleboy/scp-action@v0.1.5
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_KEY }}
port: 22
source: "build/libs/*-SNAPSHOT.jar"
target: "/home/ubuntu/app"
rm: true
overwrite: true
- name: Copy docker-compose.yml to EC2
uses: appleboy/scp-action@v0.1.5
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_KEY }}
port: 22
source: "docker-compose.yml"
target: "/home/ubuntu/app"
overwrite: true
- name: Deploy via SSH
uses: appleboy/ssh-action@v0.1.5
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_KEY }}
script: |
set -euo pipefail
cd /home/ubuntu/app
echo "=== Stop containers ==="
docker compose -p myapp-stack down --remove-orphans || true
echo "=== Clean old images ==="
docker rmi myapp:latest || true
docker system prune -f || true
echo "=== Prepare JAR ==="
rm -f click-0.0.1-SNAPSHOT.jar app.jar
cp build/libs/*-SNAPSHOT.jar click-0.0.1-SNAPSHOT.jar
echo "New JAR size: $(ls -lh click-0.0.1-SNAPSHOT.jar | awk '{print $5}')"
echo "=== Create Dockerfile ==="
TIMESTAMP=$(date +%s)
cat > Dockerfile <<'EOF'
FROM openjdk:17-jdk
WORKDIR /app
COPY click-0.0.1-SNAPSHOT.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /app/app.jar"]
EOF
echo "=== Build image ==="
docker build --no-cache --pull -t myapp:latest .
echo "=== Create .env ==="
cat > .env <<ENV
# --- DB ---
DB_URL=${{ secrets.DB_URL }}
DB_USERNAME=${{ secrets.DB_USERNAME }}
DB_PASSWORD=${{ secrets.DB_PASSWORD }}
# --- Kakao ---
KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}
KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }}
# 로컬 컨테이너용 콜백 (프런트 dev 서버 프록시 경로)
KAKAO_REDIRECT_URI=http://localhost:5173/api/member/kakao/callback
# --- AWS S3 (고정 자격증명) ---
AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }}
AWS_REGION=${{ secrets.AWS_REGION }}
AWS_ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_KEY=${{ secrets.AWS_SECRET_KEY }}
# --- Frontend Origins ---
# prod 컨테이너
APP_FRONTEND_ORIGIN=https://frontend-ts-eta.vercel.app
APP_FRONTEND_ALLOWLIST=https://frontend-ts-eta.vercel.app
APP_EXTERNAL_BASE_URL=https://frontend-ts-eta.vercel.app/api
CORS_ORIGINS=https://frontend-ts-eta.vercel.app
# local 컨테이너에서 사용할 값(같은 키를 compose에 주입)
# (compose에선 컨테이너별로 override하므로 여기 값 하나만 있어도 됨)
# 필요시 별도 *_LOCAL 변수로 두고 compose에서 매핑해도 됨.
# --- Google API ---
GOOGLE_API_KEY=${{ secrets.GOOGLE_API_KEY }}
ENV
echo "=== Up containers ==="
docker compose -p myapp-stack --env-file .env up -d --force-recreate
echo "=== Verify ==="
sleep 10
docker compose -p myapp-stack ps
echo "=== Check JAR in containers ==="
docker exec myapp-prod stat /app/app.jar || echo "Prod container file check failed"
docker exec myapp-local stat /app/app.jar || echo "Local container file check failed"
echo "=== Tail logs (last 50) ==="
docker compose -p myapp-stack logs --tail=50 myapp-prod || true
docker compose -p myapp-stack logs --tail=50 myapp-local || true