[CICD] AWS EC2 Jenkins 프로젝트 War 배포

2020. 12. 11. 14:50CICD

1. Gradle로 War 파일 배포

1) Jenkins 설정

Jenkins의 프로젝트 구성에서 Build의 항목을 수정해준다. Invoke Gradle은 서버 내부에 설치된 Gradle을 실행하는 것이면, Use Gradle Wrapper는 프로젝트 내의 Gradle Wrapper를 사용하는 것이다. Make gradlew executable을 활성화를 해주어야 권한 문제 없이 진행할 수 있다.

 

Wrapper Location은 현재 프로젝트의 workspace 경로이다. Task의 clean은 workspace/build 레포지터리를 삭제하는 Task이며, build는 말그대로 빌드하는 Task이다.

Jenkins Build 수정

2) 프로젝트 의존성 추가

Spring Boot 프로젝트를 구동할 기본적인 의존성을 추가해준다. plugin에 'war'을 추가했기 때문에 하단의 bootWar, war Task가 진행된다. 만약 'jar'을 추가했을 경우 bootJar, jar Task로 진행된다.

 

archiveBaseName과 archiveVersion을 추가하여 기본 artifactID이름으로된 파일이 아닌 'springproject-1.0.1-SNAPSHOT'으로 생성된다. 서버에 바로 Jenkins 설치 후 build할 경우에는 '/var/lib/jenkins/workspace/springproject/build/libs/springproject-0.0.1-SNAPSHOT.war'에 생성이 된다. 

 

Spring Boot는 jsp를 지원하지 않기 때문에 war로 배포해야하며, 내장 톰캣을 지원하기 때문에 'starter-web'과 'tomcat-embed-jasper'를 의존성에 추가해주어야 한다.

// 플러그인 의존성
plugins {
    id 'java'
    id 'war'
    id 'eclipse'
    id 'org.springframework.boot' version '2.1.10.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
}

group 'com.example'
version '1.0.1-SNAPSHOT-'+new Date().format("yyyyMMddHHmmss")

sourceCompatibility = '1.8'     // Java 8버전
targetCompatibility = '1.8'     // Java 8버전

bootWar{                        //bootWar Task시 이름 지정
    archiveBaseName="springproject"
    archiveVersion="1.0.1-SNAPSHOT"
}

// 의존성 원격 저장소 위치
// - jcenter()는 mavenCentral()의 라이브러리 업로드의 번거로움을 간단하게 처리한다.
repositories {
    mavenCentral()
    jcenter()
}

// 프로젝트 의존성 선언
dependencies {
    // Lombok
    // - Preference의 Annotation Processors에서 'Enable annotation processing' 항목 활성화 필요
    compile('org.projectlombok:lombok')

    //내장톰캣
    compile 'org.apache.tomcat.embed:tomcat-embed-jasper'
    // jsp 의존성
    compile 'javax.servlet:jstl:1.2'

    // 기본
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

3) 프로젝트 배포 및 실행

수동으로 서버에 명령어로 실행할 수 있다. 또는 Jenkins를 이용하여 build 후 자동 실행시켜주기 위해 프로젝트 구성의 Build 탭에 Execute Shell을 추가한 후 명령을 작성해주면 된다.

java -jar [파일명].war

실행되고 있는 상태에서 Console Output 항목으로 이동하여 동작하는 중임을 확인할 수 있다.

구현 화면

 

 

 

2. 쉘 스크립트를 이용한 War 자동 배포

1) Jenkins 설정

Jenkins에서 지원하는 내부 변수(WORKSPACE, JOB_NAME)를 이용하여 포트 번호와 함께 쉘 스크립트로 변수를 전달해준다.

bash ${WORKSPACE}/deploy.sh 8080 ${JOB_NAME}

2) 쉘 스크립트 (deploy.sh)

프로젝트에 자동 배포를 위한 쉘 스크립트를 생성해준다.

#!/bin/bash
# sudo bash {PATH}/deploy.sh 8080 springproject

# Server Port
# Ex) 8080
SERVER_PORT=$1
# Service Name
# Ex) springproject
PROJECT_NAME=$2
 
PROJECT_PATH=/var/lib/jenkins/workspace/$PROJECT_NAME/build/libs
WAR_FILE=$PROJECT_PATH/$PROJECT_NAME-1.0.1-SNAPSHOT.war
TMP_PATH_NAME=/tmp/$PROJECT_NAME-pid
 
# Function
function stop(){
    sudo echo " "
    sudo echo "Stoping process on port: $SERVER_PORT"
    sudo fuser -n tcp -k $SERVER_PORT 
 
    if [ -f $TMP_PATH_NAME ]; then
        sudo rm $TMP_PATH_NAME
    fi
 
    sudo echo " "
}
 
function start(){
    sudo echo " "
    sudo nohup java -jar -Dserver.port=$SERVER_PORT $WAR_FILE /tmp 2>> /dev/null >> /dev/null &
    sudo echo " "
}
 
# Function Call
stop
 
start

쉘 스크립트의 stop 함수에 있는 'fuser -n tcp -k $SERVER_PORT'는 8080에 해당하는 포트를 Kill하기 위한 명령어이다. 이 명령어를 사용하기 위해서는 'psmisc' 패키지를 설치해야한다.

sudo yum install -y psmisc

쉘 스크립트의 start 함수의 nohup 명령은 백그라운드로 실행하는 명령어로, /tmp 내용을 log에 남기지 않도록 정의해준다.


만약 'sudo: no tty present and no askpass program specified' 문제가 발생할 경우, Jenkins user에 sudo 권한을 부여해준다.

sudo visudo
jenkins ALL=(ALL) NOPASSWD: ALL
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
jenkins ALL=(ALL) NOPASSWD: ALL

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

3) 구현 화면

구현 화면


[참고] bhsbhs235.github.io/

[참고] github.com/ozofweird/SpringBoot_Test

728x90

'CICD' 카테고리의 다른 글

[CICD] AWS EC2 Jenkins GitHub 설정  (0) 2020.12.11
[CICD] AWS EC2 Jenkins 설치  (0) 2020.12.11
[CICD] CI, CD  (0) 2020.12.11