【k8s】Jenkins实现springcloud应用CI、CD实践 【三】【待写】

news2025/1/11 6:10:43

一、运行Jenkins流水线流程思路:

场景:java微服务应用, 单体仓库,多个微服务模块,(并行构建、自动化构建、根据模块变更仅更新特定模块)    java、nodejs

CI阶段          并行方式; 根据模块变更仅更新特定模块
1、准备项日;
	目录结构 (源代码 、dockerfile 、deploy.yaml资源清单文件)
2、下载代码
3、漏洞检测;
4、项目编译;
5、镜像制作;
6、部署测试环境;

CD阶段:
1、拉取harbor中的镜像;
2、交付到生产环境;
3、添加回退阶段;

二、部署springcloud 若依项目

本文不做详细的部署细节,可参考以前的写的: https://blog.csdn.net/Nightwish5/article/details/130308650
在这里插入图片描述

1、准备项目;
			目录结构   (源代码、Dockerfile、deploy.yaml资源清单文件)
			deploy.yaml中要替换的变量:
			{namespace}
			{image}
		
			ui  {host}
			monitor    {host}    ingress
	
		前置条件:
			1、harbor.oldxu.net/springcloud/skywalking-java-agent:8.8
			2、依赖的MySQL、Redis、Skywalking、Nacos(配置)得有;
		
		ruoyi-gateway-dev.yml
		ruoyi-auth-dev.yml
		
		ruoyi-monitor-dev.yml
		ruoyi-system-dev.yml
		
		1、提交代码到gitlab
		2、下载代码

大致说明:

部署基础组件: ruoyi的springcloud部署顺序
1、mysql (若依项目的DB库)
2、redis
3、nacos 、 mysql(nacos依赖的库)
配置nacos中的对应的yml文件

4、sentinel  
5、skywalking (oap和ui)

#part 6可以在CICD过程中部署
6、service-all
  1、system-dp
  2、auth-dp
  3、gateway-dp
  4、monitor-dp-ingress
  5、ui-dp-ingress

三、将代码提交到gitlab

gitlab创建项目:RuoYiCloud

git init 

git config --global user.email "123456@qq.com"
git config --global user.name  "old133"

git  remote add origin http://gitlab.oldxu.net:30080/root/ruoyicloud.git
git add .
git commit -m "初始化"

git checkout -b k8s
git push --set-upstream origin k8s


#方式2:
代码上传到gitee , gitlab导入项目 -> 从URL导入仓库

四、创建流水线 springcloud-ruoyi-CI

2、下载代码
		3、漏洞检测;
		
			并行;
			进入到对应的微服务文件夹中;
			不规则的,需要再cd进个子目录:
			cd ruoyi-monitor
			cd ruoyi-system

在这里插入图片描述

4.1 获取代码和代码扫描和漏洞扫描结果

