[SpringBoot + Gradle] JAR, Bitbucket, Jenkins 원격 배포 환경 구축
기본 환경
- 프로젝트 서버 구성 완료(AWS instance 설정 및 Route53 도메인&호스팅 + JAVA 11)
- 젠킨스 서버 구성 완료(JAVA 11, Jenkins 설치 및 기본 설정 완료)
- 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서버에서 생성했던 해당 키를 넣어준다.
ㆍ 환경설정 > SSH sites 설정
ㆍ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