Jenkins实践(三):分包编译部署到Maven私仓

本文主要是针对springboot多模块项目,参数化构建、分包部署到maven私仓的记录。本文以上篇文章为基础进行记录。

系列文章:

Jenkins入门(一):从搭建到部署第一个Springboot项目(踩坑记录)_ub24.04安装jenkins-CSDN博客

Jenkins入门(二):流水线方式部署多模块Springboot项目-CSDN博客

目录

一、Maven私仓搭建

1.1 创建Ubuntu虚拟机

1.2 安装NATAPP内网穿透工具

1.3 安装 JDK8

1.4 安装 Nexus

1.5 配置Nexus私库地址

二、Jenkinsfile分包部署脚本

2.1 Jenkinsfile修改

2.2 idea 格式化Jenkins

三、Jenkins多参数配置


一、Maven私仓搭建

目前Jenkins和项目部署到服务器上,Maven私仓部署到ubuntu虚拟机上。

1.1 创建Ubuntu虚拟机

使用VMware创建Ubuntu虚拟机。注意记住创建的用户和密码

参考:VMware 虚拟机图文安装和配置 Ubuntu Server 22.04 LTS 教程_00-installer-config.yaml-CSDN博客

1.2 安装NATAPP内网穿透工具

用于提供Maven私仓的外网地址。

NATAPP1分钟快速新手图文教程 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 参考官方文档:NATAPP1分钟快速新手图文教程 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具

1.3 安装 JDK8

参考:Linux开发环境搭建(二)之安装JDK和Maven_amazon linux2 安装java-CSDN博客 

1.4 安装 Nexus

下载

Nexus3.x官网

Unix 3.54.1版本:unix或者linux下载
提取码:tymn

解压
tar -zxvf nexus-3.54.1-01-unix.tar.gz -C /home/mlj/soft/Nexus/
修改环境变量
vi /etc/profile
export NEXUS_HOME=/home/hsp/data/Nexus/nexus-3.54.1-01
export PATH=$NEXUS_HOME/bin
source /etc/profile
启动nexus

进入路径/home/mlj/soft/Nexus/nexus-3.54.1-01/bin执行

./nexus start

默认端口为8081,访问ip:8081进去,按照步骤填写密码,修改密码。

注意:用户名和密码谨慎填写,需要记住,后面项目中要使用

启动natapp

设置映射端口为8081,启动natapp,访问日志打印的域名就进入了nexus控制台

关于nexus控制台的学习可以参考如下文档:

使用Nexus在Ubuntu环境下搭建Maven私服_ubuntu 安装 nexus-CSDN博客

1.5 配置Nexus私库地址

修改Maven settings文件

<servers>
    <!-- 这是配置访问私有仓库的用户名密码 -->
    <server>
      <!-- id标签可以随便填,只需要在servers中唯一即可,后面很多地方会使用该id -->
      <id>self-maven</id>
      <username>nexus</username>
      <password>deplyment123</password>
    </server>
</servers>   

