Docker:Docker搭建Jenkins并共用宿主机Docker部署服务(二)构建后端微服务多模块

前言

继续完成微服务多模块部署,Jenkins的搭建与插件安装可以观看上一篇文章:https://www.cnblogs.com/nhdlb/p/18561435

新建视图

方便将整个项目的前端和后端整合起来

新建任务

选择视图

创建项目(任务)

任务配置

项目结构

这里我先介绍下项目结构,方便大家对后续操作的理解

Dockerfile文件内容如下:

FROM openjdk:21
# 设置构建参数
ARG JARNAME
# 设置构建参数
ARG JARPORT
# 映射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"]

docker-compose.yml文件内容如下:

#version: "3.8"
networks:
  # 共用其他compose的网段
  higec_net:
    external: true
services:
  gateway:
    image: liv****k-base-gateway:latest
    container_name: liv****k-gateway
    restart: always
    ports:
      - 9301:9301
    networks:
      higec_net:
        ipv4_address: 172.19.8.71
    volumes:
      - /etc/localtime:/etc/localtime:ro

  core:
    image: liv****k-base-core:latest
    container_name: liv****k-core
    restart: always
    ports:
      - 9304:9304
    networks:
      higec_net:
        ipv4_address: 172.19.8.74
    volumes:
      - /etc/localtime:/etc/localtime:ro

  device:
    image: liv****k-base-device:latest
    container_name: liv****k-device
    restart: always
    ports:
      - 9303:9303
    networks:
      higec_net:
        ipv4_address: 172.19.8.73
    volumes:
      - /etc/localtime:/etc/localtime:ro

  family:
    image: liv****k-base-family:latest
    container_name: liv****k-family
    restart: always
    ports:
      - 9305:9305
    networks:
      higec_net:
        ipv4_address: 172.19.8.75
    volumes:
      - /etc/localtime:/etc/localtime:ro

  field:
    image: liv****k-base-field:latest
    container_name: liv****k-field
    restart: always
    ports:
      - 9307:9307
    networks:
      higec_net:
        ipv4_address: 172.19.8.77
    volumes:
      - /etc/localtime:/etc/localtime:ro

  poultry:
    image: liv****k-base-poultry:latest
    container_name: liv****k-poultry
    restart: always
    ports:
      - 9308:9308
    networks:
      higec_net:
        ipv4_address: 172.19.8.78
    volumes:
      - /etc/localtime:/etc/localtime:ro

  record:
    image: liv****k-base-record:latest
    container_name: liv****k-record
    restart: always
    ports:
      - 9309:9309
    networks:
      higec_net:
        ipv4_address: 172.19.8.79
    volumes:
      - /etc/localtime:/etc/localtime:ro

  system:
    image: liv****k-base-system:latest
    container_name: liv****k-system
    restart: always
    ports:
      - 9306:9306
    networks:
      higec_net:
        ipv4_address: 172.19.8.76
    volumes:
      - /etc/localtime:/etc/localtime:ro

配置参数化构建

这里配置参数的作用是后续shell脚本可以根据参数生成不同镜像和容器

注意:配置构建路径默认的根路径就是GitLab项目的根目录,所以这里的构建路径直接以 base-modules/ 开始

配置项目地址

配置构建触发器

配置快照构建

定时任务构建

根据项目的要求,是否需要设置定时构建项目。

Jenkins使用Cron表达式来设置定时任务的执行规则:

  Cron由5个或6个字段组成,分别表示分钟、小时、日期、月份、星期几

## Jenkins中的 H 标记用于分散任务的触发时间,以避免任务在同一时间点过载执行;所以这点跟原始Cron有点不同
# 每隔5分钟执行一次
H/5 * * * *
# 每天上午10点和下午4点各执行一次
H 10,16 * * *
# 每15分钟构建一次
H/15 * * * *
# 每天8点~17点,两小时构建一次
H 8-17/2 * * *
# 周一到周五,8点~17点,两小时构建一次
H 8-17/2 * * 1-5
# 除12月外每月1号、15号各构建一次
H H 1,15 1-11 *

 

构建日志自定义命名

引用参数构建命名

配置pom文件用于构建Jar包

# 如果打包所有模块,使用如下命令
clean package -U -Dmaven.test.skip=true
    
# 如果打包指定模块,使用如下命令
clean package -U -pl ${你的参数构建属性名} -am -Dmaven.test.skip=true

打包所有模块

打包指定模块

配置Shell脚本

#!/bin/bash

# 清除Maven本地仓库内的_remote.repositories文件
#find /opt/maven/repository/ -type f -name "_remote.repositories" | xargs rm -f

# 判断上条命令是否执行成功,当执行失败的时候显示错误信息,并停止向下执行
function pauseErr(){
    if [ $? -ne 0 ];then
        echo "命令执行失败,终止shell脚本运行"
        #当上一条命令执行失败后,直接退出脚本,阻止脚本向下执行
        exit 1
    fi
}

# 保存旧的IFS值
OLD_IFS=$IFS
# 设置IFS为逗号
IFS=','

# 将字符串分割成数组
echo "########## 读取多选项的值 #####################"
read -ra packages <<< "$base_modules"

# 恢复IFS为旧值
IFS=$OLD_IFS

set +e

# 循环执行发包命令到指定服务器
echo "########## 循环业务模块 #####################"
for path_port in "${packages[@]}"; do
	#调用PauseErr函数判断上条命令是否执行成功
	pauseErr
	# 获取头部:模块路径
    module_path=$(echo "${path_port%%:*}" | awk '{$1=$1};1')
    # 获取尾部:模块名称
	module_name=${module_path##*/}
    # 获取尾部:名称
	base_name=${module_path##*-}
    # 获取尾部:端口号
	base_port=${path_port##*:}
    
    if docker ps -a | grep "liv****k-$base_name"; then
        echo "########## 删除 liv****k-$base_name 容器 #####################"
        # 使用docker rm命令删除容器,-f表示强制删除
        docker rm -f liv****k-$base_name
    fi
    if docker images | grep "liv****k-$module_name"; then
        echo "########## 删除 liv****k-$module_name 镜像 #####################"
        # 使用docker rmi命令删除镜像
        docker rmi liv****k-$module_name
    fi
    #调用PauseErr函数判断上条命令是否执行成功
    pauseErr
    echo "########## 构建 $module_name 镜像 #####################"
    # 构建镜像
    docker build -t liv****k-$module_name:latest --build-arg JARNAME=./$module_path/target/$module_name --build-arg JARPORT=$base_port . 
done
echo "########## 启动项目容器 #####################"
#sleep 10s
#调用PauseErr函数判断上条命令是否执行成功
pauseErr
docker-compose up -d
pauseErr
echo "########## 容器运行完成 #####################"

set -e

 保存配置!!!

运行构建

查看Docker镜像和容器

后端容器构建完成!!!!

posted @ 2024-11-23 23:44  怒吼的萝卜  阅读(864)  评论(0)    收藏  举报