[CI/CD 실습(1)] Github Actions와 AWS EC2를 활용하여 CI/CD 파이프라인 구축하기
이전 시간에 Github Actions와 AWS EC2를 사용하여 CI/CD 파이프라인을 구축하여 배포 자동화 프로세스를 직접 구현했다. 이 부분에서는 한 가지 단점이 존재하는데 아래 흐름도를 보면 단점을 알 수 있다.
리포지토리의 코드가 푸시된 후, GitHub Actions에 의해 자동으로 CI(Continuous Integration) 작업이 수행된다. 기존에는 빌드 작업이 AWS EC2 인스턴스 내부에서 이루어졌으나, 이번에는 빌드 작업을 GitHub Actions 내에서 직접 수행하도록 변경할 예정이다.
빌드 작업의 성능은 개발 생산성과 직결되는 중요한 요소이다. 빌드를 완료하는 데 걸리는 시간이 길어질수록 개발 흐름이 방해받을 가능성이 커진다. 특히 빌드 작업은 하루에도 여러 번 실행되기 때문에, 짧은 대기 시간도 누적될 경우 전체 개발 속도에 부정적인 영향을 미칠 수 있다.
이러한 문제는 CI에도 동일하게 적용된다. 빌드 시간이 짧을수록 새로운 문제에 더 빠르게 대응할 수 있어, 전체적인 개발 프로세스의 효율성이 높아진다. 따라서 이번 변경에서는 기존의 EC2 인스턴스에서 빌드 작업을 수행하는 대신, GitHub Actions를 통해 CI 작업이 이루어지도록 하여 빌드 성능을 최적화하고자 한다.
name: Github Actions & AWS EC2를 사용하여 CI/CD 직접 구축하는 실습
on:
push:
branches:
- main
jobs:
Deploy:
runs-on: ubuntu-latest
# EC2_HOST : Public IPs
# EC2_USERNAME : ubuntu
# EC2_PRIVATE_KEY : 키 페어
# EC2 인스턴스에 접속해서 개발자가 직접 수행해야했던 내용들을 이 steps에 기록
# 경로 이동 - cd /home/ubuntu/GithubActions_EC2_PipeLine/
# 코드 최신화 - git pull origin main
# 코드 실행 권한 변경 - chmod +x ./gradlew build
# 빌드 파일 만들기 - ./gradlew clean build
# 스프링 부트 8080 서버 돌아가는 경우 끄기 - sudo fuser -k -n tcp 8080 || true
# 경로 이동 - cd build/libs
# 백그라운드로 실행 & 로그 기록을 리눅스 표준 출력으로 기록 - nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
# 추가 : application.yml을 CI/CD로 관리
steps:
- 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_PROPERTIES }}" > ./src/main/resources/application.yml
- name: 테스트 및 빌드하기
run: |
chmod +x ./gradlew # build Permission
./gradlew clean build # build 작업
- name: 빌드된 파일 이름을 일관성있게 변경하기
run: mv ./build/libs/*SNAPSHOT.jar ./project.jar
# https://github.com/appleboy/scp-action
- 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/practice/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: |
rm -rf /home/ubuntu/practice/current # 이전에 남아있는 파일을 깔끔히 제거하기 위해
mkdir /home/ubuntu/practice/current
mv /home/ubuntu/practice/tobe/project.jar /home/ubuntu/practice/current/project.jar
cd /home/ubuntu/practice/current
sudo fuser -k -n tcp 8080 || true
nohup java -jar project.jar > ./output.log 2>&1 &
rm -rf /home/ubuntu/practice/tobe # 이전에 남아있는 파일을 깔끔히 제거하기 위해