GitHub Actions로 CI/CD 구축 #1에서는 개인 프로젝트나 토이 프로젝트에 적합한 방식으로 CI/CD를 구축하는 방법을 소개했습니다.
이번 글에서는 일반적인 프로젝트에서 주로 사용하는 CI/CD 구축 방법에 대해 알아보겠습니다. 이번에 다룰 CI/CD의 전체적인 흐름은 아래와 같습니다.

이전에 다루었던 CI/CD 구축 방법과 이번 방법의 가장 큰 차이점은 빌드를 어디서 진행하느냐입니다. 이전에는 EC2에서 직접 프로젝트를 빌드했다면, 이번에는 GitHub Actions에서 빌드를 진행하고, 빌드 완료 파일을 SCP를 사용해 EC2에 전달하여 배포하는 방식을 다룰 예정입니다.
일반적인 프로젝트에서의 CI/CD 구축 방법의 장단점은 다음과 같습니다.
먼저, 기존에 실행중인 서버를 종료하고 프로젝트 폴더를 삭제합니다.

다음으로, 프로젝트가 EC2가 아닌 GitHub Actions에서 빌드되도록 워크플로 파일을 수정합니다.


- name: GitHub Repository 파일 불러오기
uses: actions/checkout@v4
actions/checkout@v4를 사용하여 현재 브랜치의 파일과 코드를 작업 환경으로 불러옵니다.- name: JDK 17 버전 설치
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
actions/setup-java@v4 액션을 사용하며, temurin 배포판의 JDK 17을 설치합니다.- name: application.yml 파일 만들기
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
application.yml 파일은 보안상 리포지토리에 포함되지 않으므로, GitHub Secrets에서 내용을 불러와 생성합니다.secrets.APPLICATION_PROPERTIES에 저장된 값을 src/main/resources/application.yml 경로에 저장합니다.- name: 테스트 및 빌드하기
run: |
./gradlew clean build || (cat ./build/reports/tests/test/index.html && exit 1)
build/libs 디렉토리에 생성됩니다.- name: 빌드된 파일 이름 변경하기
run: mv ./build/libs/*SNAPSHOT.jar ./project.jar
project.jar로 변경하여 관리하기 쉽도록 간소화합니다.- name: SCP로 EC2에 빌드된 파일 전송하기
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: project.jar
target: /home/ubuntu/instagram-server/tobe
SCP(Secure Copy Protocol)를 사용하여 빌드된 파일을 EC2 서버로 전송합니다./home/ubuntu/instagram-server/tobe 경로에 업로드됩니다.- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script_stop: true
script: |
echo "Stopping any running application on port 8080..."
sudo fuser -k -n tcp 8080 || true
echo "Preparing deployment directories..."
rm -rf /home/ubuntu/instagram-server/current
mkdir -p /home/ubuntu/instagram-server/current
mv /home/ubuntu/instagram-server/tobe/project.jar /home/ubuntu/instagram-server/current/project.jar
echo "Starting application..."
cd /home/ubuntu/instagram-server/current
nohup java -jar project.jar > ./output.log 2>&1 &
echo "Cleaning up temporary files..."
rm -rf /home/ubuntu/instagram-server/tobe
sudo fuser -k -n tcp 8080nohup 명령어를 사용하여 애플리케이션을 백그라운드에서 실행.tobe 디렉토리를 삭제하여 정리.- name: GitHub Repository 파일 불러오기
uses: actions/checkout@v4
- name: JDK 17 버전 설치
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: application.yml 파일 만들기
run: echo "${{ secrets.APPLICATION_PROPERTEIS }}" > src/main/resources/application.yml
- name: 테스트 및 빌드하기
run: ./gradlew clean build
- name: 빌드된 파일 이름 변경하기
run: mv ./build/libs/*SNAPSHOT.jar ./project.jar
- name: SCP로 EC2에 빌드된 파일 전송하기
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: project.jar
target: /home/ubuntu/test-server/tobe
변경사항을 GitHub 리포지토리에 push한 후, GitHub Actions와 EC2에서 테스트, 빌드, 자동 배포가 잘 진행되었는지 확인합니다.
테스트, 빌드, 자동 배포가 잘 이루어졌음을 확인할 수 있습니다.


