1+ name : BE CI/CD
2+
3+ # 이 워크플로우가 언제 실행될지 정의합니다.
4+ on :
5+ push :
6+ branches : [ "main" ] # main 브랜치에 코드가 푸시(push)될 때 실행됩니다.
7+
8+ # 실행될 작업(job)들을 정의합니다.
9+ jobs :
10+ build-and-deploy :
11+ # 작업이 실행될 가상 환경을 지정합니다. (Ubuntu 최신 버전)
12+ runs-on : ubuntu-latest
13+
14+ # 작업의 단계(step)들을 정의합니다.
15+ steps :
16+ # 1. 소스 코드 체크아웃
17+ # GitHub 저장소의 코드를 가상 환경으로 가져옵니다.
18+ - name : Checkout
19+ uses : actions/checkout@v4
20+
21+ # 2. JDK 17 설치
22+ # 빌드에 필요한 Java 환경을 설정합니다.
23+ - name : Set up JDK 17
24+ uses : actions/setup-java@v4
25+ with :
26+ java-version : ' 17'
27+ distribution : ' temurin'
28+
29+ # 3. Gradle 실행 권한 부여
30+ # gradlew 스크립트에 실행 권한을 줍니다.
31+ - name : Grant execute permission for gradlew
32+ run : chmod +x gradlew
33+
34+ # 4. Gradle로 빌드
35+ # 코드를 컴파일하고 테스트를 실행한 뒤, 실행 가능한 JAR 파일을 생성합니다.
36+ - name : Build with Gradle
37+ run : ./gradlew build
38+
39+ # 5. GCP 인증
40+ # GitHub Secrets에 저장된 서비스 계정 키를 사용하여 GCP에 인증합니다.
41+ - name : Authenticate to Google Cloud
42+ uses : ' google-github-actions/auth@v2'
43+ with :
44+ credentials_json : ' ${{ secrets.GCP_SA_KEY }}'
45+
46+ # 6. 빌드된 JAR 파일을 GCP VM으로 전송
47+ # gcloud scp 명령어를 사용해 JAR 파일을 VM의 홈 디렉토리로 복사합니다.
48+ - name : Transfer JAR to GCP VM
49+ run : |
50+ # build/libs/ 폴더에서 생성된 JAR 파일 이름을 자동으로 찾습니다.
51+ JAR_FILE=$(find build/libs/ -name "*.jar" | head -n 1)
52+ gcloud compute scp \
53+ $JAR_FILE \
54+ ${{ secrets.GCP_INSTANCE_NAME }}:~/ \
55+ --project=${{ secrets.GCP_PROJECT_ID }} \
56+ --zone=${{ secrets.GCP_ZONE }}
57+
58+ # 7. VM에 접속하여 애플리케이션 실행 (환경 변수 주입)
59+ # gcloud ssh 명령어로 VM에 접속하여 기존 앱을 종료하고,
60+ # GitHub Secrets의 값들을 환경 변수로 주입하여 새 앱을 실행합니다.
61+ - name : Deploy to GCP VM
62+ env :
63+ # Spring Boot 애플리케이션에 필요한 모든 Secret들을 env 컨텍스트에 등록합니다.
64+ DB_URL : ${{ secrets.DB_URL }}
65+ DB_USERNAME : ${{ secrets.DB_USERNAME }}
66+ DB_PASSWORD : ${{ secrets.DB_PASSWORD }}
67+ JWT_SECRET : ${{ secrets.JWT_SECRET }} # JWT Secret 추가
68+ GOOGLE_EMAIL : ${{ secrets.GOOGLE_EMAIL }}
69+ GOOGLE_EMAIL_KEY : ${{ secrets.GOOGLE_EMAIL_KEY }}
70+ NAVER_CLIENT : ${{ secrets.NAVER_CLIENT }}
71+ NAVER_SECRET : ${{ secrets.NAVER_SECRET }}
72+ OPENAI_API_KEY : ${{ secrets.OPENAI_API_KEY }}
73+ run : |
74+ # build/libs/ 폴더에서 생성된 JAR 파일의 순수 이름만 추출합니다.
75+ JAR_FILE_NAME=$(basename $(find build/libs/ -name "*.jar" | head -n 1))
76+
77+ # gcloud ssh 명령어로 VM에 접속하여 배포 스크립트를 실행합니다.
78+ gcloud compute ssh ${{ secrets.GCP_INSTANCE_NAME }} \
79+ --project=${{ secrets.GCP_PROJECT_ID }} \
80+ --zone=${{ secrets.GCP_ZONE }} \
81+ --command="
82+ # 기존에 실행 중인 동일한 이름의 Java 프로세스를 찾아 종료합니다.
83+ PID=\$(pgrep -f '$JAR_FILE_NAME')
84+ if [ -n \"\$PID\" ]; then
85+ echo 'Stopping existing process with PID: \$PID'
86+ kill -9 \$PID
87+ sleep 5
88+ fi
89+
90+ # env 컨텍스트에 등록된 변수들을 nohup 명령어 앞에 붙여서 실행합니다.
91+ echo 'Starting new application process...'
92+ nohup env \
93+ DB_URL='${DB_URL}' \
94+ DB_USERNAME='${DB_USERNAME}' \
95+ DB_PASSWORD='${DB_PASSWORD}' \
96+ JWT_SECRET='${JWT_SECRET}' \
97+ GOOGLE_EMAIL='${GOOGLE_EMAIL}' \
98+ GOOGLE_EMAIL_KEY='${GOOGLE_EMAIL_KEY}' \
99+ NAVER_CLIENT='${NAVER_CLIENT}' \
100+ NAVER_SECRET='${NAVER_SECRET}' \
101+ OPENAI_API_KEY='${OPENAI_API_KEY}' \
102+ java -jar ~/$JAR_FILE_NAME > ~/app.log 2>&1 &
103+ "
0 commit comments