Spring 배포 실습

1. clone & pull 진행

1-1. 자바 8과 git 설치

sudo apt-get install openjdk-8-jdk
sudo apt-get install git

1-2. 로컬에서 깃허브로 푸쉬 spring project

image-20190420183240477

1-3. 서버에서 github ssh 주소로 git clone 진행

Git 초기설정은 시작하기 - Git 최초 설정 사이트를 참조

image-20190420183739897

1-4. 테스트수행

./gradlew test

에러발생

image-20190420183930853

현재 빌드 툴로 메이븐을 사용했기때문에

./mvnw test

를 사용해아한다.

접근권한 문제로 다시 에러가난다.

sudo ./mvnw test

성공!

image-20190420193109575

설명중에 현재 서버에 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

아래와 같은 스크립트를 작성한다.

image-20190420200547533

jojoldu님의 블로그에 복사가능한 코드와 각 코드에 대한 상세 설명이 있습니다.

실행 권한 부여**

chmod 755 ./deploy.sh

로컬에서 버전 변경후 푸쉬

image-20190420220710225

다시 서버로 돌아가서 스크립트 실행

sudo ./deploy.sh
또는
권한 받은 계정으로 ./deploy.sh

에러 사항

  • : 유저 권한문제 –> su 명령어로 임시로 권한얻어 사용

  • : **./mavenw –> ./mvnw

  • : cp 명령어 누락 수정

  • : Maven 은 생명주기에 build가 존재하지 않는다. 대신 clean package 사용image-20190420201839247

      ./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/

이렇게 변경하면 된다.

  • : 쉘 스크립트의 변수선언이 제대로 동작하지 않음

image-20190420225014579

위와같이 쉘스크립트의 변수가 커맨드로 인식되어, command not found에러가 발생한다.

```bash
CURRENT_PID = $(pgrep -f springboot-webservice)
->
CURRENT_PID=$(pgrep -f springboot-webservice)
```

이렇게 공백 없을 없애햐 한다. 참고

  • : 생성된 jar파일의 이름이 스크립트 변수에 지정한 JAR_NAME과 일치하지 않음

image-20190420231008415

로컬 프로젝트의 pom.xml의 name 태그 = demo

image-20190420230856820

서버에서 생성된 빌드되어 생성된 jar파일의 이름 = demo

하지만 쉘 스크립트 변수 JAR_NAME에는 다른 이름(폴더명)이 들어가 있었다.

image-20190420231047310

로컬 프로젝트에서
<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

image-20190420232131612

스크립트가 정상 동작하였고, nohup.out 파일을 열었을때 정상 실행했음을 알 수 있다.

ps -ef|grep DailyNotificationServer

image-20190420232235152

프로세스 또한 실행되고 있음을 확인 할 수 있다.

3. 외부에서 접속

image-20190420232521402

현재 8080포트로 웹서버가 동작하고 있다.

image-20190420232556309

정상적으로 웹으로 접속 가능하다.