Docker를 사용한 Jenkins 구축 및 호스트 Docker와의 연동을 통한 서비스 배포 (5): 서버 간 원격 배포로 구현하는 백엔드 마이크로서비스 다중 모듈

서론

이전 기사에서 다룬 Jenkins 구축 및 플러그인 설치 내용은 다음 링크에서 확인할 수 있습니다: https://www.cnblogs.com/nhdlb/p/18561435

SSH 원격 서버 연결 구성

SSH 연결 플러그인을 설치해야 합니다. 이전 기사에서 설치 방법을 확인할 수 있습니다.

SSH 연결 구성 시작

저장!!

새로운 뷰 생성

프로젝트의 프론트엔드와 백엔드를 통합하기 쉽게 하기 위함

새로운 작업 생성

뷰 선택

프로젝트(작업) 생성

작업 구성

프로젝트 구조

먼저 프로젝트 구조를 소개하면, 다음 작업 이해에 도움이 될 것입니다.

우리가 하려는 것은 원격 서버 자동 배포이므로, 이 프로젝트의 Dockerfile, docker-compose.yml은 원격 서버의 디렉토리에 배치해야 합니다. 나중에 설명하니 지금은 이 파일들에 대해 너무 신경 쓰지 마세요.

매개변수화된 빌드 구성

여기에 매개변수를 구성하는 목적은 나중에 셸 스크립트가 매개변수에 따라 다른 이미지와 컨테이너를 생성할 수 있도록 하기 위함입니다.

참고: 빌드 경로의 기본 경로는 GitLab 프로젝트의 루트 디렉토리이므로, 여기서의 빌드 경로는 base-modules/로 시작합니다.

프로젝트 주소 구성

빌드 트리거 구성

스냅샷 빌드 구성

예약된 작업 빌드

프로젝트 요구사항에 따라 예약된 작업을 설정할지 여부를 결정합니다.

Jenkins는 Cron 표현식을 사용하여 예약된 작업의 실행 규칙을 설정합니다:

Jenkins의 H 표시는 작업이 동일한 시점에 과부하되지 않도록 트리거 시간을 분산시키는 데 사용됩니다. 이는 원래 Cron과 약간 다릅니다.

5분마다 한 번씩 실행

H/5 * * * *

매일 오전 10시와 오후 4시에 각각 실행

H 10,16 * * *

15분마다 빌드

H/15 * * * *

매일 오전 8시부터 오후 5시까지 2시간마다 빌드

H 8-17/2 * * *

월요일부터 금요일까지 오전 8시부터 오후 5시까지 2시간마다 빌드

H 8-17/2 * * 1-5

12월을 제외한 매월 1일과 15일에 각각 빌드

H H 1,15 1-11 *

빌드 로그 사용자 정의 이름 지정

매개변수 빌드 이름 지정 참조

Jar 패키징을 위한 pom 파일 구성

# 모든 모듈을 패키징하려면 다음 명령 사용
clean package -U -Dmaven.test.skip=true
    
# 특정 모듈만 패키징하려면 다음 명령 사용
clean package -U -pl ${매개변수 빌드 속성 이름} -am -Dmaven.test.skip=true

모든 모듈 패키징

특정 모듈 패키징

셸 스크립트 구성

여기서는 "Send files or execute commands over SSH"를 선택합니다.

중요: 각 모듈에 대해 Transfer Set을 생성해야 합니다. Remove prefix는 모호 일치를 지원하지 않으므로 이 부분이 다소 번거로울 수 있습니다.

각 모듈에 대해 Transfer Set 모듈을 생성해야 합니다.

마지막 Transfer Set 모듈의 Exec command에 실행할 명령을 작성합니다.

원격 서버 환경

디렉토리 구조

현재 디렉토리는 기사 시작 부분에 설정된 jar 저장 디렉토리입니다. /home/compose/business/

Dockerfile

