프로젝트를 관리하다 보면 유지보수 과정에서 배포를 자동화하고 싶다는 생각을 한 번씩 하곤 했었습니다.
그러다가 마주하게된 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 |