<profiles>
	<profile>
        <id>nexus</id>
        <!--声明一个或多个远程仓库  -->
		<repositories>
			<!-- 声明一个 Nexus 私服上的仓库  -->
			<repository>
				<!--仓库id,这个id就是上面配置的账号密码id  -->
				<id>self-maven</id>
				<!-- 仓库的名称 -->
				<name>nexus</name>
				<!--仓库的地址  修改为natapp动态域名-->
				<url>http://localhost:8081/repository/maven-public/</url>
				<!-- 是否开启该仓库的 release 版本下载支持 -->
				<releases>
					<enabled>true</enabled>
				</releases>
				<!-- 是否开启该仓库的 snapshot 版本下载支持 -->
				<snapshots>
					<enabled>true</enabled>
				</snapshots>
			</repository>
		</repositories>
		<!-- 声明一个或多个远程插件仓库 修改为natapp动态域名 -->
		<pluginRepositories>
			<!--声明一个 Nexus 私服上的插件仓库  -->
			<pluginRepository>
				<!--插件仓库 id -->
				<id>self-maven</id>
				<!--插件仓库 名称 -->
				<name>nexus</name>
				<!-- 配置的插件仓库的地址 -->
				<url>http://localhost:8081/repository/maven-public/</url>
				<!-- 是否开启该插件仓库的 release 版本下载支持 -->
				<releases>
					<enabled>true</enabled>
				</releases>
				<!-- 是否开启该插件仓库的 snapshot 版本下载支持 -->
				<snapshots>
					<enabled>true</enabled>
				</snapshots>
			</pluginRepository>
		</pluginRepositories>
          <properties>
              <maven.compiler.source>1.8</maven.compiler.source>
              <maven.compiler.target>1.8</maven.compiler.target>
              <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
          </properties>
	<!-- 默认该profile生效 -->
          <activation>
              <activeByDefault>true</activeByDefault>
          </activation>
      </profile>
</profiles>       

 修改项目中pom文件,主要用于依赖上传

<distributionManagement>
        <repository>
            <!--注意这个id一定要填写我们maven的setting.xml当中配置的id-->
            <id>self-maven</id>
            <url>http://i97e4t.natappfree.cc/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <!--注意这个id一定要填写我们maven的setting.xml当中配置的id-->
            <id>self-maven</id>
            <url>http://i97e4t.natappfree.cc/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

部署测试:

mvn deploy -Dmaven.test.skip=true

刷新nexus控制台能看到依赖已上传:

测试下载:

 <dependency>
        <groupId>com.xx</groupId>
        <artifactId>xx-common</artifactId>
        <version>1.2.1-SNAPSHOT</version>
 </dependency>

报错:Since Maven 3.8.1 http repositories are blocked

解决:

使用私服作为mirrors,如果maven是3.8.1+的版本,会提示:Since Maven 3.8.1 http repositories are blocked。3.8.1版本开始,处于安全考虑,maven禁用了http的镜像仓库,但是我们安装的私服通常都是http的地址,所以报这个错误。

将setting里下面配置注释掉:

<mirrors>
    	<mirror>
			  <id>maven-default-http-blocker</id>
			  <mirrorOf>dummy</mirrorOf>
			  <name>Dummy mirror to override default blocking mirror that blocks http</name>
			  <url>http://0.0.0.0/</url>
			  <blocked>true</blocked>
		</mirror>
	</mirros>

参考:【有手就行】:从无到有搭建个人Maven私有仓库_maven搭建私有仓库-CSDN博客 

二、Jenkinsfile分包部署脚本

背景:springboot项目模块太多,主项目只有一个,每次修改代码需要编译所有模块会浪费资源,也会导致jenkins构建很慢,后面考虑优化成增量部署,可选择修改过的模块进行编译部署,没改过的从私仓拉取,最后对主项目进行打包即可。

项目结构:

思路:

  • 对基础模块进行编译部署上传私仓,包括业务模块的api(因为可能会引用业务模块的api)
  • 对业务模块的biz进行编译部署上传私仓
  • 对server启动类模块打包,不上传私仓

2.1 Jenkinsfile修改

