저번에는 개인 프로젝트에서 쓰이는 CI/CD 구축방식에 대해서 작성해 보았다.
복습하자면, github 에 코드를 넣은 뒤, AWS 의 EC2에서 git pull을 진행한 뒤에 자동으로 빌드되도록 했는데
이번에는 일반 프로젝트처럼 github actions 에서 빌드 완성물을 만든 뒤 EC2에 전달해 볼 예정이다.
1. 일반 프로젝트에서 쓰이는 CI/CD 구축 방식
name : Deploy To EC2
on:
push:
branches:
- main
jobs:
My-Deploy-Job:
runs-on: ubuntu-latest
steps:
- name: Github Repository 에 올린 파일들을 불러오기
uses: actions/checkout@v4
- name: Github Actions 확인
run: |
ls
pwd
- name: JDK 17 설치
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: application.properties 파일 생성 및 EC2 배포
run: |
echo "${{ secrets.APPLICATION_PROPERTIES }}" > src/main/resources/application.properties
- name: Test and Build with Gradle
run: ./gradlew clean build
- name: 빌드 결과물 확인
run: |
ls build/libs
- name: 빌드된 파일 이름 변경
run: |
mv build/libs/*SNAPSHOT.jar ./rusharp-server-SNAPSHOT.jar
- name: SCP로 빌드된 파일을 EC2로 복사
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }} # EC2의 주소
username: ${{ secrets.EC2_USERNAME }} # EC2 접속 username
key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2의 Key 파일의 내부 텍스트
source: "rusharp-server-SNAPSHOT.jar" # 복사할 파일 경로
target: "/home/ubuntu/rusharp-server/tobe" # 나중에 변경될 프로젝트 파일 경로
- name: SSH 로 EC2에 접속
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }} # EC2의 주소
username: ${{ secrets.EC2_USERNAME }} # EC2 접속 username
key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2의 Key 파일의 내부 텍스트
script_stop: true # 아래 script 중 실패하는 명령이 하나라도 있으면 실패로 처리
script: |
rm -rf /home/ubuntu/rusharp-server/current # 기존 환경변수 파일 삭제
mkdir /home/ubuntu/rusharp-server/current
# tobe 폴더에 복사된 jar 파일을 current 폴더로 이동
mv /home/ubuntu/rusharp-server/tobe/rusharp-server-SNAPSHOT.jar /home/ubuntu/rusharp-server/current/rusharp-server-SNAPSHOT.jar
cd /home/ubuntu/rusharp-server/current
sudo fuser -k -n tcp 8080 || true
nohup java -jar rusharp-server-SNAPSHOT.jar > ./output.log 2>&1 &
rm -rf /home/ubuntu/rusharp-server/tobe/*
일단 전체 명령어는 위와 같다.
하나하나 차례대로 살펴보자면

github repository에 있는 소스 코드를 Github Actions 컴퓨터로 불러온 뒤
ls 를 통해 현재 경로 하위의 파일과 폴더를 확인하고 pwd 로 현재 경로를 확인한다.

프로젝트 빌드에 필요한 Java개발 환경을 설치한다.

gitignore 에 포함된 application.properties 내용을 Github Secrets 에서 가져와서 빌드하기 전에 직접 파일로 만든다.

실제 프로젝트를 빌드하는 핵심 단계로 기존의 빌드 흔적을 지운 뒤 코드를 컴파일 한 뒤 실행 가능한 JAR파일을 만든다.

빌드된 파일 이름을 관리하기 쉬운 고정 이름으로 변경하여 배포 스크립트에서 파일명 관리를 편리하게 만든다.

이후 EC2에 해당 jar 파일을 실제 운영 서버인 EC2로 전송한다.
참고로 /home/ubuntu/rusharp-server/current 폴더에 있는 서버는 실행중인 상태로 해당 폴더에
동일한 파일을 옮길 수 없어서 tobe라는 임시 폴더에 jar파일을 옮긴 뒤 추후 삭제한다.

마지막으로 SSH로 EC2에 접속한 뒤에 기존 배포 폴더를 정리하고 새로 만든다.
일단 그전에 jar 파일이 있는 current 폴더를 삭제한 뒤 동일한 경로의 폴더를 새로 생성한다.
이후 tobe 폴더의 jar파일을 current 폴더로 이동하고 현재 진행중인 서버를 강제 종료시킨 다음에
새 서버를 실행시킨 뒤 마지막으로 임시로 썼던 tobe 폴더를 삭제함으로써 배포를 완료한다.
git update-index --chmod=+x gradlew
git add gradlew
git commit -m "Add execute permission to gradlew"
git push origin main
참고로 간혹 "./gradlew: Permission denied" 에러가 나오는 경우가 있는데,
그럴 땐 git bash에서 >아래 명령어를 입력하여 git index 의 gradlew 파일을 실행 가능 상태로 변경해야 한다.
마지막으로 다시 정리하자면 일반 프로젝트에서 동작되는 구축 방식은 아래와 같다.

jobs의 name 기준으로 "Github Repository 에 올린 파일들을 불러오기" 부터
"Test and Build with Gradle"까지 Github Actions 안에서 실제 빌드 파일을 생성한다.
두번째로 "SCP로 빌드된 파일을 EC2로 복사"에서 빌드 파일을 EC2로 복사하고,
"SSH 로 EC2에 접속" 에서 ssh 로 EC2에 접속하여 배포 스크립트를 진행까지 해보았다.
다음에는 Docker 까지 활용해서 CI/CD 프로세스를 구축해 볼 예정이다.
'Server&load > CI CD' 카테고리의 다른 글
| 컨테이너 기반의 프로젝트에서 많이 사용되는 CI/CD 구축하기 (1) | 2026.01.18 |
|---|---|
| container 기반의 프로젝트 CI/CD 구축 방법 (Docker) (0) | 2026.01.11 |
| 개인 프로젝트에서 쓰이는 CI/CD 구축 방법 실습하기 (0) | 2025.12.28 |
| 프로젝트 특징별 주로 사용되는 CI/CD 구축 방법 (0) | 2025.06.25 |
| Github Actions 기본 문법 및 사용 방법 정리 (0) | 2025.06.24 |