[CI/CD 실습(2)] Github Actions와 AWS EC2를 활용하여 CI/CD 파이프라인 구축하기

Turtle·2024년 8월 13일
0

[인프라] CI/CD

목록 보기
5/5
post-thumbnail

👉전체적인 흐름

[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 작업이 이루어지도록 하여 빌드 성능을 최적화하고자 한다.

👉개선된 흐름


👍장점

  • 빌드 작업을 AWS EC2 인스턴스 내부가 아닌 Github Actions로 하기 때문에 운영하고 있는 서버 성능에 영향을 거의 주지 않는다.
  • CI/CD 툴로 Github Actions만 사용하기 때문에 인프라 구조가 복잡하지 않고 간단하다.

👎단점

  • 무중단 배포를 구현하거나 여러 EC2 인스턴스에 배포를 해야 하는 상황이라면 직접 Github Actions에 스크립트를 작성해서 구현해야 한다.
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     # 이전에 남아있는 파일을 깔끔히 제거하기 위해

0개의 댓글