#!groovy
pipeline {

    agent any

    environment {
        // DockerHub 凭证 ID(登录您的

        DOCKER_CREDENTIAL_ID = 'dockerhub-id'
        //  GitHub 凭证 ID (推送 tag 到 GitHub 仓库)
        //         GITHUB_CREDENTIAL_ID = 'github-id'
        // kubeconfig 凭证 ID (访问接入正在运行的 Kubernetes 集群)
        KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
        // 镜像的推送
        REGISTRY = 'docker.io'
        //  DockerHub 账号名
        DOCKERHUB_NAMESPACE = 'docker_username'
        // GitHub 账号名
        //         GITHUB_ACCOUNT = 'https://gitee.com/zhijiantianya/ruoyi-vue-pro'
        // 应用名称
        APP_NAME = 'hbintrade-server'
        // 应用部署路径
        APP_DEPLOY_BASE_DIR = '/var/jenkins_home/workspace/'
        //         /var/jenkins_home/workspace/hbintrade-framework
        def SERVER_NAME = "$project_name"
        def BASIC_MODULE_NAME = "$basic_module_name"
        def BUSINESS_MODULE_NAME = "$business_module_name"
    }


    stages {
        stage('打印信息') {      //打印信息
            steps {
                echo '变量打印信息'
                echo "Project_Pipeline_name: $JOB_NAME"
                echo "BASIC_MODULE_NAME: $BASIC_MODULE_NAME"
                echo "BUSINESS_MODULE_NAME: $BUSINESS_MODULE_NAME"
                echo "SERVER_NAME: $SERVER_NAME"
                echo "workspace: $WORKSPACE"
                echo "branch: $branch_name"           //gitlab分支名
                echo "build_id: $BUILD_ID"
// 			echo "target_action: $action"
                //                 echo "registryUrl: $registryUrl"
                //                 echo "image_repository: $registryUrl/$Project_name"
            }
        }
        stage('检出') {
            steps {
                git credentialsId: 'xxx', url: 'https://gitee.com/xxx/xxx-framework.git',
                        branch: "$branch_name"
            }
        }

        stage('构建') {
            steps {
//			echo "跳过构建!!! "
//                sh 'mvn deploy -Dmaven.test.skip=true'
                script {
                    // 使用 replace 方法去除双引号
                    def BASIC_MODULE_NAME_STR = BASIC_MODULE_NAME.replace("\"", "")
                    def BUSINESS_MODULE_NAME_STR = BUSINESS_MODULE_NAME.replace("\"", "")
                    def SERVER_NAME_STR = SERVER_NAME.replace("\"", "")

                    if (BASIC_MODULE_NAME_STR != '') {
                        for (item in BASIC_MODULE_NAME.tokenize(',')) {
                            echo "开始构建基础模块并上传到maven私仓 " + item
                            END_STR = item[-3..-1]
                            if ("$END_STR" == "api") {
                                sh 'cd ' + item[0..-5] + ' && mvn deploy -pl ' + item + ' -Dmaven.test.skip=true'
                            } else {
                                sh 'mvn deploy -pl ' + item + ' -Dmaven.test.skip=true'
                            }
                        }
                    }

                    if (BUSINESS_MODULE_NAME_STR != '') {
                        for (item in BUSINESS_MODULE_NAME.tokenize(',')) {
                            echo "开始构建业务模块并上传到maven私仓 " + item + '-biz'
                            sh 'cd ' + item + ' && mvn deploy -pl ' + item + '-biz -Dmaven.test.skip=true'
                        }
                    }

                    if (SERVER_NAME_STR != '') {
                        for (item in SERVER_NAME.tokenize(',')) {
                            echo "开始打包主项目" + item
                            sh 'mvn clean package -pl ' + item + ' -Dmaven.test.skip=true'
                        }
                    }
                }
            }
        }

        stage('部署') {
            steps {
                sh 'cp -f ' + ' script/shell/deploy.sh ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/'
                sh 'cp -f ' + "${env.APP_NAME}" + '/target/*.jar ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/build/'
                archiveArtifacts "${env.APP_NAME}" + '/target/*.jar'
                sh 'chmod +x ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh'
                sh 'bash ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh'
            }
        }
    }
}

注意:部署业务模块时,由于项目结构不同,需要进入 业务模块目录内执行构建,否则找不到业务模块的api子模块。

问题:groovy.lang.MissingPropertyException: No such property: Missing for class: Script3

解决:Jenkins里Quote Value勾选,Jenkinsfile获取变量值后要去除引号

2.2 idea 格式化Jenkins