FROM openjdk:21
#LABEL authors="zhaoyue"
# 빌드 매개변수 설정
ARG JARNAME
# 빌드 매개변수 설정
ARG JARPORT
# 빌드 매개변수 설정
ARG ACTIVEPRO
# 값 전달
ENV PRO_ACTIVE=${ACTIVEPRO}
# jar 매핑
COPY ${JARNAME}.jar app.jar
# 포트
EXPOSE ${JARPORT}
# 실행 명령
ENTRYPOINT ["java", "-jar", "-Duser.timezone=Asia/Shanghai","-Dfile.encoding=UTF-8", "app.jar", "--spring.profiles.active=${PRO_ACTIVE}"]

docker-compose.yml

#version: "3.8"
networks:
  # 다른 compose와 공유하는 네트워크
  htec_net:
    external: true
services:
  gateway:
    # 여기서 이미지 이름은 컨테이너 이름과 일치하여 관리 작업이 용이합니다
    image: portal-gateway:latest
    container_name: portal-gateway
    restart: always
    ports:
      - 9601:9601
    networks:
      htec_net:
        ipv4_address: 172.19.8.11
    volumes:
      - /etc/localtime:/etc/localtime:ro

  core:
    image: portal-core:latest
    container_name: portal-core
    restart: always
    ports:
      - 9603:9603
    networks:
      htec_net:
        ipv4_address: 172.19.8.13
    volumes:
      - /etc/localtime:/etc/localtime:ro

  project:
    image: portal-project:latest
    container_name: portal-project
    restart: always
    ports:
      - 9604:9604
    networks:
      htec_net:
        ipv4_address: 172.19.8.14
    volumes:
      - /etc/localtime:/etc/localtime:ro

  system:
    image: portal-system:latest
    container_name: portal-system
    restart: always
    ports:
      - 9606:9606
    networks:
      htec_net:
        ipv4_address: 172.19.8.16
    volumes:
      - /etc/localtime:/etc/localtime:ro

jar_build.sh

#!/bin/bash

# 변수 정의
# jar 저장 절대 경로
JAR_PATH="/home/compose/business/"
# 이미지 이름과 포트
JAR_NAMES="portal-gateway:9601,portal-core:9603,portal-project:9604,portal-system:9606"
# 프로덕션 환경 설정
MAVEN_ENV="portalPlatform_pro"

# 이전 IFS 값 저장
OLD_IFS=$IFS
# IFS를 쉼표로 설정
IFS=','

# 문자열을 배열로 분할
echo "########## 다중 옵션 값 읽기 #####################"
read -ra names <<< "$JAR_NAMES"

# IFS를 이전 값으로 복원
IFS=$OLD_IFS

# 지정된 디렉토리로 이동
cd $JAR_PATH || { echo "디렉토리 변경 실패"; exit 1; }

echo "########## 모든 컨테이너 중지 #####################"
# docker-compose로 컨테이너 정리 실행
docker-compose down

echo "########## 비즈니스 모듈명 순회 #####################"
for name in "${names[@]}"; do
    # 머리부: 이름
    base_name=$(echo "${name%%:*}" | awk '{$1=$1};1')
    # 이름 가져오기
    module_name=${base_name##*-}
    # 꼬리부: 포트 번호
    base_port=${name##*:}
    echo "#----------   $base_name + $base_port"
    # 이미지 ID 가져오기
    CID_BUSINE=$(docker images | grep "$base_name" | awk '{print $1}')
    echo "# - - - - -   $CID_BUSINE"
    if [ -z "$CID_BUSINE" ]; then
        echo "값이 없음, 이미지 삭제 불필요!"
    else
        # 이미지 삭제
        docker rmi $CID_BUSINE
    fi
    # 새 이미지 빌드
    docker build -t $base_name:latest --build-arg ACTIVEPRO=$MAVEN_ENV --build-arg JARNAME=./base-$module_name --build-arg JARPORT=$base_port .
done

echo "########## 프로젝트 컨테이너 시작 #####################"
docker-compose up -d
echo "########## 컨테이너 실행 완료 #####################"

빌드 실행

원격 서버에서 백엔드 컨테이너 빌드가 완료되었습니다!!!!!

태그: docker Jenkins 마이크로서비스 원격 배포 컨테이너 오케스트레이션

8월 8일 04:02에 게시됨