[Spring/Project] Github, 쉘스크립트를 이용한 배포 실습
by
Spring 배포 실습
-
jojoldu 님의 글의 흐름 순서대로 기본 spring의 배포부터 차근차근 적용해 보기로 하였다.
- 배포 환경 : Ubuntu 18.04.2
- 빌드 툴 : maven
1. clone & pull 진행
1-1. 자바 8과 git 설치
sudo apt-get install openjdk-8-jdk
sudo apt-get install git
1-2. 로컬에서 깃허브로 푸쉬 spring project
1-3. 서버에서 github ssh 주소로 git clone 진행
Git 초기설정은 시작하기 - Git 최초 설정 사이트를 참조
1-4. 테스트수행
./gradlew test
에러발생
현재 빌드 툴로 메이븐을 사용했기때문에
./mvnw test
를 사용해아한다.
접근권한 문제로 다시 에러가난다.
sudo ./mvnw test
성공!
설명중에 현재 서버에 Gradle을 설지하지 않아도, 프로젝트 내부의 gradlew덕분에 Gradle Task(ex: test )를 수행할 수 있다고 한다.
gradlew : 해당 프로젝트에 한해서 Gradle을 쓸 수 있도록 지원하는 Wrapper 파일
2. 배포 스크립트 생성
Test, Build, Run진행
배포란?
- 추가된 버전의 프로젝트를 받음
- 빌드 툴 (Gradle / Maven) 을 통해 테스트와 빌드를 진행
- 서버에서 해당 프로젝트를 실행
원래 명령어를 통해 하나하나 실행하던 과정을 쉘 스크립트로 작성해 한번에 위의 순서대로 진행되게 만들어본다.
2-1. deploy 스크립트 생성
서버의 ~/app/git/
에 deploy.sh
파일을 생성
vim ~/app/git/deploy.sh
아래와 같은 스크립트를 작성한다.
jojoldu님의 블로그에 복사가능한 코드와 각 코드에 대한 상세 설명이 있습니다.
실행 권한 부여**
chmod 755 ./deploy.sh
로컬에서 버전 변경후 푸쉬
다시 서버로 돌아가서 스크립트 실행
sudo ./deploy.sh
또는
권한 받은 계정으로 ./deploy.sh
에러 사항
-
: 유저 권한문제 –> su 명령어로 임시로 권한얻어 사용
-
: **./mavenw –> ./mvnw
-
: cp 명령어 누락 수정
-
: Maven 은 생명주기에 build가 존재하지 않는다. 대신 clean package 사용
./mvnw build -> ./mvnw clean package
Introduction to the Build Lifecycle 참조
- : nohup을 열어보니 (>tail -f nohup.out) Error: Invalid or corrupt jarfile /home/pushstone/app/git/ 가 보임.
gradle의 빌드 기본경로와 maven의 기본경로가 다름, maven의 기본경로는 ./target폴더이므로
cp ./build/libs/*.jar $REPOSITORY/
—>
cp ./target/*.jar $REPOSITORY/
이렇게 변경하면 된다.
- : 쉘 스크립트의 변수선언이 제대로 동작하지 않음
위와같이 쉘스크립트의 변수가 커맨드로 인식되어, command not found에러가 발생한다.
```bash
CURRENT_PID = $(pgrep -f springboot-webservice)
->
CURRENT_PID=$(pgrep -f springboot-webservice)
```
이렇게 공백 없을 없애햐 한다. 참고
- : 생성된 jar파일의 이름이 스크립트 변수에 지정한 JAR_NAME과 일치하지 않음
하지만 쉘 스크립트 변수 JAR_NAME에는 다른 이름(폴더명)이 들어가 있었다.
로컬 프로젝트에서
<name>demo</name>
->
<name>DailyNotificationServer</name>
로 변경해준다.
변경된 스크립트
#!/bin/bash
REPOSITORY=/home/pushstone/app/git
cd $REPOSITORY/DailyNotificationServer/
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작 by mvnw package"
./mvnw clean package
echo "> Build 파일 복사"
cp ./target/*.jar $REPOSITORY/
echo "> 현재 구동중인 어플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f DailyNotificationServer)
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 'DailyNotificationServer' | tail -n 1)
echo "> JAR Name : $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME &
실행결과
tail -f ./DailyNotificationServer/nohup.out
스크립트가 정상 동작하였고, nohup.out 파일을 열었을때 정상 실행했음을 알 수 있다.
ps -ef|grep DailyNotificationServer
프로세스 또한 실행되고 있음을 확인 할 수 있다.
3. 외부에서 접속
현재 8080포트로 웹서버가 동작하고 있다.
정상적으로 웹으로 접속 가능하다.
Subscribe via RSS