Secrets 및 변수 설정
Secrets 설정 방법
- .env 방식: properties 파일처럼 선언하고, Secret에 Name(key)와 Secret(Value를 등록
- secret.properties 방식: 아래와 같이 Repository Secret에 Key-Value형태로 추가 - 이 방법으로 진행)
- 이후 Workflow에서 secret.properties 파일을 생성하고, Secret의 내용을 echo 명령어로 작성
Workflow 작성
배포 과정 요약
- 코드 체크아웃: Github Actions는 매번 새로운 환경에서 실행되므로, 코드 저장소를 가져와야 함
- JDK 설정 및 의존성 설치: local에서 작업했던 스프링 버전에 맞추기
- mvnw 실행 권한 추가: Jar파일 파일 생성 시 필요한 Maven Wrapper에 실행 권한 부여
- secret.properties 생성: Secrets 내용을 properties 파일로 변환해 프로젝트에 추가
- 프로젝트 빌드: -DskipTests 옵션을 사용하여 테스트를 제외하고 JAR 파일을 빌드
- EC2에 JAR 업로드: SCP 명령어를 사용해 EC2 서버에 JAR 파일을 업로드
- SSH 키 파일 권한 설정: SSH 키의 권한을 낮춰 EC2 접속 문제 방지(400권한 부여)
- Spring 서버 재시작: 기존 실행 중인 서버를 종료하고 새로 빌드한 JAR 파일로 애플리케이션을 재실행
- Spring 서버 작동 상태 확인: api중 하나를 실제로 요청해서 200ok가 잘 오는지 확인
name: Deploy Backend to EC2
on:
push:
branches:
- dev/be # dev/be 브랜치에 푸시될 때 실행
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# 1. 코드 체크아웃
- name: Checkout repository
uses: actions/checkout@v3
# 2. JDK 설정 및 의존성 설치
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17' # Spring Boot에 적합한 Java 버전
distribution: 'temurin'
# 3. mvnw 실행 권한 추가
- name: Add execute permission to mvnw
run: chmod +x ./mvnw
# 4. secret.properties 생성 및 환경 변수 추가
- name: Update secret.properties
run: |
touch ./src/main/resources/secret.properties
echo "${{ secrets.APPLICATION_SECRETS }}" > ./src/main/resources/secret.properties
# 5. 프로젝트 빌드
- name: Install dependencies and build JAR
run: |
./mvnw clean package -DskipTests # 테스트 제외하고 빌드
# 6. EC2에 JAR 파일 업로드
- name: Upload JAR to EC2
uses: appleboy/scp-action@v0.1.2
with:
host: ${{ secrets.SERVER_IP }}
username: ec2-user
key: ${{ secrets.SSAFYTRIP_KEY }}
source: target/SpringFrameWorkTrip-0.0.1-SNAPSHOT.jar
target: /home/ec2-user/backend
# 7. SSH 키 파일 생성
- name: Create SSH key file
run: |
echo "${{ secrets.SSAFYTRIP_KEY }}" > /tmp/ssafytrip-key.pem
chmod 400 /tmp/ssafytrip-key.pem
# 8. EC2에서 JAR 파일 실행
- name: Restart backend service
run: |
ssh -o StrictHostKeyChecking=no -i /tmp/ssafytrip-key.pem ec2-user@${{ secrets.SERVER_IP }} << 'EOF'
pkill -f 'java -jar' || true # 기존 실행 중인 애플리케이션 종료
nohup java -Duser.timezone=Asia/Seoul -jar /home/ec2-user/backend/target/SpringFrameWorkTrip-0.0.1-SNAPSHOT.jar > /home/ec2-user/backend/app.log 2>&1 &
EOF
# 9. 서버 상태 확인 (헬스 체크)
- name: Health Check
run: |
sleep 35 # 서버 기동 시간 대기
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" https://inssaroute.shop/api/attractions/guguns/1)
if [ "$RESPONSE" -ne 200 ]; then
echo "Health check failed. HTTP Status: $RESPONSE"
exit 1
fi
echo "Server is healthy! HTTP Status: $RESPONSE"
수동 배포 참고
- 이전에 작성한 아래 내용중 백엔드 관련 부분만 자동 배포로 전환했다고 생각하면 됩니다
2024.12.16 - [배포, 운영] - [배포] AWS EC2 생성 및 웹 프로젝트 배포
[배포] AWS EC2 생성 및 웹 프로젝트 배포
EC2 인스턴스 생성 및 설정EC2 생성 과정Amaozn Linux 2 vs Linux 2023에서 Linux 2를 선택한 이유아래글과 같은 오류도 있고 Linux2가 2018년 출시 이후 쌓아온 호환성과 풍부한 자료를 무시할 수 없다고 생각
developerjisu.tistory.com
'배포, 운영' 카테고리의 다른 글
[배포] Jenkins설정 및 Gitlab Webhook을 통한 자동배포 (1) | 2025.03.14 |
---|---|
[배포] Github Actions 활용한 Vue 프론트엔드 자동배포 (0) | 2024.12.28 |
[도메인] 도메인 구입 및 DNS 설정 (0) | 2024.12.16 |
[배포] AWS EC2 생성 및 웹 프로젝트 배포 (0) | 2024.12.16 |
[Ubuntu] Ubuntu 20.04서버 대기 모드로 들어가는 문제 해결 (0) | 2024.05.23 |