포스코DX X 비트교육센터 6기 - build & deploy


backend에 mojo 플러그인 설치

  • pom.xml

<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>exec-maven-plugin</artifactId>
				<version>3.0.0</version>
				<executions>
					<execution>
						<goals>
							<goal>exec</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<executable>npm</executable>
					<workingDirectory>../frontend</workingDirectory>
					<arguments>
						<argument>run</argument>
						<argument>build:fe</argument>
					</arguments>
					<environmentVariables>
					</environmentVariables>
				</configuration>
			</plugin>
  • exec-maven-plugin은 Maven 빌드 중에 외부 명령어나 스크립트를 실행하기 위한 플러그인 중 하나
  • 이 플러그인을 사용하면 Maven 빌드 프로세스 중에 정의된 명령어나 스크립트를 실행하여 원하는 작업을 수행할 수 있다.

  • 여기서는 npm이라는 Node.js 패키지 매니저를 실행하고, 해당 명령어의 실행 위치를 ../frontend로 지정하고 있어요. 그리고 npm run build:fe라는 스크립트를 실행 중.
  • 이렇게 함으로써 Maven 빌드 중에 프론트엔드 자원을 빌드하는 등의 작업을 수행

  • mojo란 이름은 Maven에서 사용하는 플러그인을 만들 때 자주 사용되는 용어이며, Maven의 플러그인 아키텍처를 구성하는 구성 요소 중 하나
  • 따라서 org.codehaus.mojo는 Maven 플러그인을 위한 코드를 제공하는 Maven의 프로젝트 중 하나

frontend에 build script 추가하기

"build:fe": "npm install && npx webpack --config config/webpack.config.js --mode production",
  • npm install은 Node.js 프로젝트에서 사용되는 패키지 의존성을 설치하는 명령어
  • 여기서 “build:fe”이라는 스크립트를 실행하기 전에 npm install 명령어를 사용하면, 프로젝트에 필요한 패키지들이 설치되어 있지 않다면 먼저 필요한 패키지들을 설치

backend에 애플리케이션 실행 설정 정의 수정

# spring configuration
spring:
   application:
      name: emaillist
   profiles:
      active: development
      
      