pipeline{
    agent {
    kubernetes {
      cloud 'kubernetes'
      yaml '''
        apiVersion: v1
        kind: Pod
        spec:
          imagePullSecrets:
          - name: harbor-admin
          volumes:
          - name: data
            nfs:
              server: 192.168.79.33
              path: /data/maven
          - name: dockersocket
            hostPath:
              path: /run/docker.sock
          containers:
          - name: maven
            image: harbor.oldxu.net/ops/maven:3.8.6
            imagePullPolicy: IfNotPresent
            command: ["cat"]
            tty: true
            volumeMounts:
            - name: data
              mountPath: /root/.m2
          - name: nodejs
            image: harbor.oldxu.net/ops/nodejs:14.20
            imagePullPolicy: IfNotPresent
            command: ["cat"]
            tty: true
          - name: sonar
            image: harbor.oldxu.net/ops/sonar-scanner:2.3.0
            imagePullPolicy: IfNotPresent
            command: ["cat"]
            tty: true
          - name: docker
            image: harbor.oldxu.net/ops/docker:20.10
            imagePullPolicy: IfNotPresent
            command: ["cat"]
            tty: true
            volumeMounts:
            - name: dockersocket
              mountPath: /run/docker.sock
          - name: kubectl
            image: harbor.oldxu.net/ops/kubectl:1.18.0
            imagePullPolicy: IfNotPresent
            command: ["cat"]
            tty: true
      '''
    } //kubernetes ned
  }	//agent end

		environment{
			Gitlab_Id = "gitlab-root-token"
			Gitlab_Pro = "http://gitlab.oldxu.net:30080/root/ruoyi-cloud.git"
			
		} //environment end
		
		stages{
		    
			stage('获取代码'){
				steps{
					container('maven'){
					   //注意这里的分支是k8s
					   checkout([$class: 'GitSCM', branches: [[name: '*/k8s']], extensions: [], userRemoteConfigs: [[credentialsId: "${Gitlab_Id}", url: "${Gitlab_Pro}"]]])
                       sh 'pwd && ls -l'
					
					}
				}
			
			} //获取代码 end
			
			stage('代码扫描'){
				//并行处理
				parallel{
				    // 1 检测Gateway
					stage('检测Gateway'){
						environment{
							AppName="ruoyi-gateway"
						}
						
						steps{
							withSonarQubeEnv('sonar-k8s'){
								container('sonar'){
									sh ' cd $(find ./ type -d -name "${AppName}") && \
										sonar-scanner \
										-Dsonar.projectKey=${AppName} \
										-Dsonar.java.binaries=src \
										-Dsonar.sources=.'
								}
							}
						}
					}
					
					// 2 Auth
					stage('检测Auth'){
						environment{
							AppName="ruoyi-Auth"
						}
						
						steps{
							withSonarQubeEnv('sonar-k8s'){
								container('sonar'){
									sh ' cd $(find ./ type -d -name "${AppName}") && \
										sonar-scanner \
										-Dsonar.projectKey=${AppName} \
										-Dsonar.java.binaries=src \
										-Dsonar.sources=.'
								}
							}
						}
					}
					
					// 3 system
					stage('检测system'){
						environment{
							AppName="ruoyi-system"
						}
						
						steps{
							withSonarQubeEnv('sonar-k8s'){
								container('sonar'){
									sh ' cd $(find ./ type -d -name "${AppName}") && \
										sonar-scanner \
										-Dsonar.projectKey=${AppName} \
										-Dsonar.java.binaries=src \
										-Dsonar.sources=.'
								}
							}
						}
					}
					
					// 4 monitor
					stage('检测monitor'){
						environment{
							AppName="ruoyi-monitor"
						}
						
						steps{
							withSonarQubeEnv('sonar-k8s'){
								container('sonar'){
									sh ' cd $(find ./ type -d -name "${AppName}") && \
										sonar-scanner \
										-Dsonar.projectKey=${AppName} \
										-Dsonar.java.binaries=src \
										-Dsonar.sources=.'
								}
							}
						}
					}
					
					// 5 UI
					stage('检测UI'){
						environment{
							AppName="ruoyi-ui"
						}
						
						steps{
							withSonarQubeEnv('sonar-k8s'){
								container('sonar'){
									sh ' cd $(find ./ type -d -name "${AppName}") && \
										sonar-scanner \
										-Dsonar.projectKey=${AppName} \
										-Dsonar.java.binaries=src \
										-Dsonar.sources=.'
								}
							}
						}
					}
					
				}//parallel end					
			} //代码扫描 stage end
			
			
			stage('检查漏洞扫描结果'){
				steps{
					container('sonar'){
						script{
							timeout(5){
								def qg = waitForQualityGate()
								if (qg.status != 'OK'){
									error "Sonarqube 代码检查失败, error的原因 ${qg.status}"
								}
							}
						}
					}
				}
			
			}//检查漏洞扫描结果 stage end
			
			
		}//stages end

}//pipeline end

在这里插入图片描述

五、项目编译(maven和nodejs)

#思路:
也是要并行构建
				Java:
					找到这个微服务模块的路径 (使用刚才的find方法)
					mvn package -Dmaven.test.skip=true -pl ${模块路径} -am
				NodeJS:
				npm install --registry=https://registry.npmmirror.com
				npm run build:prod
				

maven编译举例:
在这里插入图片描述

