EC2 서버에 프로젝트 배포하기(feat. Git) 2

EC2 서버에 프로젝트 배포하기(feat. Git) 2

EC2 서버에 배포 스크립트를 작성해보자.


2. 배포 스크립트 만들기

우리가 하는 프로젝트 빌드는 다음 과정의 의미를 가진다.

  • git clone 혹은 git pull 을 통해 새 버전의 프로젝트를 받음
  • Gradle 이나 Maven 을 통해 프로젝트 테스트, 빌드
  • EC2 서버에서 해당 프로젝트 실행 및 재실행

이번 글에서는 배포할 때마다 하나하나 명령어를 실행하는 것이 아닌, 쉘 스크립트를 작성하여 해당 스크립트만 실행하면 한 번에 앞의 과정이 모두 실행되도록 할 것이다.

참고로 쉘 스크립트는 .sh 확장자를 가지며, Node JS.js 라는 파일을 통해 서버에서 작동하는 것처럼 쉘 스크립트 역시 리눅스에서 기본적으로 사용할 수 있는 스크립트 파일의 한 종류이다.

문서 편집기로는 가장 대중적으로 쓰이는 빔(vim) 을 사용하도록 한다.

먼저 ~/app/step1/deploy.sh 파일을 생성해보자.

$ vim ~/app/step1/deploy.sh

혹시 vim을 처음 사용해본다면, 인터넷에서 vim 사용법에 대해서 검색해보거나, 내 블로그에 있는 편집기 사용법을 참고하자(추가 예정).

작성할 내용은 다음과 같다.

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=[프로젝트 명]

cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"

git pull

echo "> 프로젝트Build 시작"

./gradlew build

echo "> step1 디렉토리로 이동"

cd $REPOSITORY

echo "> Build 파일 복사"

cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

echo "현재 구동 중인 애플리케이션pid: $CURRENT_PID"

if [ -z "$CURRENT_PID" ]; then
    echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -15 $CURRENT_PID"
    kill -15 $CURRENT_PID
    sleep 5
fi
echo "> 새 애플리케이션 배포"

JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &

다 작성했으면 :wq 를 입력하여 저장 후 나가도록 하자.

  • 주의사항 : 자기가 Amazon Linux 운영체제를 사용중이 아니라면, REPOSITORY 변수 값을 지정할 때 ec2-user 대신에 자신이 사용중인 운영체제의 사용자명을 입력하도록 하자. 해당 사용자명은 아래 글에서 확인할 수 있다.

주요 부분의 의미만 설명하자면, if ~ else 부분은 현재 구동중인 어플리케이션을 종료하는 역할을 한다.

JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)

위 부분은 새로 실행할 jar 파일을 찾는 명령어로, 여러 jar 파일이 생길 것이기 때문에 tail -n 으로 가장 나중의 jar 파일(최신 파일)을 찾아서 변수에 저장한다.

nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &

위 부분은 찾은 jar 파일을 nohup 으로 실행하는 명령어이다.
스프링 부트는 외장 톰캣을 설치할 필요 없이 해당 명령어로 바로 jar 파일을 실행할 수 있다.
일반적으로 자바를 실행할 때는 java -jar 라는 명령어를 사용하지만, 이렇게 하면 사용자가 터미널 접속을 끊을 때 애플리케이션도 같이 종료된다.
따라서 터미널을 종료해도 어플리케이션은 계속 구동될 수 있도록, nohup 명령어를 사용했다.

현재 위치가 해당 파일이 있는 디렉토리가 아니라면 아래 명령어로 이동하자.

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

해당 부분의 바깥 괄호가 원래 중괄호였는데, 안된다는 이슈가 있어서 소괄호로 바꿨다.
그런데 나는 중괄호로 해도 잘 돌아간다 … 뭐가 문제인지 모르겠다.

$ cd ~/app/step1/

이제 생성한 스크립트에 실행 권한을 추가하자.

$ chmod +x ./deploy.sh

이제 이 스크립트를 다음의 명령어로 실행해보자.

$ ./deploy.sh

BUILD SUCCESSFUL 이 출력되며 성공적으로 실행되었을 경우, nohup.out 파일이 생성되며 해당 파일은 실행되는 애플리케이션에서 출력되는 모든 내용을 담고 있다.
다음 명령어로 내부를 보자.

$ vim nohup.out

요약


여기까지 배포 스크립트의 초안을 작성해보았다.

쭈우우욱 내려서 보았을 때 오류가 발생했다는 것이 보이게 되는데, 해당 오류의 원인은 다음 글에서 해결하도록 하겠다.
오류가 나지 않는다면, 그냥 넘어가도 된다.


© 2022. All rights reserved.