Project

[SpringBoot + Gradle] JAR, Bitbucket, Jenkins 원격 배포 환경 구축

seowooJeong 2021. 11. 11. 15:13

기본 환경

  1. 프로젝트 서버 구성 완료(AWS instance 설정 Route53 도메인&호스팅 + JAVA 11)
  2. 젠킨스 서버 구성 완료(JAVA 11, Jenkins 설치 기본 설정 완료)
  3. Bitbucket Repository 구성 SourceTree 연동 완료

 

 

Jenkins 접속 Jenkins 관리 > 플러그인 관리에서 해당 플러그인 설치

 

ㆍJenkins 관리 > Global Tool Configuration에서 본인 프로젝트에 맞는 항목의 버전 설정

 

 

ㆍ새로운 Item 에서 item name 입력 후 Freestyle project 선택 > OK

 

 

ㆍssh-keygen -t rsa -b 4096 -m PEM 를명령어를 이용해 RSA 형태의 SSH Key를 생성한다.

   - id_rsa는 private_key , id_rsa.pub는 public key이다.

 

ㆍBitbucket에서 Repository > Access Key > Add key를 눌러 위에서 생성한 public key를 넣어준다.

 

ㆍ 프로젝트 서버(target server)의 ~/.ssh/authorized_keys 파일에도 public key를 넣어준다.

 

ㆍJeonkins 관리 > 시스템 설정에서 Publish over SSH 항목을 찾아 Path to key 혹은 Key에 값을 입력해준다.

  (해당 항목이 없다면 관련 플러그인 설치)

 

ㆍ SSH Servers 항목에는 원격지의 정보를 입력해준다.

 - Name : 식별할 수 있는 이름 설정

 - Hostname : 원격지의 IP

 - Username : 원격지의 접속 계정명

 - Remote Directory : 원격 시작 디렉토리 절대경로

 

※ OPENSSL로 시작하는 SSH 키를 생성할 경우 아래와 같은 오류가 발생한다.

  - Access Denied 관련 오류는 .ssh는 700 key 파일들은 600 권한이 맞는지 확인한다.

 

 

ㆍ 기존에 새로운 Item으로 만들어놓은 아이템에서 구성을 클릭하고 소스 코드 관리에서 Bitbucket Repository Clone SSH를 통해 url을 가져온다.

 

 

ㆍ Credentials의 Add > Jenkins를 눌러 Kind는 아래와 같이 username은 자유롭게 설정하고 private key 를 기존에 Jenkins서버에서 생성했던 해당 키를 넣어준다.

※ Username은 접속하는 원격지의 계정명과 동일해야 ssh-site를 쓸 수 있다 (추측)

ㆍ 환경설정 > SSH sites 설정

 

어느 Branch에서 받을 것인지 경로를 설정한다. default는 */master
BItbucket을 사용하므로 bitbucketweb을 선택하고 URL을 입력한다.

 

ㆍSSH로 원격 shell script를 실행하기 위해서는 아래의 플러그인을 받아야한다 (재시작 필수)

 

 

ㆍ 프로젝트 > 구성 > 빌드유발에서 Build when a change is pushed to BitBucket 체크

 

ㆍ빌드 환경에서 Send files or execute commands over SSH after the builld runs 체크 후 데이터 입력

 - Source files : Jenkins 설치 시 기본 경로는 ubuntu 기준 /var/libs/jenkins/workspace/설정한 SSH ServerName/설정한 프로젝트 Name/ 이다.

 - Remove prefix : 원격지의 remote 경로가 동일하지 않다면 prefix경로를 지우고 jar파일명만 남긴다.

 - Remote directory : 기본 경로는 원격지에 접속하는 계정의 홈 디렉토리 (ex) /home/ubuntu )

 

ㆍ 구성 > Build > Add build step 에서 Invoke Gradle script를 추가한 후 아래처럼 추가한다.

 - ${workspace} 는 젠킨스 기본 workspace 경로이다.

 

ㆍ 빌드 후 조치에서 Send build artifacts over SSH를 추가한 후 원격지의 스크립트를 실행시킨다.

ㆍ 빌드 스크립트 예시

#!/bin/sh
SERVICE_NAME=dev-admin
PATH_TO_JAR=./wmc-0.0.1-SNAPSHOT.jar
PID_PATH_NAME=./dev-admin.pid
JAVA_OPT="--spring.profiles.active=dev"
case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            sudo nohup java -jar $PATH_TO_JAR $JAVA_OPT 2>> /dev/null >> /dev/null &

            echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            sudo kill $PID;
            echo "$SERVICE_NAME stopped ..."
            sudo rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ...";
            sudo kill $PID;
            echo "$SERVICE_NAME stopped ...";
            sudo rm $PID_PATH_NAME
            echo "$SERVICE_NAME starting ..."
            sudo nohup java -jar $PATH_TO_JAR $JAVA_OPT 2>> /dev/null >> /dev/null &

            echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
esac