반응형
Greensky0026
삽질러의 대환장 공사판
Greensky0026
전체 방문자
오늘
어제
  • 분류 전체보기 (241)
    • Language (56)
      • JAVA (13)
      • Swift (38)
      • Kotlin (4)
      • Dart (0)
      • PHP (0)
      • JavaScript (1)
    • IDE & Framework (92)
      • Spring (10)
      • Android (48)
      • iOS (8)
      • NodeJS (1)
      • CodeIgniter (3)
      • Flutter (1)
      • 분류중 (18)
    • Infra (8)
    • Database (12)
    • VCS (4)
    • Debug Log (34)
      • java (7)
      • swift (3)
      • Android (9)
      • Web (7)
      • 삽질기 (7)
    • Others (19)
      • 코딩테스트 풀이 (0)
      • IT 이야기 (18)
    • 쉼터 (2)
    • 개발공부 (14)
      • Network (1)
      • 자료구조와 알고리즘 (2)
      • Code design (8)
      • ETC (1)
      • 아카이브 (1)

블로그 메뉴

    공지사항

    • 프로그래머스 코딩 테스트 관련글 비공개 처리

    인기 글

    태그

    • IT
    • swfit
    • ios
    • Android
    • 프로그래머스
    • xcode
    • 공부
    • 개발
    • 코딩테스트
    • 구축
    • level1
    • map
    • JSP
    • 프로그래밍
    • 예제
    • kotlin
    • 타입
    • Java
    • swift
    • reduce

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    Spring boot 서버를 쉘스크립트 배포하기
    Infra

    Spring boot 서버를 쉘스크립트 배포하기

    2023. 6. 5. 18:13
    반응형

    0. 개요

    지난번 글에선 서버에서 직접 커맨드 명령어를 사용해 spring boot 서버를 빌드/배포했었습니다.

    이번에는 스크립트를 실행하는 한번의 명령어로 spring boot 서버를 빌드/배포 할 수 있도록, 쉘 스크립트를 짜보면서 남긴 기록입니다.

     

    1. 쉘 스크립트란?

    저번에는 서버에서 여러 줄의 Unix 커맨드를 통해 spring boot 서버를 빌드하고 배포했었습니다.

    git에서 소스를 끌어 오고, gradlew로 빌드 하고, 만약 서버가 실행중이라면 배포를 위해 종료하고, nohup 명령어로 백그라운드에서 실행시키고...

    배포할때마다 매번 반복해서 입력해야 하는 명렁어들을 하나의 파일로 작성해,

    나란히 실행시킬 수 있도록 하는 것이 바로 쉘 스크립트 입니다.

     

    2. 작성하기

    작성하면서 생각한 포인트는 아래와 같습니다.

    1. 중간중간 echo로 빌드 상황 comment
    2. 혹시모를 권한문제 회피를 위해 권한부여
    3. 백그라운드에서 실행중인 동일 프로젝트 존재할때만 process kill 할 수 있도록 분기처리
    4. nohup log를 일별로 분리하기 위해서 배포 전 백업
    echo "> 애플리케이션 배포작업 시작"
    
    PROJECT_REPOSITORY=~/URLumberjack
    JAR_FILE_NAME=demo-0.0.1-SNAPSHOT.jar
    
    chmod -R 775 $PROJECT_REPOSITORY
    
    # git pull이 정상적으로 진행되는지 확인하기 위해 reset
    
    git pull origin main
    
    echo "> git pull"
    
    git pull
    
    echo "> gradle build"
    
    chmod -R 775 $PROJECT_REPOSITORY
    
    ./gradlew build 
    
    echo "> 구동중 PID 확인"
    
    CURRENT_PID=$(pgrep -f $JAR_FILE_NAME)
    
    echo " 현재 구동중인 애플리케이션 PID: $CURRENT_PID"
    
    if [ -z "$CURRENT_PID" ]; then
            echo "> 현재구동중인 애플리케이션이 없으므로 종료하지 않습니다."
    else
            echo "> kill -9 $CURRENT_PID"
        kill -9 $CURRENT_PID
        sleep 10
    fi
    
    CUR_DTTM=$(date +%Y%m%d%H%M%S)
    
    echo "nohup 백업 : nohup-${CUR_DTTM}.out"
    
    mv $PROJECT_REPOSITORY/build/libs/nohup.out $PROJECT_REPOSITORY/nohup/nohup-${CUR_DTTM}.out
    
    echo "> 새 애플리케이션 배포"
    
    nohup java -jar $PROJECT_REPOSITORY/build/libs/$JAR_FILE_NAME 2>&1 &
    
    echo "> 새 애플리케이션 배포작업 종료"

     

    * 참고 if문과 -z 옵션

    스크립트에서 if문은 다음과 같이 사용합니다.

    if [ 옵선, 값1 또는 조건식 ]; then
       수행문
    else
       위 조건과 불일치시 수행할 조건문
    fi

    저는 아래와 같이 사용했 습니다.

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

    "$CURRENT_PID" 변수의 길이가 0인지, 즉 할당된 값이 없는지 확인합니다.

    0이면 if 문이 true이고 스크립트는 실행 중인 응용 프로그램이 없다는 메시지를 인쇄합니다.

    0이 아닌 경우(할당된 값이 있음을 의미) if 문은 false이고 스크립트는 명령을 실행하여 실행 중인 프로세스를 종료합니다.

     

    [ -z ] : 문자열의 길이가 0이면 참
    [ -n ] : 문자열의 길이가 0이 아니면 참
    
    [ -eq ] : 값이 같으면 참
    [ -ne ] : 값이 다르면 참
    
    [ -gt ] :  값1 > 값2
    [ -ge ] : 값1  >= 값2
    [ -lt ] : 값1 < 값2
    [ -le ] : 값1 <= 값2
    
    [ -a ] : &&연산과 동일 and 연산
    [ -o ] : ||연산과 동일 xor 연산
    
    [ -e ] : 파일이 있으면 참
    [ -s ] : 파일의 크기가 0 보다 크면 참
    
    [ -L ] : 파일이 심볼릭 링크면 참
    [ -d ] : 파일이 디렉토리면 참
    
    [ -r ] : 파일이 읽기 가능하면 참
    [ -w ] : 파일이 쓰기 가능하면 참
    [ -x ] : 파일이 실행 가능하면 참
    
    [ 파일1 -nt 파일2 ]  : 파일1이 파일2보다 최신파일이면 참
    [ 파일1 -ot 파일2 ]  : 파일1이 파일2보다 이전파일이면 참
    [ 파일1 -ef 파일2 ] : 파일1이 파일2랑 같은 파일이면 참
    반응형
    저작자표시 비영리

    'Infra' 카테고리의 다른 글

    [단축 URL 프로젝트 URLumberjack] - NCP DB서버 구축(MySQL 설치 및 설정)  (0) 2023.04.30
    [단축 URL 프로젝트 URLumberjack] NCP Application서버 구축(JAVA, Gradle, Docker 설치)  (0) 2023.04.30
    [NCP] Naver Cloud Platform VPN 발급 및 접속방법  (0) 2023.04.30
    [단축 URL 프로젝트 URLumberjack] NCP 인스턴스 생성  (0) 2023.04.30
    [단축 URL 프로젝트 URLumberjack] - NCP 스펙 정의  (0) 2023.04.30
      'Infra' 카테고리의 다른 글
      • [단축 URL 프로젝트 URLumberjack] - NCP DB서버 구축(MySQL 설치 및 설정)
      • [단축 URL 프로젝트 URLumberjack] NCP Application서버 구축(JAVA, Gradle, Docker 설치)
      • [NCP] Naver Cloud Platform VPN 발급 및 접속방법
      • [단축 URL 프로젝트 URLumberjack] NCP 인스턴스 생성
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바