[Jenkins Build] SpringBoot+React Project Jenkins로 배포하기
목차 :
0. 설명
1. CentOS 설정
1-1. Jenkins
1-2. Maven
2. Project 설정
2-1. Backend - pom.xml / launch.sh / application.yml
2-2. Frontend - package.json
3. jenkins 환경 설정
3-1. jenkins에 Maven 설정
3-2. jenkins에 Public Over SSH 설정
3-2. jenkins new project [Git 연결, Build Step - Maven 설정, Post Build - Public Over SSH 설정 ( SSH 및 Transfer )]
0. 설명
0-1. 이번 포스트에 대한 설명을 합니다.
0-1. 이번 포스트에 대한 설명을 합니다.
이 글은 원격 서버(CentOS) 환경에서 Jenkins로 Git 저장소에 있는 Spring Boot + React 웹 프로젝트를 빌드하고 배포하는 과정을 설명합니다. 그 과정 속에서 필요한 환경 구성 및 명령어, 파일 설정들에 대한 내용을 설명을 합니다.
웹 프로젝트는 Backend(Spring Boot) 와 Frontend(React)로 구성되며 Spring Boot는 maven(mvn) 빌드, React는 node packaged manager(npm) 빌드를 수행합니다.
Jenkins는 maven으로 프로젝트를 빌드하며 따라서 Spring Boot mvn 빌드를 수행할 때 React의 npm 빌드 작업도 이뤄집니다.
위 일련의 과정은 웹 프로젝트 생성, 작업, 빌드, 배포에서
생성과 코드 작업이 끝난 상태로 Git 저장소에 저장된 시점을 기준으로 빌드-배포를 서버에서 Jenkins로 진행합니다.
2. Project 설정
2-1. Backend - pom.xml / launch.sh / application.yml
2-2. Frontend - package.json
파일 구조에서 launch.sh/ application.yml/ pom.xml/ package.json 위치
Project
|-- Backend [SpringBoot]
| |-- /src/main/resources
| | |-- /script
| | | |-- launch.sh
| | |-- application.yml
| |-- pom.xml
|
|-- Frontend [Node.js]
| |--package.json
2-1. Backend - pom.xml / launch.sh / application.yml
[간단 역할 요약]
pom.xml : pom.xml에서 frontend npm 실행 명령어를 수행하기 위해 exec 를 명시.
application.yml : production/ development 영역을 분리 배포때는 production으로 진행.
launch.sh : jenkins에서 최종 빌드된 project.jar 파일을 실행시키는 script를 명시.
[상세 설명]
[1] pom.xml
pom.xml에는 frontend를 실행하는 npm 명령어를 수행하기 위해 exec를 작성해놓는다.
그걸 왜 backend 의 설정 파일인 pom.xml에서 하느냐?
바로 backend가 maven(이하 mvn) 으로 빌드되며 jenkins가 현재 mvn 으로 빌드되게 설정되어있기 때문이다.
즉, jenkins가 mvn으로 프로젝트를 빌드하기 때문에 backend mvn 명령어 수행하기 전 frontend npm 명령어를 mvn으로 수행하기 위해 pom.xml에 exec( execution option )을 설정한다.
pom.xml 중 exec 설정 부분..
exec는 execution으로 추후 jenkin에서 통합 빌드를 위해 mvn ~ exec:exec 를 사용하게 된다.
위 pom.xml을 해석해보면
codehaus.mojo에서 만든 exec-maven-plugin을 사용한다. exec-maven-plugin은 mvn 에서 exec 옵션을 사용할 수 있게 해준다.
실행 목표는 어떤 목표(goal)를 실행할 지 지정하는데 여기선 exec를 목표로 실행한다.
실행 가능 파일(executable)을 정의하는데 여기선 npm을 지정했다. *frontend npm 실행을 위함.
작업디렉터리 (workingDirectory)를 '../frontend'로 지정했다.
인수(arguments)로 'run' 과 'build:fe'를 작성했는데. 결국 exec 목표는 "npm run build:fe"를 실행하는 것을 뜻한다.
요약 :
backend build process 중에 'exec-maven-plugin'을 이용해 '../frontend' 디렉터리에서 npm 명령 (npm run build:fe)을 수행한다.
[2] application.yml
application.yml은 SpringBoot와 함께 WebApplication을 구성하는 파일로 spring mvc, web, thymeleaf, mybatis, logging, dataSource(DB Connection) 정보가 명시되어있다.
개발자 환경에서 개발에 도움이 되는 툴을 추가할 수 있는데. 이런 툴들은 배포시 포함되면 안되기 때문에
개발 환경과 배포 환경을 별도로 분리한다.
개발 환경은 development, 배포 환경은 production이라 정의한다.
jenkins에서 최종 빌드된 jar파일을 launch.sh에서 실행할 때 자세히 보면
spring.profiles.active를 production으로 설정하는 부분이 있다.
해당 부분은 위 application.yml파일에서 최 상단 spring의 profile을 지정하는 것이며
해당 값으로 yml파일에서 배포(production)/ 개발(development) 환경으로 backend를 구성할지 결정된다.
[3] launch.sh
launch.sh은 jenkins가 git으로 부터 가져온 통합 파일을 빌드하고 나온 jar 파일을 실행시켜주는 역할을 수행한다.
script에는 현재 jar 파일이 실행 중인지 확인하고 만약 프로세스가 존재한다면 kill 하는 조건문이 포함되어있다.
application name은 emaillist이다,
현재 실행된 script의 절대경로를 찾아 SCRIPT_DIR에 저장한다.
현재 실행 중인 JAVA 프로세스 중 실행하려는 파일이 존재할 경우 해당 PID를 가져와 저장한다.
만약 프로세스가 존재한다면 해당 PID를 Kill 한다. 이후 10초를 기다린다.
SCRIPT_DIR에 진입해 실행 파일을 백그라운드로 실행한다.
spring.profile.active를 production으로 지정한다. 이건 application.yml에서 개발/배포 환경으로 분리된 영역 중 배포(production) 영역을 실행하게한다.
2-2. Frontend - package.json
[간단 역할 요약]
package.json : frontend를 한번에 실행 할 수 있게 npm 명령어 script를 명시.
[상세 설명]
[1] package.json
package.json은 react에서 의존성 관리, 스크립트 실행, metadata 및 기타 설정이 명시되어있는 설정 파일이다.
frontend를 빌드하는 npm 명령어들이 scripts에 명시되어있고 package.json 의 scripts 중 build가 붙은 script가 배포를 위한 script이다.
여기서 build:fe 명령어 (npm install && npx webpack --config config/webpack.config.js --mode production"이 중요하다.
해당 명령어를 분석하면
npm install = package.json에 명시되어있는 프로젝트의 종속성을 설치한다.
npx webpack --config config/webpack.config.js = webpack을 실행시키기 위한 설정 파일이 config/webpack.config.js에 위치한다.
--mode production = webpack을 production 모드로 빌드한다. 이는 성능을 최적화 하는 것이다.
3. jenkins 환결 설정
3-1. jenkins에 Maven 설정
3-2. jenkins에 Public Over SSH 설정
3-3. jenkins new project [Git 연결, Build Step - Maven 설정, Post Build - Public Over SSH 설정 ( SSH 및 Transfer )]
3-1. jenkins에 Maven 설정
[간단 역할 요약]
CentOS (VPC)에 jenkins가 설치된 환경을 기본 구성으로 진행한다.
jenkins에서 java web application 배포 파일로 빌드하기 위해 maven을 사용하는 환경을 구성한다.
jenkins에서는 간단히 설정값 추가함으로써 maven로 빌드를 할 수 있다.
[1] jenkins에서 maven 설정하는 방법
1. jenkins에 접속한다. ( http://192.168.0.xxx:8080/jenkins/ )

2. 우측 메뉴에서 jenkins 관리 (⚙) 선택

3. 설정 메뉴 중 Tools 선택

4. Tools 설정 중 하단 Maven installations에서 'Add Maven' 선택
*maven name 지정, centos에서 maven이 설치된 대표 경로 지정
*install automatically를 선택할 경우 선택한 maven 버전에 맞게 설치해줌.

5. 설정 후 Apply 및 Save 선택

3-2. jenkins에 Public Over SSH 설정
[간단 역할 요약]
SSH 접속할 원격 서버가 존재하는 환경을 기본으로 한다.
개인키/ 공개키를 설정해 접근한다.
jenkins project 구성 설정에서 jenkins 빌드된 jar 파일을 원격 서버에 전송을 구성한다.
[1] jenkins에서 Public Over SSH설정하는 방법
1. jenkins 관리를 선택한다.

2. Public Over SSH 설정을 위해 Plugin에서 다운로드 한다.


3, jenkins 관리에서 System 선택

4. 하단에 Public Over SSH에서 SSH Server 추가 및 기본 정보 작성

** root 로그인을 허용하기 위해 원격서버에서 PermitRootLogin 을 yes로 해줘야함.
(1) $ vi /etc/ssh/sshd_config 내용 중 PermitRootLogin을 yes로 설정
5. 고급 선택) key 입력 칸에 개인키(private key) 입력

**개인키(private key) / 공개키 (public key)를 설정하는 방법은 아래와 같다.
- 원격 서버(centos) 에서 개인키/공개키를 발행할 수 있다. (꼭 원격 서버가 아니더라도 unix 계열 pc에서 발행 가능)
- 원격 서버에서 발행을 가정한다.
1) key 발행
$ ssh-keygen -t rsa -b 2048 -m PEM -C "admin@admin.com"
2) key 확인
개인키 : ~/.ssh/id_rsa
공개키 : ~/.ssh/id_rsa.pub
3) 공개키를 서버에 설치하기 (이미 서버에 위치해 있기 때문에 파일 명만 바꿔준다.)
$ mv ~/,ssh/id_rsa.pub ~/.ssh/authorized_keys
여기서 중요한건 authorized_keys로 파일 명을 바꿔주면 서버가 알아서 해당 파일을 공개키로 인식한다.
4) 접속 환경 설정
(1) $ echo $PATH 명령어로 출력된 경로를 복사
(2) $ vi ~/.ssh/environment 파일에 PATH='복사한 경로' 를 작성
(3) $ vi /etc/ssh/sshd_config 내용 중 PermitUserEnvironment를 yes로 설정
5) 서버에 공개키 적용
$ systemctl restart sshd
3-3. j enkins new project [Git 연결, Build Step - Maven 설정, Post Build - Public Over SSH 설정 ( SSH 및 Transfer )]
[간단 역할 요약]
빌드/배포할 project의 git을 연동한다.
빌드 도구로 사전에 jenkins에 등록해준 maven을 설정 및 Goals (mvn으로 수행할 명령어)을 지정한다.
빌드 후 작업으로 사전에 jenkins에 등록해준 ssh server와 연결 및 원격 서버에 전송할 파일과 파일 실행 스크립트를 설정한다.
1. jenkins new item 선택

2. Freestyle project 선택 및 item 이름 설정 후 ok

3. 설정) 소스코드 관리 Git 선택 및 Git 저장소 URL, Branch Specifier 입력(기본 : */master)

4. 설정) Build Steps에서 Invoke top-level Maven targets 선택 후 사전 정의된 Maven 선택 및 Goals (npm 명령어) 작성


5. 설정) 빌드 후 조치 에서 Send build artfacts over SSH 선택


6. 설정) jenkins에 사전 정의된 Public Over SSH Server 선택 및 Build 후 Server한테 보낼 파일을 설정한다.

7. 설정) 모든 설정을 마치고 저장하면 된다.