Jenkinsfile是Groovy语言编写的,写Jenkinsfile过程中发现idea没办法对Jenkinsfile格式化,需要设置一下。

打开idea -> 设置 -> File Types -> Groovy ->添加新的文件类型,即添加上Jenkinsfile即可

三、Jenkins多参数配置

注意:参数name与Jenkins里面保持一致,Quote Value勾选否则不选择模块的话会报错“变量未定义”,选择后Jenkins里面处理参数值,去除双引号。具体参考Jenkinsfile

3.1 Jenkins项目参数配置

basic_module_name基础模块配置

business_module_name业务模块

 project_name主项目

3.2 选择需要的模块构建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892707.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LinkedList和链表(上)

1. 顺序表ArrayList的缺点和优点 优点: 1> 在给定下标进行查找的时候,时间复杂度是O(1) 缺点: 1> 插入数据必须移动其他数据,最坏情况下,插入到0位置,时间复杂度为O(N) 2> 删除数据也需要移动数据,最坏情况下,就是删除0位置.时间复杂度为O(N) 3> 扩容之后(1.5倍扩容…

《深度学习》OpenCV 物体跟踪 原理及案例解析

目录 一、物体跟踪 1、什么是物体跟踪 2、步骤 1&#xff09;选择跟踪算法 2&#xff09;初始化跟踪器 3&#xff09;在每个视频帧上执行跟踪 4&#xff09;可选的重新初始化 3、原理 二、案例实现 1、完整代码 1&#xff09;使用方式 2&#xff09;运行结果 2、关…

麒麟桌面版v10 SP1以docker方式安装达梦数据库

安装docker 0.切换root用户&#xff08;可以不切换&#xff0c;但要注意权限问题&#xff0c;我是用root&#xff09; ymym-pc:~/桌面$ whoami ym ymym-pc:~/桌面$ sudo -i rootym-pc:~# whoami root rootym-pc:~# 1.查看系统版本 [rootlocalhost opt]# cat /etc/os-release…

java类和对象(上)

前言&#xff1a; 不知道大家有没有将java方法的使用熟记入心呢&#xff1f;如果没有的话&#xff0c;可以打开博主的上一篇博文阅读哦&#xff0c;在这里谢谢大家一路的陪伴。也希望我的内容能够帮到你更快的掌握java语言的学习。接下来我们要讲的是java类和对象。让我们整理…

最新Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版图文教程

CleanMyMac X mac版下载是一款功能更加强大的系统优化清理工具&#xff0c;软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。CleanMyMac X for mac相比于 CleanMyMac3来说&#xff0c;功能增加了不少&#xff0c;比如新增…

Java并发 - AQS之CountDownLatch

文章目录 基本使用源码分析awaitcountDowngetCount 可重置的CountDownLatch总结 CountDownLatch是一个多线程同步工具类&#xff0c;允许一个或多个线程等待&#xff0c;直到在其他线程中执行的一组操作完成。主要用来解决一个线程或多个线程等待另外多个线程的场景。 初始化需…

在Linux中搭建WordPress并实现Windows主机远程访问

WordPreWordPress是一个基于PHP开发的开源平台&#xff0c;适用于在支持PHP与MySQL数据库的服务器上搭建个性化博客或网站。同时&#xff0c;它也能够作为功能强大的内容管理系统&#xff08;CMS&#xff09;被广泛应用。 虚拟机&#xff1a;VirtualBox 虚拟机安装&#x1f449…

win10中mysql数据库binlog恢复

win10中mysql数据库binlog恢复 昨天有朋友江湖救急&#xff0c;说测试库里的表不小心删除更新了数据。这里也复习下binlog数据恢复&#xff0c;当然需要一定的条件&#xff1a;首先mysql开启binlog&#xff0c;然后每天需要备份对应的数据库 1 单库单表准备 在恢复数据前&am…

QT开发--文件的读写操作

第十三章 文件的读写操作 Qt提供两种读写纯文本文件的方法&#xff1a; 1、直接使用 QFile 类的IO功能&#xff1b; 2、结合 QFile 和 QTextStream&#xff0c;利用流(Stream)进行操作。 13.1 文件读操作 13.1.1 使用QFile类 Qt封装了QFile类&#xff0c;方便我们对文件进行操…

鸿蒙OS启动流程

启动流程(基于openharmony4.1) 系统上电加载内核后&#xff0c;按照以下流程完成系统各个服务和应用的启动&#xff1a; 内核加载init进程&#xff0c;一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后&#xff0c;会挂载tmpfs&#xff0c;…

bat脚本banenr

飞出个未来班得 echo off echo .-. echo ( ) echo - echo J L echo ^| ^| echo J L echo ^| ^| echo J L echo …

MySQL-表相关(DDL DML)

文章目录 表的基本操作表的创建表的删除 MySQL中的数据类型整数类型浮点数类型定点数类型日期和时间类型字符串类型charvarchartext 二进制类型 DDL语句查看建表语句修改表名新增字段修改字段(名类型)修改字段(仅类型)删除字段 DML语句insert 增delete 删truncate 语句update 改…

前端学习-CSS的三大特性(十七)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 层叠性 继承性 行高的继承性 优先级 优先级注意点 权重叠加 总结 前言 引入css特性的学习 CSS 有三个非常重要的三个特性:层叠性、继承性、优先级。 层叠…

Android 第5种启动模式:singleInstancePerTask

Android 第5种启动模式&#xff1a;singleInstancePerTask 随着 Android 版本的更新&#xff0c;应用启动模式逐渐丰富。在 Android 12 中&#xff0c;新增了一种启动模式——singleInstancePerTask。它是继 standard、singleTop、singleTask 和 singleInstance 之后的第五种启…

纯css 轮播图片,鼠标移入暂停 移除继续

核心 滚动&#xff1a; animation: 动画名称 20s linear infinite normal;停止&#xff1a; animation: 动画名称 20s linear infinite paused; 完整例子&#xff1a; html: <div class"carousel-wrapper"><div class"carousel"><div cl…

chrome浏览器映射端口

chrome://inspect/#devices 方法2

mysql主从复制及故障修复

一、主MySQL数据库的配置 分别在三台主机&#xff08;chen2/10.110、chen3/10.120、chen4/10.130)中安装mysql数据&#xff0c;其中chen2/10.110作为主MySQL服务器&#xff0c;其余两台作为从MySQL服务器。 1、在主机上部署mysql数据库 详细的请看上一篇&#xff1a;mysql数据…

NewStarCTF2024-Week2-Web-WP

目录 1、复读机 2、你能在一秒内打出八句英文吗 3、遗失的拉链 4、谢谢皮蛋 plus 5、PangBai 过家家&#xff08;2&#xff09; 1、复读机 测了下存在 ssti 没什么说的 fenjing 秒了 2、你能在一秒内打出八句英文吗 每次出来的需要提交的内容都不一样 exp&#xff1a; …

CUDA 全局内存

全局内存在片外。 特点是&#xff1a;容量最大、延迟最大、使用最多 全局内存中的数据是所有线程可见的&#xff0c;Host端可见&#xff0c;且具有与程序相同的生命周期 动态全局内存 主机代码使用CUDA运行时API &#xff1a; cudaMalloc 声明内存空间&#xff1b; cudaFree…

MySQL【知识改变命运】07

MySQL 1&#xff1a;Group by 分组查询1.1&#xff1a;语法&#xff1a;1.2&#xff1a;练习 2&#xff1a;having⼦句3回顾&#xff1a;3&#xff1a;内置函数3.1 :⽇期函数 1&#xff1a;Group by 分组查询 可以根据某列&#xff0c;进行分组查询&#xff0c;比如学校里面的…