5.1 对应的pipeline代码:

		stages{
		    			
			stage('代码编译'){
				parallel{
					// 1、编译Gateway
					stage('编译Gateway'){
						environment{
							AppName = "ruoyi-gateway"
						}
						
						steps{
							container('maven'){
								sh '''
									Build_Path=$(find ./ -type d -name "${AppName}")
									mvn package -Dmaven.test.skip=true -pl ${Build_Path} -am
								'''
							}
							
						}
					}
					
					// 2、编译Auth
					stage('编译Auth'){
						environment{
							AppName = "ruoyi-auth"
						}
						
						steps{
							container('maven'){
								sh '''
									Build_Path=$(find ./ -type d -name "${AppName}")
									mvn package -Dmaven.test.skip=true -pl ${Build_Path} -am
								'''
							}							
						}
					}
					
					// 3、编译system
					stage('编译system'){
						environment{
							AppName = "ruoyi-system"
						}
						
						steps{
							container('maven'){
								sh '''
									Build_Path=$(find ./ -type d -name "${AppName}")
									mvn package -Dmaven.test.skip=true -pl ${Build_Path} -am
								'''
							}							
						}
					}
					
					// 4、编译monitor
					stage('编译monitor'){
						environment{
							AppName = "ruoyi-monitor"
						}
						
						steps{
							container('maven'){
								sh '''
									Build_Path=$(find ./ -type d -name "${AppName}")
									mvn package -Dmaven.test.skip=true -pl ${Build_Path} -am
								'''
							}							
						}
					}
					
					// 5、编译UI
					stage('编译UI'){
						environment{
							AppName = "ruoyi-ui"
						}
						
						steps{
							container('nodejs'){
								sh '''
									cd $(find ./ -type d -name "${AppName}") && \
									npm install --registry=https://registry.npmmirror.com && \
									npm run build:prod
								'''
							}							
						}
					}
					
				} // parallel end
			}//代码编译 stage end
			
		}//总stages end

运行结果:
在这里插入图片描述

六、制作Docker镜像

6.1 对应的pipeline代码


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

港联证券|标普500指数年内涨逾9%,美股牛市已至?

今年以来,美国标普500指数累计上涨超过9%,这引发了一场关于美股牛市是否已经到来的辩论。 持悲观态度的摩根士丹利股票策略师威尔逊(Michael Wilson)警告称,最近的反弹不过是一种假象。而美国银行的萨勃拉曼尼亚&#…

四、数据仓库详细介绍(规范)

大家好,这是数据仓库系列的第三个话题,排序在架构之后、建模之前。为什么会提的这么靠前呢? 因为规范约束的是数仓建设的全流程,以及后续的迭代和运维。事实上,数仓规范文档,应该随着架构设计文档&#xf…

chatgpt赋能Python-python_lambdify

