Profile picture

[Github Actions] 일반 프로젝트에서 많이 쓰이는 CI/CD 구축 방법

JaehyoJJAng2023년 06월 02일

▶ 개요

이번 포스팅에서는 일반 프로젝트에서 많이 쓰이는 CI/CD 구축에 대해 학습해보겠다.

예정되어 있는 포스팅은 다음과 같다.

위 3단계로 거쳐 각각 상황에 맞는 CI/CD 구축 방법에 대해서 이해해보자.


▶ 전체적인 흐름

image


▸ 장점

  • 빌드 작업을 Github Actions에서 하기 때문에 운영하고 있는 서버의 성능에 영향을 주지 않음.
  • github actions만 사용하기 때문에 인프라 구조가 비교적 간단.

▸ 단점

  • 무중단 배포를 구현하거나 여러 EC2 인스턴스에 배포를 해야 하는 상황이라면, 직접 Github Actions에 스크립트를 작성하여 구현해야 함.

▸ 이 방법이 쓰이는 이유

  • 현업에서 초기 서비스 구축 시 이 방법을 활용
    • 처음 서비스 구현 시 대규모 서비스에 적합한 구조로 구현하지 않음. 즉, 오버 엔지니어링을 염두하지 않는다는 것.
    • 확장의 필요성이 있다고 느끼는 시점에 인프라를 고도화하기 시작함.
    • 복잡한 인프라 구조를 운영한다는 것은, 곧 관리해야 할 포인트가 많아진다는 뜻.
      • 인프라 구조 변경 시 시간이 많이 소요됨.
      • 에러 발생 시 트러블 슈팅 어려움.
      • 합류한 팀원이 인프라 구조를 이해하기 어려움.
      • 기능 추가/수정 시 생각보다 많은 시간이 소요됨.
      • 금전적인 비용이 더 많이 발생.

▶ 일반적인 프로젝트에서의 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

Loading script...