개요
- EC2에 배포한 .jar를 github actions와 연동하여 CI/CD 자동화 파이프라인을 구축한다.
- CI (Continuous Integration, 지속적 통합)
- 중앙 저장소에 통합하고, 자동으로 빌드·테스트해서 문제가 없는지 확인하는 과정
- CD Continuous Delivery (지속적 제공), Continuous Deployment (지속적 배포)
- 운영 배포까지도 자동화
- 코드 푸시 → 빌드 → 테스트 → 운영 서버 반영까지 전부 자동
EC2 배포 과정은 아래 글 참고
AWS EC2에 Spring boot+React 프로젝트 배포하기
배포 방식.jar 를 AWS EC2에 배포 java -jar app.jar → 바로 실행 가능 (EC2에서 아주 간단) EC2 생성AWS 가입 및 로그인EC2 선택 후 인스턴스 시작 인스턴스 기본 정보 입력인스턴스 이름 입력OS : Amazon Linux
oeuni.tistory.com
PuTTY에 java 설치
sudo amazon-linux-extras enable corretto17
sudo yum install -y java-17-amazon-corretto
java -version
.jar 백그라운드 실행
- .jar가 있는 위치로 이동하여 nohup 명령어 실행
- 새 JAR을 백그라운드에서 실행, 로그는 log.txt 에 저장
- nohup : no hang up의 줄임말, 터미널을 꺼도 프로세스가 계속 실행됨
- 👉 즉, EC2에서 로그아웃해도 서버가 살아있음
cd /home/ec2-user/
nohup java -jar exam-0.0.1-SNAPSHOT.jar > log.txt 2>&1 &
GitHub Secrets 설정
GitHub → repository 선택→ Settings → Secrets and variables → Actions → New repository secret 에서 3가지 등록
- EC2_HOST → EC2 퍼블릭 IP (예: 13.39.xx.xx)
- EC2_USER → ec2-user (Amazon Linux) 또는 ubuntu (Ubuntu 서버일 경우)
- EC2_SSH_KEY → .pem 파일 내용을 그대로 붙여넣기
GitHub Actions 워크플로우 작성
name: Deploy to EC2
on:
push:
branches:
- master # master 브랜치에 push 시 배포 실행
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 레포지토리 코드 가져오기
- name: Checkout code
uses: actions/checkout@v3
# 2. JDK 17 세팅
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# 2-1. Node.js 설치
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '20'
# 3. 실행권한 부여 및 Gradle 빌드 (jar 생성)
- name: Make Gradle Wrapper executable
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew clean build -x test --no-daemon -Dorg.gradle.jvmargs="-Xmx1024m"
# 4. EC2 서버에 .jar 파일 복사
- name: Copy jar to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ec2-user
key: ${{ secrets.EC2_SSH_KEY }}
source: "build/libs/exam-0.0.1-SNAPSHOT.jar"
target: "/home/ec2-user/"
# 5. EC2 서버에서 실행 (기존 프로세스 종료 후 새로 실행, 스크립트 이용)
- name: Restart app on EC2
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ec2-user
key: ${{ secrets.EC2_SSH_KEY }}
script: /home/ec2-user/deploy.sh
진행 흐름
- 작업 후 master 브랜치에 푸쉬
- actions 실행
- 레포지토리 코드 가져오기
- JDK 17 세팅
- Node.js 설치
- Gradle 빌드
- EC2 서버에 .jar 파일 복사
- EC2 서버에서 .jar 백그라운드 실행
- actions 종료
EC2에서 실행 스크립트 작성
vi deploy.sh
i 누르고 아래 내용 복붙하기
#!/bin/bash
# 기존 실행 중인 jar 종료
pids=$(pgrep -f "exam-0.0.1-SNAPSHOT.jar")
if [ -n "$pids" ]; then
kill -9 $pids
fi
# 새로 실행 (setsid + nohup, 백그라운드, 로그 저장)
setsid nohup java -Xms128m -Xmx512m -jar /home/ec2-user/exam-0.0.1-SNAPSHOT.jar \
> /home/ec2-user/app.log 2>&1 < /dev/null &
작성 후 ESC → :wq 입력 → Enter
스크립트에 실행 권한 부여
chmod +x /home/ec2-user/deploy.sh
테스트
테스트를 위해 게시글 목록 헤더 양옆에 리본을 추가하고 커밋해본다.
actions가 정상 실행 완료됨을 확인
서버에서도 반영된 것을 볼 수 있다.
'서버&인프라 > Cloud' 카테고리의 다른 글
github Actions process exited with status 137 from signal kill 에러 해결방법 (0) | 2025.09.19 |
---|---|
AWS RDS가 PuTTY에선 연결되지만 workbench 연결 안 되는 오류 (0) | 2025.09.16 |
AWS EC2에 Spring boot+React 프로젝트 배포하기 (0) | 2025.09.16 |
Google Cloud Run으로 배포한 서비스를 가비아 도메인과 연결하기 (0) | 2025.01.10 |
docker 이미지를 Google Cloud Run에 배포하기 (0) | 2025.01.09 |