▶ 개요
이번 포스팅에서는 일반 프로젝트에서 많이 쓰이는 CI/CD 구축에 대해 학습해보겠다.
예정되어 있는 포스팅은 다음과 같다.
- 1. 개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법
- 2. 일반 프로젝트에서 많이 쓰는 CI/CD 구축 방법
- 3. 컨테이너 기반(Docker)의 프로젝트에서 많이 쓰이는 CI/CD 구축 방법
위 3단계로 거쳐 각각 상황에 맞는 CI/CD 구축 방법에 대해서 이해해보자.
▶ 전체적인 흐름
▸ 장점
- 빌드 작업을 Github Actions에서 하기 때문에 운영하고 있는 서버의 성능에 영향을 주지 않음.
github actions
만 사용하기 때문에 인프라 구조가 비교적 간단.
▸ 단점
- 무중단 배포를 구현하거나 여러 EC2 인스턴스에 배포를 해야 하는 상황이라면, 직접 Github Actions에 스크립트를 작성하여 구현해야 함.
▸ 이 방법이 쓰이는 이유
- 현업에서 초기 서비스 구축 시 이 방법을 활용
- 처음 서비스 구현 시 대규모 서비스에 적합한 구조로 구현하지 않음. 즉, 오버 엔지니어링을 염두하지 않는다는 것.
- 확장의 필요성이 있다고 느끼는 시점에 인프라를 고도화하기 시작함.
- 복잡한 인프라 구조를 운영한다는 것은, 곧 관리해야 할 포인트가 많아진다는 뜻.
- 인프라 구조 변경 시 시간이 많이 소요됨.
- 에러 발생 시 트러블 슈팅 어려움.
- 합류한 팀원이 인프라 구조를 이해하기 어려움.
- 기능 추가/수정 시 생각보다 많은 시간이 소요됨.
- 금전적인 비용이 더 많이 발생.
▶ 일반적인 프로젝트에서의 CI/CD
- 이전 실습(개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법)에서 진행했던 내용 참고하여 해당 섹션을 진행.
.github/workflows/deploy.yaml
name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: "1. Github Repository 파일 불러오기"
uses: actions/checkout@v4
- name: "2. JDK 17버전 설치"
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: "3. application.yml 파일 만들기"
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
- name: "4. 테스트 및 빌드하기"
run: ./gradlew clean build
- name: "5. 빌드된 파일 이름 변경하기"
run: mv ./build/libs/*SNAPSHOT.jar ./app.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: app.jar
target: /home/ubuntu/cicd-practice/tobe # 해당 경로로 app.jar 전송
- 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/cicd-practice/current
mkdir /home/ubuntu/cicd-practice/current
mv /home/ubuntu/cicd-practice/tobe/app.jar /home/ubuntu/cicd-practice/current/app.jar
cd /home/ubuntu/cicd-practice/current
sudo fuser -k -n tcp 8080 || true
nohup java -jar app.jar > ./output.log 2>&1 &
rm -rf /home/ubuntu/instagram-server/tobe