Github Actions로 배포 자동화

2024. 8. 12. 05:30·Daily
반응형

프로젝트를 관리하다 보면 유지보수 과정에서 배포를 자동화하고 싶다는 생각을 한 번씩 하곤 했었습니다.

 

그러다가 마주하게된 Github에서 제공하는 Actions기능을 활용하면 버전관리를 자동화시킬 수 있다는 소식을 접했고,

 

오늘은 이를 활용한 자동 배포에 대해서 다뤄보려고 합니다.

 

정확히 다뤄볼 내용은, 백엔드 프로젝트를 배포하는 파이프라인에서 마지막에 백엔드 서버를 실행하고, 만약 서버가 실행 중이면 재부팅할 수 있게 프로그램을 짜볼 예정입니다!!

 

저는 AWS EC2에 배포를 하겠습니다!


준비 환경

일단 배포하기에 앞서, 간단한 Spring Boot 프로젝트와, EC2를 준비해 주시면 감사하겠습니다!!

EC2를 생성한 후, SSH 접속까지 한 상태로 진행해주시면 됩니다.

Spring Boot 프로젝트 jar파일 추출 및 EC2로 옮기기

 

jar파일 추출은 IntelliJ 기준, 우측 Gradle탭에서 bootJar파일을 더블클릭하면 추출할 수 있습니다.

 

추출한 jar파일은 아래 사진과 같이 lib 폴더 안에 생성되게 됩니다!!

 

이렇게 추출한 파일을 EC2로 옮겨주시고, 실행하면 프로젝트가 실행되는 걸 확인할 수 있습니다.

// jar파일 EC2로 옮기는 코드
scp -i {keypemFileName}.pem day01-0.0.1-SNAPSHOT.jar ubuntu@{퍼블릭 IPv4 DNS}:/home/ubuntu

 

// jar파일로 프로젝트 실행
java -jar {jar파일 이름}

 

결과 확인

 


Github Action 설정하기

1. 원하는 프로젝트 Repository -> Actions -> set up a workflow yourself 들어가기

 

2. 아래 코드 작성 후 커밋

name: devops test

on:
  push:
    branches: [ main ]
    
jobs:
  deploy:
    name: Deploy to EC2
    runs-on: ubuntu-latest

    steps:
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        distribution: 'temurin'
        java-version: '17'

    - name: Checkout sources
      uses: actions/checkout@v4

    - name: Setup Gradle
      uses: gradle/actions/setup-gradle@v3

    - name: Build with Gradle
      run: |
        chmod +x ./gradlew
        ./gradlew build

    - name: copy file via ssh
      uses: appleboy/scp-action@v0.1.7
      with:
        host: ${{ secrets.REMOTE_HOST }}
        username: ${{ secrets.REMOTE_USER }}
        key: ${{ secrets.SSH_KEY }}
        port: ${{ secrets.REMOTE_PORT }}
        source: "build/libs/day01-0.0.1-SNAPSHOT.jar" -> 추출하면 생기는 jar파일 경로까지 포함해서 적기
        target: "spring"

    - name: restart spring project
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.REMOTE_HOST }}
        username: ${{ secrets.REMOTE_USER }}
        key: ${{ secrets.SSH_KEY }}
        port: ${{ secrets.REMOTE_PORT }}
        script: |
          rm -rf /home/ubuntu/{Repository이름 적기}
          git clone {클론하려는 프로젝트 url}
          bash /home/ubuntu/{Repository이름}/deployment.sh

 

 

3. Repository -> settings -> secrets and variables에서 위 코드에서 사용된 secrets값 설정해 주기

 

secrets 값은 Repository secrests 값으로 생성해 주면 된다.

Environment secrets가 아니니 유의하자!!

 

secrets.REMOTE_HOST : EC2 public ip

secrets.REMOTE_USER : ubuntu

secrets.SSH_KEY : keypem파일 내용(저는 맥 사용자라 keypem파일값을 putty로 변환할 필요 없이 바로 사용)

secrets.REMOTE_PORT : 22

 

4. deployment.sh 쉘스크립트 작성

Spring Boot 프로젝트 최상단에 deployment.sh 파일을 생성합니다.

 

그리고 안에 아래 코드 내용을 작성합니다.

#!/bin/bash


spring_pid=`ps -ef | grep demo | grep -v grep | awk -F " " '{print $2}'`

if [ $spring_pid ]
then
        echo "실행중인 백엔드 프로세스 종료하는 중..."
        kill -9 $spring_pid
else
        echo "실행중인 백엔드 프로세스가 없습니다!"
fi

echo "스프링 프로젝트 실행 중..."
nohup java -jar /home/ubuntu/spring/build/libs/{추출한 jar파일} > /dev/null 2>&1 &

 

5. 결과확인

 

다시 Github Actions로 돌아가서, workflows를 재시작해주면 성공이다!!

 


 

이처럼 간단한 시나리오를 바탕으로 진행한 배포 자동화 과정이었지만,,, 생각보다 많이 복잡하고 어려운 과정이었다;;;;

 

간단한 쉘로 이루어진 자동화의 성공은 곧 더 복잡한 자동화까지 가능하다는 점을 의미하기 때문에....!!

 

다음에는 더 큰 규모의 시나리오를 바탕으로 자동화를 진행해 봐야겠다!

반응형

'Daily' 카테고리의 다른 글

VMware Ubuntu가상환경 Jenkins 설치  (3) 2024.09.02
git pull error  (0) 2024.08.25
Mac M1 VMware + Ubuntu 설치  (0) 2024.08.14
VMware 포트포워딩 - 외부접속(2)  (0) 2024.08.05
VMware 포트포워딩 - 외부접속(1)  (0) 2024.07.15
'Daily' 카테고리의 다른 글
  • git pull error
  • Mac M1 VMware + Ubuntu 설치
  • VMware 포트포워딩 - 외부접속(2)
  • VMware 포트포워딩 - 외부접속(1)
Hyunily
Hyunily
    반응형
  • Hyunily
    Hyunily
    Hyunily
  • 전체
    오늘
    어제
    • 분류 전체보기 (45)
      • Daily (16)
      • 한화시스템 Beyond (6)
      • CS (3)
      • Database (10)
      • Monitoring (2)
      • Spring (8)
  • 블로그 메뉴

    • 홈
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Hyunily
Github Actions로 배포 자동화
상단으로

티스토리툴바