Skip to content

Commit 6fa940d

Browse files
authored
Merge pull request #5 from 100-hours-a-week/feat/ci
ci: startup 스크립트 적용 및 CD 스크립트 실행으로 변경
2 parents 8f285dd + 9da8db8 commit 6fa940d

File tree

2 files changed

+116
-47
lines changed

2 files changed

+116
-47
lines changed

.github/workflows/cd-development.yml

Lines changed: 16 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,19 @@ jobs:
2727
target: "/home/${{ secrets.DEVELOP_USERNAME }}/ai/temp"
2828
strip_components: 0
2929

30-
# 3. 배포 실행 (중단 배포)
30+
# 3. 배포 스크립트 전송
31+
- name: Transfer Startup Script
32+
uses: appleboy/scp-action@master
33+
with:
34+
host: ${{ secrets.DEVELOP_HOST }}
35+
username: ${{ secrets.DEVELOP_USERNAME }}
36+
key: ${{ secrets.DEVELOP_KEY }}
37+
port: ${{ secrets.DEVELOP_PORT || 22 }}
38+
source: "ai-startup.sh"
39+
target: "/home/${{ secrets.DEVELOP_USERNAME }}/ai/"
40+
strip_components: 0
41+
42+
# 4. 배포 실행
3143
- name: Deploy Application
3244
uses: appleboy/ssh-action@master
3345
with:
@@ -38,53 +50,10 @@ jobs:
3850
command_timeout: 10m
3951
request_pty: false
4052
script: |
41-
set -e
42-
43-
APP_DIR="/home/${{ secrets.DEVELOP_USERNAME }}/ai"
44-
TEMP_DIR="$APP_DIR/temp"
45-
PORT=8001
46-
47-
echo "===== AI 서버 배포 시작 ====="
48-
49-
# 1. 기존 프로세스 중지 (포트 기반)
50-
echo "[1/5] 기존 프로세스 종료"
51-
PID=$(lsof -ti :$PORT || true)
52-
if [ -n "$PID" ]; then
53-
kill -15 "$PID"
54-
sleep 2
55-
fi
56-
57-
# 2. 소스 교체 (venv, logs는 유지)
58-
echo "[2/5] 소스 코드 교체"
59-
rm -rf $APP_DIR/src $APP_DIR/app.py $APP_DIR/requirements.txt $APP_DIR/README.md $APP_DIR/data $APP_DIR/scripts $APP_DIR/test_all_task.py
60-
cp -r $TEMP_DIR/* $APP_DIR/
61-
rm -rf $TEMP_DIR/*
62-
63-
# 3. 가상환경 및 의존성 설치
64-
echo "[3/5] 의존성 설치"
65-
cd $APP_DIR
66-
python3 -m venv venv
67-
source venv/bin/activate
68-
pip install --no-cache-dir -r requirements.txt
69-
70-
# 4. 애플리케이션 시작
71-
echo "[4/5] FastAPI 서버 실행"
72-
nohup python3 app.py > logs/ai.log 2>&1 &
73-
74-
# 5. 시작 확인
75-
echo "[5/5] 서버 시작 확인"
76-
sleep 2
77-
if lsof -ti :$PORT > /dev/null; then
78-
echo "===== 배포 완료 ====="
79-
echo "AI 서버 실행 중 (port $PORT)"
80-
exit 0
81-
else
82-
echo "===== 배포 실패 ====="
83-
tail -20 logs/ai.log
84-
exit 1
85-
fi
53+
chmod +x /home/${{ secrets.DEVELOP_USERNAME }}/ai/ai-startup.sh
54+
bash /home/${{ secrets.DEVELOP_USERNAME }}/ai/ai-startup.sh
8655
87-
# 4. 배포 결과 알림
56+
# 5. 배포 결과 알림
8857
- name: Notify Deployment Result
8958
if: always()
9059
uses: sarisia/actions-status-discord@v1

ai-startup.sh

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#!/bin/bash
2+
set -e
3+
4+
APP_DIR="/home/appuser/ai"
5+
PORT=8001
6+
7+
echo "===== AI 서버 배포 시작 ====="
8+
9+
# 1. 기존 프로세스 중지 (포트 기반)
10+
echo "[1/5] 기존 프로세스 종료"
11+
PID=$(lsof -ti :$PORT || true)
12+
if [ -n "$PID" ]; then
13+
echo "기존 프로세스 종료 중 (PID: $PID)..."
14+
kill -15 "$PID"
15+
16+
# 프로세스가 완전히 종료될 때까지 대기 (최대 10초)
17+
for i in {1..10}; do
18+
if ! lsof -ti :$PORT > /dev/null 2>&1; then
19+
echo "기존 프로세스 종료 완료"
20+
break
21+
fi
22+
echo "프로세스 종료 대기 중... ($i/10)"
23+
sleep 1
24+
done
25+
26+
# 여전히 실행 중이면 강제 종료
27+
if lsof -ti :$PORT > /dev/null 2>&1; then
28+
echo "강제 종료 실행 중..."
29+
kill -9 $(lsof -ti :$PORT)
30+
sleep 1
31+
fi
32+
else
33+
echo "실행 중인 프로세스 없음"
34+
fi
35+
36+
# 2. 소스 교체 (temp에서 복사)
37+
echo "[2/5] 소스 코드 교체"
38+
cd $APP_DIR
39+
40+
# temp 디렉토리 확인
41+
if [ ! -d "$TEMP_DIR" ] || [ -z "$(ls -A $TEMP_DIR)" ]; then
42+
echo "에러: temp 디렉토리가 비어있습니다. SCP 전송이 완료되지 않았습니다."
43+
exit 1
44+
fi
45+
46+
# 기존 소스 삭제 (venv, logs는 유지)
47+
rm -rf src app.py requirements.txt README.md data scripts test_all_task.py
48+
49+
# temp에서 복사
50+
cp -r $TEMP_DIR/* $APP_DIR/
51+
rm -rf $TEMP_DIR/*
52+
53+
echo "소스 코드 교체 완료"
54+
55+
# 3. 가상환경 및 의존성 설치
56+
echo "[3/5] 의존성 설치"
57+
cd $APP_DIR
58+
59+
# venv가 없을 때만 생성
60+
if [ ! -d "venv" ]; then
61+
echo "가상환경 생성 중..."
62+
python3 -m venv venv
63+
fi
64+
65+
. venv/bin/activate
66+
pip install --no-cache-dir -r requirements.txt
67+
echo "의존성 설치 완료"
68+
69+
# 4. 애플리케이션 시작
70+
echo "[4/5] FastAPI 서버 실행"
71+
72+
# logs 디렉토리 생성
73+
mkdir -p $APP_DIR/logs
74+
75+
cd $APP_DIR
76+
setsid nohup $APP_DIR/venv/bin/python $APP_DIR/app.py > $APP_DIR/logs/ai.log 2>&1 < /dev/null &
77+
APP_PID=$!
78+
echo "서버 시작됨 (PID: $APP_PID)"
79+
80+
# 5. 시작 확인
81+
echo "[5/5] 서버 시작 확인"
82+
83+
# 서버가 포트를 바인딩할 때까지 대기 (최대 15초)
84+
for i in {1..15}; do
85+
if lsof -ti :$PORT > /dev/null 2>&1; then
86+
RUNNING_PID=$(lsof -ti :$PORT)
87+
echo "===== 배포 완료 ====="
88+
echo "AI 서버 실행 중 (port $PORT, PID: $RUNNING_PID)"
89+
exit 0
90+
fi
91+
echo "서버 시작 대기 중... ($i/15)"
92+
sleep 1
93+
done
94+
95+
echo "===== 배포 실패 ====="
96+
echo "서버가 시작되지 않았습니다."
97+
echo ""
98+
echo "최근 로그 (마지막 30줄):"
99+
tail -30 $APP_DIR/logs/ai.log || echo "로그 파일을 찾을 수 없습니다"
100+
exit 1

0 commit comments

Comments
 (0)