반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- Array
- 문자열
- Java
- Eclipse
- list
- CSS
- 배열
- 자바스크립트
- input
- vscode
- string
- javascript
- SpringBoot
- junit5
- 테스트자동화
- js
- 인텔리제이
- HashMap
- 자바
- IntelliJ
- junit
- java테스트
- ArrayList
- 스프링부트
- Visual Studio Code
- 자바문법
- 단위테스트
- math
- html
- 정규식
Archives
- Today
- Total
어제 오늘 내일
[Spring Boot] "서버에 파일 넣고 켜는 것도 귀찮아!" GitHub Actions로 AWS EC2 자동 배포하기 (CD) 본문
IT/SpringBoot
[Spring Boot] "서버에 파일 넣고 켜는 것도 귀찮아!" GitHub Actions로 AWS EC2 자동 배포하기 (CD)
hi.anna 2026. 3. 18. 00:42
지난 시간에는 GitHub가 우리 코드를 대신 빌드해 주는 것까지 성공했습니다.
하지만 빌드된 파일(jar)이 GitHub 서버에만 있으면 아무 소용 없겠죠? 이걸 우리의 진짜 서버(AWS EC2)로 옮겨서 실행시켜야 합니다.
오늘은 appleboy라는 아주 유명한 액션을 사용해서 파일 전송(SCP)과 명령어 실행(SSH)을 자동화해 보겠습니다.
1. 준비물: AWS EC2와 Key 파일
당연히 서버가 있어야겠죠?
- AWS EC2 인스턴스 (Ubuntu 추천)
- 접속용 키 파일 (
.pem): 서버 만들 때 받은 그 파일입니다. 절대 잃어버리면 안 됩니다! - Java 설치: 서버에 미리 자바를 설치해 두세요.
# (EC2 터미널에서) sudo apt update sudo apt install openjdk-17-jdk java -version # 설치 확인
---
### 2. 보안 설정: GitHub Secrets (절대 공개 금지!)
내 서버의 **IP 주소**나 **비밀 키**를 코드(`yaml`)에 적으면 어떻게 될까요? 해커들이 채굴기를 돌리러 올 겁니다.
GitHub에는 이런 비밀 정보를 안전하게 저장하는 금고가 있습니다.
1. GitHub 저장소 -> **Settings** -> **Secrets and variables** -> **Actions**
2. **New repository secret** 클릭
3. 다음 변수들을 등록하세요.
* `EC2_HOST`: 내 서버 IP 주소 (예: `13.124.xx.xx`)
* `EC2_USERNAME`: 접속 계정 (Ubuntu는 보통 `ubuntu`)
* `EC2_KEY`: `.pem` 파일 내용을 메모장으로 열어서 **전체 복사** 후 붙여넣기
---
### 3. 워크플로우 수정하기 (`gradle.yml`)
지난번에 만든 파일 뒤에 **배포(Deploy) 단계**를 추가합니다.
```yaml
# ... (앞부분 빌드 job 생략)
# 2. 배포 Job 추가
deploy:
needs: build # 빌드가 성공해야만 실행됨!
runs-on: ubuntu-latest
steps:
# (1) 빌드된 파일 가져오기 (GitHub Actions 내부 공유)
- name: Download Artifact
uses: actions/download-artifact@v3
with:
name: built-jar # 빌드 단계에서 업로드한 이름
# (2) SCP로 파일 전송 (GitHub -> EC2)
- name: Copy JAR to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
source: "*.jar" # 전송할 파일
target: "/home/ubuntu/app" # 서버의 저장 위치
# (3) SSH로 접속해서 실행 명령 내리기
- name: Execute Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
script: |
# 1. 실행 중인 서버 종료 (없으면 패스)
pgrep -f java | xargs -r kill -9
# 2. 새 파일 실행 (nohup으로 백그라운드 실행)
# 로그는 app.log에 남김
nohup java -jar /home/ubuntu/app/*.jar > /home/ubuntu/app/app.log 2>&1 &
주의:
appleboy액션을 쓰려면 빌드 단계(build job) 마지막에upload-artifact로 jar 파일을 올려주는 단계가 먼저 있어야 합니다. (파일을 job끼리 공유하기 위함)
4. 전체 코드 (완성본)
헷갈리실까 봐 build와 deploy를 합친 전체 코드를 공유합니다.
name: Spring Boot CI/CD
on:
push:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- run: chmod +x gradlew
- run: ./gradlew clean build
# ★ 빌드된 파일을 GitHub 아티팩트 저장소에 올림
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: built-jar
path: build/libs/*.jar
deploy:
needs: build # 빌드가 끝나면 실행
runs-on: ubuntu-latest
steps:
# ★ 아티팩트 저장소에서 파일 다운로드
- name: Download Artifact
uses: actions/download-artifact@v3
with:
name: built-jar
path: deploy-jar # 다운로드 받을 폴더 이름
- name: Copy JAR to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
source: "deploy-jar/*.jar"
target: "/home/ubuntu/app"
strip_components: 1 # 폴더 껍데기 벗기기
- name: Execute Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
script: |
echo "Stopping previous server..."
pgrep -f java | xargs -r kill -9
sleep 5 # 종료될 때까지 잠시 대기
echo "Starting new server..."
nohup java -jar /home/ubuntu/app/*.jar > /home/ubuntu/app/app.log 2>&1 &
5. 결과 확인
이제 코드를 push하면 GitHub Actions 탭에서 build -> deploy가 순차적으로 실행되는 멋진 광경을 볼 수 있습니다.
EC2 서버에 들어가지 않아도, 내 컴퓨터 터미널을 열지 않아도, 코드만 올리면 몇 분 뒤에 실제 서버가 최신 버전으로 바뀝니다. 이게 바로 CD(지속적 배포)의 힘입니다!
마치며
오늘의 결론입니다.
- GitHub Secrets에 서버 접속 정보를 안전하게 저장한다.
- SCP 액션으로 파일을 전송하고, SSH 액션으로 실행 명령을 내린다.
nohup을 써서 터미널이 끊겨도 서버가 계속 돌아가게 한다.
이제 기본적인 배포까지 끝났습니다! 하지만 이렇게 하면 배포하는 동안 서버가 잠시 꺼지는(Downtime) 문제가 있습니다.
다음 포스팅에서는 "서버를 끄지 않고 배포한다고?" 무중단 배포를 위한 첫걸음, Nginx(리버스 프록시) 설정하기에 대해 알아보겠습니다.
반응형
'IT > SpringBoot' 카테고리의 다른 글
Comments
