1 项目架构如图

git 地址为整体结构 未拆分 : 

http://127.0.0.1:8888/gtilab/顶级父工程.git

jenkins构建多模块项目 jenkins 多模块_jenkins构建多模块项目

 

2 构建需求,需要针对模块 进行整体选择性构建部署

        

  2.1 CICD  gitlab->jenkins->harbor->rancher

   此篇主要关注jenkins 相关集成构建,重点不在于 gitlab,harbor,rancher等环境的搭建

   有空再补充吧,先搞个demo。

 2.2 jenkins 相关操作 :

  2.2.1  安装 gitlab插件 安装流水线相关插件;  这些插件  安装的时候会引导安装大部分; 缺少的 点进插件管理中心 , 进行安装就好了

jenkins构建多模块项目 jenkins 多模块_jenkins构建多模块项目_02

 2.2.2 git配置

jenkins构建多模块项目 jenkins 多模块_jenkins_03

2.2.3 maven配置

直接使用默认的让jenkins自己安装

jenkins构建多模块项目 jenkins 多模块_jenkins构建多模块项目_04

 使用自己安装的maven  取消勾选自动安装 然后如图操作

jenkins构建多模块项目 jenkins 多模块_jenkins构建多模块项目_05

 

2.2.4  创建jenkins任务绑定项目(流水线)

jenkins构建多模块项目 jenkins 多模块_jenkins构建多模块项目_06

 

2.2.5 项目配置 (重点 简单版本 一般够用)

选择gitlab connection  具体配置 看第二张贴图

jenkins构建多模块项目 jenkins 多模块_jenkins_07

  GITLAB CONNECTION  配置在这 反正就像这样  缺啥补啥

jenkins构建多模块项目 jenkins 多模块_docker_08

 

2.3 jenkins 操作流水线(重点)

2.3.1  jenkins项目配置相关, 看图点点点

jenkins构建多模块项目 jenkins 多模块_jenkins_09

 

jenkins构建多模块项目 jenkins 多模块_git_10

 

jenkins构建多模块项目 jenkins 多模块_git_11

 

jenkins构建多模块项目 jenkins 多模块_运维_12

jenkins构建多模块项目 jenkins 多模块_docker_13

 

 

2.3.2 jenkins 流水线构建脚本以及每个模块的dockerfile

//gitlab的凭证
def git_auth = "ASDASD*****DASD"

//构建版本的名称
def tag = createVersion()

//Harbor私服地址
def harbor_url = "127.0.0.1:5000"

//Harbor的项目名称
def harbor_project_name = "C_P_A_A"

// harbor用户名和密码
def username = "admin"
def password = "******"

def num = 2;

def createVersion() {
    return new Date().format('yyyyMMddHHmm') + "_${env.BUILD_ID}"
}

node{
		//maven地址
    def mvn = "/usr/local/maven/apache-maven-3.9.1/bin/mvn"

    //把选择的项目信息转为数组
    def selectedProjects = "${C_P}".split(',')
    echo "${selectedProjects}"

    stage('拉取代码'){
        echo '准备拉取代码'
        checkout([$class: 'GitSCM', branches: [[name: '*/${APP_BRANCH}']], extensions: [], userRemoteConfigs: [[credentialsId: '${git_auth}', url: 'http://127.0.0.1:18888/hbsh/C_P_A_A.git']]])
        echo '代码拉取完毕'
    }

    stage('编译构建公共模块'){
    echo '开始编译公共模块 , 校验插件这玩意上线的时候 别忘了去掉跳过'
    sh "${mvn} -f C_P_A_A-modules clean install -Dpmd.skip=true -Dcheckstyle.skip=true"
    echo '公共模块编译完毕'
    }

    for(int i=0;i<selectedProjects.size();i++){
         num ++ ;

         //取出每个项目的名称和端口
         def currentProject = selectedProjects[i];
         echo "${currentProject}"
         //项目名称
         def currentProjectName = currentProject.split('@')[0]
         //项目启动端口
         def currentProjectPort = currentProject.split('@')[1]
         echo "${currentProjectName}"
         echo "${currentProjectPort}"

         if (num % 10 == 0) {
            echo ''
         }
         stage("编译项目: ${currentProjectName}"){
            num++;

            echo '开始编译构建 ======== ${currentProjectName}'

            //编译打包选中微服务项目
            sh "${mvn} -f ${currentProjectName} clean package -Dpmd.skip=true -Dcheckstyle.skip=true"

            echo "${currentProjectName} + 编译完毕"
         }

         if (num % 10 == 0) {
            echo ''
         }
         stage("制作并推送镜像: ${currentProjectName}"){
            num++;
            // 生成镜像
            sh "${mvn} -f ${currentProjectName} dockerfile:build"
            //定义镜像名称(因为原本微服务项目前面还有一个父项目的,所以 必须获取到项目的真正名称 ,例如 infrastructure/api_gateway 变成 api_gateway)
            def realProjectName = currentProjectName.split("/")
            def realName = realProjectName[realProjectName.length-1]
            def imageName = "${realName}:${tag}"
            echo "${imageName} + 镜像名称完毕"
            echo "${tag} + tag版本号"

            //登录
            sh "docker login -u ${username} -p ${password} ${harbor_url}"

            //给镜像打标签
            sh "docker tag ${realName}:latest ${harbor_url}/${harbor_project_name}/${imageName}"

            //上传镜像
            sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"

            //删除本地镜像 (根据镜像名称删除镜像和打标签的镜像,因为原本的镜像和打包后镜像是同一个镜像id,无法通过镜像id删除镜像)
            sh "docker rmi -f ${imageName}"
            sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
            //判断是否存在虚悬镜像  , 存在虚悬镜像,执行删除操作

            echo '制作并推送镜像完成 ======== ${currentProjectName}'
         }
    }

    stage('Cleanup'){
        sh '''
        if [ -n "$(docker images --format '{{.Repository}}:{{.Tag}} {{.ID}}' | awk '$1 == "<none>:" {print $2}')" ]; then
          docker rmi $(docker images -f 'dangling=true' --filter 'before=<none>' -q) 2> /dev/null
        fi
        '''
    }


    
}

dockerfile  及其简易版本  根据各自需求更改

FROM openjdk:17.0.2-oracle
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

2.4 最终实现 P的图

jenkins构建多模块项目 jenkins 多模块_运维_14

 

jenkins构建多模块项目 jenkins 多模块_jenkins_15