GitHub Actions로 CI/CD 구축 #2

artp·2024년 9월 21일

CI/CD

목록 보기
5/9
post-thumbnail

일반적인 프로젝트에서의 CD/CD 구축

GitHub Actions로 CI/CD 구축 #1에서는 개인 프로젝트나 토이 프로젝트에 적합한 방식으로 CI/CD를 구축하는 방법을 소개했습니다.

이번 글에서는 일반적인 프로젝트에서 주로 사용하는 CI/CD 구축 방법에 대해 알아보겠습니다. 이번에 다룰 CI/CD의 전체적인 흐름은 아래와 같습니다.

이전에 다루었던 CI/CD 구축 방법과 이번 방법의 가장 큰 차이점은 빌드를 어디서 진행하느냐입니다. 이전에는 EC2에서 직접 프로젝트를 빌드했다면, 이번에는 GitHub Actions에서 빌드를 진행하고, 빌드 완료 파일을 SCP를 사용해 EC2에 전달하여 배포하는 방식을 다룰 예정입니다.

일반적인 프로젝트에서의 CD/CD 구축 방법의 장단점

일반적인 프로젝트에서의 CI/CD 구축 방법의 장단점은 다음과 같습니다.

장점

  • 빌드 작업을 GitHub Actions에서 처리하므로 운영 중인 서버의 성능에 거의 영향을 주지 않습니다.
  • CI/CD 툴로 GitHub Actions 하나만 사용하기 때문에 인프라 구조가 복잡하지 않고 간단합니다.

단점

  • 무중단 배포를 구현하거나 여러 EC2 인스턴스에 배포해야 하는 경우, GitHub Actions에서 직접 스크립트를 작성해 구현해야 합니다.
  • 구현 난이도가 생각보다 높습니다.

CI/CD 실습

서버 종료 및 기존 프로젝트 폴더 삭제

먼저, 기존에 실행중인 서버를 종료하고 프로젝트 폴더를 삭제합니다.

워크플로 파일 수정

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

1. GitHub Repository 파일 불러오기

- name: GitHub Repository 파일 불러오기
  uses: actions/checkout@v4
  • 깃허브 리포지토리에서 최신 코드를 가져오는 단계입니다.
  • actions/checkout@v4를 사용하여 현재 브랜치의 파일과 코드를 작업 환경으로 불러옵니다.

2. JDK 17 버전 설치

- name: JDK 17 버전 설치
  uses: actions/setup-java@v4
  with:
    distribution: temurin
    java-version: 17
  • 애플리케이션 빌드 및 실행에 필요한 JDK(Java Development Kit)를 설치합니다.
  • actions/setup-java@v4 액션을 사용하며, temurin 배포판의 JDK 17을 설치합니다.

3. application.yml 파일 생성

- 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 경로에 저장합니다.

4. 프로젝트 테스트 및 빌드

- name: 테스트 및 빌드하기
  run: |
    ./gradlew clean build || (cat ./build/reports/tests/test/index.html && exit 1)
  • Gradle 빌드 도구를 사용하여 프로젝트를 테스트하고 빌드합니다.
  • 테스트가 실패하면 결과 리포트를 출력하고 작업을 종료합니다.
  • 성공 시, 빌드 결과물이 build/libs 디렉토리에 생성됩니다.

5. 빌드된 파일 이름 변경

- name: 빌드된 파일 이름 변경하기
  run: mv ./build/libs/*SNAPSHOT.jar ./project.jar
  • 빌드 결과물의 이름을 project.jar로 변경하여 관리하기 쉽도록 간소화합니다.
  • EC2 서버에 배포하기 전에 파일 이름을 표준화하는 과정입니다.

6. SCP로 EC2에 빌드된 파일 전송

- 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 서버로 전송합니다.
  • GitHub Secrets에 저장된 EC2 서버의 호스트 주소, 사용자 이름, SSH 키를 활용합니다.
  • 파일은 /home/ubuntu/instagram-server/tobe 경로에 업로드됩니다.

7. SSH로 EC2에서 배포 스크립트 실행

- 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
  • EC2 서버에 SSH를 통해 접속하여 애플리케이션 배포 스크립트를 실행합니다.
  • 실행되는 주요 작업:
    1. 포트 8080에서 실행 중인 애플리케이션 종료: sudo fuser -k -n tcp 8080
    2. 새로운 배포를 위한 디렉토리 준비: 기존 디렉토리 삭제 후 재구성.
    3. 애플리케이션 실행: nohup 명령어를 사용하여 애플리케이션을 백그라운드에서 실행.
    4. 임시 파일 정리: tobe 디렉토리를 삭제하여 정리.

- name: GitHub Repository 파일 불러오기
    uses: actions/checkout@v4
  • 깃허브 액션에서 작업하기 위해 깃허브 리포지토리에서 파일을 가져오는 것으로, 리포지토리의 코드를 불러오는 라이브러리를 사용합니다.
- name: JDK 17 버전 설치 
  uses: actions/setup-java@v4 
  with: 
    distribution: temurin 
    java-version: 17
  • 깃허브 액션 환경에서 빌드 및 테스트를 위해 jdk-17 버전을 설치하는 것으로, jdk를 쉽게 다운로드할 수 있도록 해주는 라이브러리를 사용합니다.
- name: application.yml 파일 만들기
  run: echo "${{ secrets.APPLICATION_PROPERTEIS }}" > src/main/resources/application.yml
  • gitignore 설정에 의해 깃허브 리포지토리에 application.yml 파일이 추가되지 않으므로 깃허브 액션에서 application.yml 파일을 생성합니다.
- name: 테스트 및 빌드하기
  run: ./gradlew clean build
  • 깃허브 액션에서 프로젝트 테스트와 빌드를 진행합니다.
- name: 빌드된 파일 이름 변경하기
  run: mv ./build/libs/*SNAPSHOT.jar ./project.jar
  • 깃허브 액션에서 빌드된 파일 이름을 EC2에서 사용하기 쉽도록 간소화합니다.
- 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 Actions에서 빌드된 파일을 SCP(Secure Copy Protocol) 방식으로 EC2에 전송합니다.
  • SCP는 SSH(Secure Shell)를 기반으로 동작하는 파일 복사 프로토콜로, 네트워크를 통해 안전하게 파일을 전송할 수 있습니다. 따라서 설정의 일부는 SSH와 유사하게 작성됩니다.

결과 확인

변경사항을 GitHub 리포지토리에 push한 후, GitHub Actions와 EC2에서 테스트, 빌드, 자동 배포가 잘 진행되었는지 확인합니다.
테스트, 빌드, 자동 배포가 잘 이루어졌음을 확인할 수 있습니다.

profile
donggyun_ee

0개의 댓글