개인적으로 수행했던 프로젝트를 AWS EC2를 통해 배포하는 것이 목적이다.
1. 인스턴스에 OpenJDK 설치
먼저, EC2 인스턴스에 접속 후 버전 확인 후 JDK 1.8 버전을 설치해준다.
* 나같은 경우에는 Java가 아예 설치되어있지 않아 java -version 명령어에 '-bash: java: command not found' 결과가 출력됐다.
sudo yum install -y java-1.8.0-openjdk-devel.x86_64
2. Git 설치 및 Clone
- Git 설치
sudo yum install git
- Git 버전 확인
git --version
- Git 설치에 성공했다면 프로젝트를 저장할 디렉토리 생성
mkdir app
mkdir app/git
- Git repository의 URL을 복사해와 해당 디렉토리에서 clone 진행(클론하기까지의 과정 생략)
cd ~/app/git // 해당 디렉토리로 이동
git clone [git URL] // git clone
* 내 경우에는 Properties파일 등을 포함해 모든 파일을 업로드한 Private Repository를 클론하고, SSH Key를 발급받아 매번 로그인할 필요 없이 레파지토리를 pull하는 방법을 시도하였다.
* 이후 'ls -al'을 통해 clone이 완전히 이루어진 것을 확인
3. 배포 스크립트 작성
매번 깃의 변경 내용을 Pull해와서 이를 Gradle/Maven을 통해 Build하고, 해당 프로젝트를 실행/재실행하는 과정을 명령어로 작성하기는 어려움이 존재. 때문에 이를 쉘 스크립트로 작성해 스크립트 하나만 실행하면 위의 과정이 동작되도록 함
- 인스턴스의 ~/app/git/에 deploy.sh 파일 생성 (*.sh : 스크립트 파일을 의미하는 확장자)
vim ~/app/git/deploy.sh
- 파일의 내용을 아래와 같이 작성
#!/bin/bash
REPOSITORY=/home/ec2-user/app/git
cd $REPOSITORY/프로젝트 폴더명/
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> Build 파일 복사"
cp ./build/libs/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f 프로젝트 폴더명)
echo "$CURRENT_PID"
if [ -z $CURRENT_PID ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -2 $CURRENT_PID"
kill -2 $CURRENT_PID
sleep 5
fi
echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls $REPOSITORY/ |grep '프로젝트 폴더명' | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME &
위 스크립트 내용은 아래와 같다.
* 쉘에서는 변수 선언시 타입없이 선언 가능하며, $변수명으로 변수 사용 가능
* java -jar 파일경로 및 파일명으로 jar 파일을 실행시킬 수 있지만, 이 경우에 사용자가 터미널 접속을 끊으면 어플리케이션도 종료됨. 이를 대비해 실행자가 터미널을 종료시켜도 어플리케이션이 계속 구동될 수 있도록 nohup 명령어 사용
* tail -n 1 : 여러 jar파일이 생기기 때문에 tail -n로 가장 나중의 jar파일(최신 파일)을 변수에 저장(1을 붙임으로써 가장 나중의 파일 하나만을 저장)
* 스크립트 실행시 bash로 실행시키기 위해서는 bash 파일명.sh가 정석이나, ./파일명.sh로도 가능
[쉘스크립트 실행오류]
1) 퍼미션 오류(-bash : ./gradlew: Permission denied)
: chmod +x [파일명]으로 실행권한을 부여한다.
* chmod : 접근 권한 변경
* +x : 모든 사용자에게 실행 권한 부여
// 쉘 스크립트 파일 권한 조정
~# chmod +x ./deploy.sh
// 프로젝트 폴더로 이동 후 gradlew 파일 권한 조정
cd web_movie
~# chmod +x gradlew
2) 다중 if문 사용시 Syntax Error 발생
if[ -z $CURRENT_PID ]; then 부분에서 에러 발생 : if문 사용시 'if'와 대괄호는 띄워줘야 함
-> if [ -z $CURRENT_PID ]; then
출처
https://one2many.tistory.com/15seongkyun.github.io/others/2019/01/14/shell_scripts/
https://jojoldu.tistory.com/263
'AWS > AWS EC2 배포' 카테고리의 다른 글
Linux Character set 변경 (0) | 2021.04.13 |
---|---|
EC2 인스턴스에 MariaDB 설치 (0) | 2021.04.12 |
iptables 재설치 / 타임존 변경 (0) | 2021.04.12 |
SSH Key를 통해 Git 연동하는 방법 (0) | 2021.04.06 |
EC2 인스턴스 생성 후 배포 중 생긴 이슈(Timed out) (0) | 2021.04.05 |