---
# common spring boot configuration
spring:
   mvc:
      static-path-pattern: /assets/**
      throw-exception-if-no-handler-found: true
   web:
      resources:
         static-locations: classpath:/assets/

   thymeleaf:
      prefix : classpath:templates/
      check-template-location: true
      mode: HTML5
      suffix : .html
      cache : false

mybatis:
   config-location: classpath:mybatis/configuration.xml

logging:
   pattern:
      console: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n"
   level:
      root: INFO



---
# development profile: spring boot configuration
spring:
   config:
      activate:
         on-profile: development

   devtools:
      livereload:
         enabled: true
                     
   datasource:
      driver-class-name: org.mariadb.jdbc.Driver
      url: jdbc:mariadb://[내 ip주소]:3307/webdb?charset=utf8
      username: webdb
      password: webdb
      hikari:
         minimum-idle: 10
         maximum-pool-size: 20
   
server:
   port: 8080
   servlet:
      context-path: /
      encoding:
         charset: utf-8
         enabled: true
         


---
# production profile: spring boot configuration
spring:
   config:
      activate:
         on-profile: production

   datasource:
      driver-class-name: org.mariadb.jdbc.Driver
      url: jdbc:mariadb://[내 ip주소]:3307/webdb?charset=utf8
      username: webdb
      password: webdb
      hikari:
         minimum-idle: 10
         maximum-pool-size: 20
         
server:
   port: 8088
   servlet:
      context-path: /
      encoding:
         charset: UTF-8
         enabled: true
  • 터미널에서 해당 명령어로 build success 확인하기.
C:\Users\pc\Desktop\poscodx2023\eclipse\react-practices\emaillist\backend> mvn exec:exec clean package
  • centOS에서 build 해보기
// git에서 프로젝트 clone 받기
 # git clone 주소

// 만약에, 프로젝트 내용이 바뀐다면, git push하고, centOS에 있는 프로젝트를 삭제하고 다시 clone 받기
 # rm -rf [프로젝트 이름]
 # git clone 주소


// 빌드(배포)
 # mvn -f emaillist/backend exec:exec clean package

// 테스트
 # java -Dspring.profiles.active=production -jar emaillist/backend/target/emaillist.jar

image

Jenkins 배포하기

  • 새로운 Items 추가
  • Freestyle Project로 ok

  • image

  • image

  • build 하기

  • 결과 )

image

SSH 연결하기

  • SSH란?

: 인증 및 접근 제어; SSH 키 기반의 인증은 안전하면서도 편리한 방법으로 접근을 제어할 수 있습니다. 특히 배포나 서버 접속과 같은 작업에서는 SSH 키를 사용하는 것이 일반적입니다. SSH 키는 비밀번호와는 달리 보안성이 높아, 무단 접근을 방지하는 데 도움이 됩니다.

SSH 키는 보안성을 높이고, 사용자 경험을 향상시키며, 자동화와 관리의 용이성을 제공하여 서버 접속 및 배포와 같은 작업을 더 효과적으로 수행할 수 있도록 도와줍니다.

  • CentOS에서 key 생성하기
    # ssh-keygen -t rsa -b 2048 -m PEM -C "sonrisa-bonita@naver.com"
  • key 생성 확인 (root에서 cd .ssh으로 가서 ll 하면 두가지의 키를 확인할 수 있다.)
# cd .ssh
# ll

    - private key(개인키): ~/.ssh/id_rsa
    - public key(공개키): ~/.ssh/id_rsa.pub
  • 공개키를 서버에 설치하기
     # mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
  • private key 잘 저장하기
     # cat id_rsa

나오는 키값을 메모장에 옮겨 적고

모든 파일로 로컬에 ‘mykey_pem’라는 이름으로 저장

image

image

만약 open이 되지 않는다면??

//webmaster password 로 들어가서 root로 들어갈 수 있도록 설정을 바꾸어야함.

# vi /etc/ssh/sshd_config

//PermitRootLogin yes > 저장하기

# systemctl restart sshd
# exit
# open
// 상단 설정 다시해서 들어가기 

image

  • deploy: Publish Over SSH 플러그인(Jenkins)

플러그인 다운로드 받기

image

잰킨스관리의 system에서 다음과 같은 메뉴가 생긴다면 준비 완료

image

  • SSH Server에 내용 채우기

image

image

  • 배포하는 프로젝트 들어가서 configuration의 빌드 후 조치

image

image

image

  • centOS에서 접속 환경 설정하기
    1. ~/.ssh/environment (여기 파일을 만들어서 다음 내용 작성하기)
        =====
        PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/poscodx2023/java/bin:/usr/local/poscodx2023/git/bin:/usr/local/poscodx2023/maven/bin:/usr/local/poscodx2023/mariadb/bin:/root/bin
        =====

    2. /etc/ssh/sshd_config ( 여기 파일에 들어가서 해당 내용 yes로 바꾸기 ) 
        PermitUserEnvironment yes


  • launch.sh를 backend/resource 폴더에 추가한다.
#! /bin/bash

APPLICATION_NAME=emaillist
SCRIPT_DIR=$(cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd)
PID=$(ps -ef | grep java | grep $APPLICATION_NAME.jar | awk '{print $2}')

if  [ ! -z "$PID" ] 
then
	echo "stopping [$APPLICATION_NAME]"
	kill -9 $PID
	sleep 10
fi

echo "starting [$APPLICATION_NAME]"
cd $SCRIPT_DIR
nohup java -Dspring.profiles.active=production -jar $SCRIPT_DIR/$APPLICATION_NAME.jar >> $SCRIPT_DIR/launch.log &

이 스크립트는 Spring Boot 애플리케이션을 실행하거나 중지하는 데 사용

  • 새로운 릴리스 배포: 애플리케이션을 업데이트하거나 새로운 릴리스를 배포할 때, 이전 버전의 애플리케이션을 중지하고 새 버전을 시작

  • 환경 구성 변경: 애플리케이션의 환경 구성이 변경되었을 때, 적용된 변경 사항을 반영하기 위해 애플리케이션을 다시 시작.

  • 애플리케이션 재시작: 메모리 누수나 성능 이슈 등으로 인해 애플리케이션을 주기적으로 재시작.

  • 프로파일 변경: 스크립트에서 사용된 -Dspring.profiles.active=production은 애플리케이션을 production 프로파일로 시작하도록 지정.

이 스크립트는 이러한 작업을 자동화하여 운영 및 배포 프로세스를 편리하게 만들어줍니다. 특히, nohup을 사용하여 백그라운드에서 실행되도록 하고, 로그를 launch.log 파일에 기록하여 추적이 가능하게 합니다.

// 실행하고자 하는 프로젝트로 이동한다.
# cd /usr/local/poscodx2023/springboot-apps/emaillist07

// launch.sh를 실행한다.
# ./.launch.sh

// java 실행이 kill 이후 restart 되었는지 확인한다. 
# ps -ef | grep java
// pid가 바뀐 것을 알 수 있다. Process ID의 약어로, 각 프로세스에 할당된 고유한 식별자. (운영체제는 각 실행 중인 프로세스에 대해 고유한 ID를 부여하여 해당 프로세스를 식별한다.)
  • 결과) jenkins에서 빌드 이후 배포가 완료된 것을 알 수 있다.

image