Python Lambdify: 一个方便的数学表达式转换工具 Python是一种广泛使用的编程语言,适用于各种领域,如数据科学、机器学习和科学计算等。在这些领域中,数学表达式起到了至关重要的作用,而Python Lambdify(简称为“lamb…

计算机操作系统(慕课版)第四章课后题答案

一、简答题 1.什么是临界资源?什么是临界区? 临界资源:以互斥形式访问的资源;临界区:访问临界资源的代码。 2.同步机制应遵循的准则有哪些? 空闲让进;忙则等待;有限等待&#xff1b…

Windows本地快速搭建SFTP服务共享文件【外网访问】

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#xff0…

数据结构与算法-单调栈1

先介绍一下单调栈是什么 一种特别设计的栈结构,为了解决如下的问题: 给定一个可能含有重复值的数组arr,i位置的数一定存在如下两个信息 1)arr[i]的左侧离i最近并且小于(或者大于)arr[i]的数在哪? 2)arr[…

买法拍房注意事项

1、查清法拍房房屋属性。 竞拍前需查清楚法拍房的使用年限、能否办理房产证、土地性质等。 若土地为划拨属性,房屋可能需补缴土地出让金,该费用最好提前咨询当地不动产登记中心了解。 2、产权是否涉及二次过户。 二次过户指的是房屋已经过2次交易&…

苦卷一个月,P9大佬给我的Alibaba面试手册,终于成功踹开字节大门

怎么说呢,今年真的是寒气逼人啊!在这个大环境下,裁员已经不算是特别的事情,粗暴裁员也许是未来一种趋势…在职的卷的起飞,离职的找不到好工作。 做点能做的:跑跑步骑骑车多锻炼;当当上面正版书…

分布式全局唯一id实现-2 springCloud-MyBatis-Plus集成百度分布式全局id(uid-generator)

前言:MyBatis-Plus 集成百度的uid-generator ,实现业务实体在insert 实体时,可以自动获取全局id,完成数据保存; 1 uid-generator 全局id 生成的方式了解: Snowflake算法描述:指定机器 & 同…

如何避免孩子独自在家偷偷使用电脑?

电脑为我们的生活带来了极大的便利,但是对于孩子来说,过早的接触网络很容易影响其健康的成长。家长在家的话,还可以监督孩子,但如果家长出门了,该如何避免孩子偷偷使用电脑呢?其实方法很简单,只…

网络进阶学习:交换机二层

交换机二层 交换机的概念和作用交换机的划分交换机第二层的内容⭐第一部分:MAC地址⭐第二部分:逻辑链路控制子层⭐第三部分:介质访问控制子层⭐第四部分:交换机转发表⭐第五部分:VLAN⭐第六部分:STP 交换机…

Hudi系列25: Flink SQL使用checkpoint恢复job异常

文章目录 一. 通过Flink SQL将MySQL数据写入Hudi二. 模拟Flink任务异常2.1 手工停止job2.2 指定checkpoint来恢复数据2.3 整个yarn-session上的任务恢复 三. 模拟源端异常3.1 手工关闭源端 MySQL 服务3.2 FLink任务查看 FAQ:1. checkpoint未写入数据2. checkpoint 失败3. 手工取…

自然语言处理技术简介

长期以来,研究人员进行自然语言处理研究主要依赖各种机器学习模型,以及手工设计的特征,但这样做带来的隐患是由于语言信息被稀疏表征表示,会出现维度诅咒之类的问题。而随着近年来词嵌入(低维、分布式表征)…

港联证券|A股船舶板块景气反转即将到来

在经历了去年的爆发后,2023年的中国造船业仍然处在订单交付两旺的高度景气周期之中。 5月22日,中国船舶集团有限公司旗下沪东中华造船(集团)有限公司宣布交付全球最大级别24116TEU超大型集装箱船系列3号船“地中海吉玛”号。据报道…

3D 对象转换器应该如何将 OBJ 转换为 FBX ?

Aspose.3D 是一个功能丰富的游戏软件和计算机辅助设计(CAD)的API,可以在不依赖任何3D建模和渲染软件的情况下操作文档。API支持Discreet3DS, WavefrontOBJ, FBX (ASCII, Binary), STL (ASCII, Binary), Universal3D, Collada, glTF, GLB, PLY…

SpringMVC框架理解

JavaEE体系结构包括四层,从上到下分别是应用层、Web层、业务层、持久层。Struts和SpringMVC是Web层的框架,Spring是业务层的框架,Hibernate和MyBatis是持久层的框架。 为什么要使用SpringMVC? 很多应用程序的问题在于处理业务数据…

一对一项目指导,在线购物网站webform+SQLServer技术架构

我是Tom老师,10开发经验, 我先后在携程网、陆金所,两家互联网和金融行业领头公司 担任高级开发工程师, 技术深厚,开发经验丰富,认真负责。 我现在专门做一对一编程辅导。 希望我的专业辅导,…

02数字图像基础

文章目录 2数字图像基础2.4图像取样和量化2.4.4图像内插 2.5像素间的一些基本关系2.5.1相邻像素2.5.2邻接性、连通性、区域和边界2.5.3距离度量 2.6 数字图像处理2.6.1阵列和矩阵操作2.6.2线性操作和非线性操作2.6.3算术操作2.6.5空间操作2.6.6向量与矩阵操作2.6.7图像变换2.6.…

架构演变之路

一)单机架构: 一)定义:应用服务和数据库服务器共用一台服务器,所有的服务被部署到一台服务器上面 蓝色的就是我们写的JAVA代码用户服务负责用户的登录和注册,商品服务用于商品的购买和交易,交易模块用于用户的下单和购买,在数据库…

周赛 Round#3 题解

又不能放图片,又不能写学校,你让我怎么办啊!! 系列文章目录 1.周赛 Round#1 2.周赛 Round#2 前言 这是周赛第三轮。//涉及隐私原因,博文里不放题目,要看的去http://0241:101:610:801.22222 划分字符串贪…