当前位置: 首页 > news >正文

K8S + Jenkins 做CICD

前言

这里会做整体CICD的思路和流程的介绍,会给出核心的Jenkins pipeline脚本,最后会演示一下 实验/实操 结果
由于整体内容较多,所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用
要看保姆式教学的可以划走了,没有K8S基础的也可以划走了

正文

1. 整体实现思路

  1. 在K8S集群中部署Jenkins服务(我这里实验用的是 Jenkins 2.486版本),给Jenkins分配对应的NFS、PV、PVC、SA、NS、SVC等资源,挂载Jenkins配置文件到服务器
  2. 在Jenkins中安装 kubernetes、blue ocean 插件
  3. 配置Jenkins和K8S集群正常通信
  4. 配置 pod template - 这里的 pod template 实际上就是对 Jenkins agent(以前叫 Jenkins slave) 的配置,用于完成git代码拉取、mvn打包、docker镜像上传等操作
  5. 新建流水线任务,加入自己的pipeline脚本

CICD流程:

  1. 开发提交代码到代码仓库 gitlab/github/gitee - 我这里用的github
  2. 开启任务 -> jenkins 检测到代码更新,调用 k8s api 在 k8s 中创建 jenkins slave pod
  3. Jenkins slave pod 拉取代码,通过 maven 把拉取的代码进行构建成 war 包或者 jar 包,上传代码到 Sonarqube,进行静态代码扫描
  4. 基于 jar 包构建 docker image,把镜像上传到镜像仓库 harbor 或 dockerhub - 我这里用的 dockerhub
  5. 基于镜像部署应用到开发环境
  6. 开发人员自测通过,在blue ocean 流水线中操作,发布到测试环境
  7. 测试团队测试通过,发布到生产环境

2. 插件简介

2.1 Kubernetes插件简介

Kubernetes 插件的目的是能够使用 Kubernetes 配合,实现动态配置 Jenkins 代理(使用 Kubernetes 调度机制来优化负载),在执行 Jenkins Job 构建时,Jenkins Master 会在 kubernetes 中创建一个 Slave Pod 代理来执行任务。
该 Slave Pod 中可以包含多种镜像,例如需要 Maven 编译可以使用 Maven 镜像执行任务。使用 NPM编译则可以使用 NPM镜像。操作 Kubernetes 可以使用 Kubectl 插件镜像。
所有 Job 中所需要的环境及其依赖都交由镜像提供,而不需要手动搭配这些环境。在 Slave Pod 执行完 Job 任务后,该Slave Pod将会自动删除。所以 Kubernetes Plugin 简单用法就是,在 Kubernetes 中启动 Jenkins Slave 代理,让代理执行 Jenkins Job,执行完后释放删除 Slave 释放资源。

Kubernetes插件使用 - Kubernetes Plugin的配置主要有两部分组成:

  • kubernetes的连接参数:主要用于配置如果连接kubernetes
  • kubernetes的pod模板:调用kubernetes创建jenkins slave使用的pod模板

在这里插入图片描述

2.2 Blue Ocean 插件简介

Blue Ocean 是 Jenkins 的一款现代化 UI 插件,旨在为持续集成/持续交付 (CI/CD) 提供更加直观、用户友好的界面和体验。

  • 全新的可视化流水线体验
    • Blue Ocean 提供了流水线运行过程的直观可视化,用户可以清晰地查看流水线的各个阶段(stage)、步骤(step)及其状态(成功、失败、运行中)。
    • 支持图形化展示流水线的分支、并行任务及错误点,便于快速诊断和调试。
  • 简化的流水线创建和编辑
    • 内置交互式流水线编辑器,支持通过拖放操作创建 Jenkinsfile,降低了学习曲线。
    • 用户无需编写复杂的脚本即可快速配置和生成流水线代码。
  • 强大的分支支持
    • 专为 Git 和其他分布式版本控制系统的多分支流水线设计。
    • 自动检测代码仓库中的分支和 Pull Request,独立运行每个分支的流水线任务。
  • 高效的协作能力
    • 在失败的任务或构建上添加评论,方便团队成员进行问题协作和修复。
    • 支持通过直观的界面查看构建日志、失败原因以及历史记录。
  • 插件生态集成
    • 与 Jenkins 的现有插件(如 Git、GitHub、Bitbucket、Docker 等)无缝集成。
    • 支持各种通知机制(如邮件、Slack、Webhook)来增强 CI/CD 流程。
  • 跨平台友好
    • 适配桌面端和移动端,用户可以随时随地查看流水线状态。
      在这里插入图片描述

3. pipeline脚本示例

env.BRANCH_NAME = 'master'
node('devops') {stage('Clone') {echo "1.下载代码"withCredentials([usernamePassword(credentialsId: 'github', usernameVariable: 'gitHubUser', passwordVariable: 'gitHubToken')]) {git url: "https://${gitHubUser}:${gitHubToken}@github.com/cqweiheng/myspringboot.git"}script {build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()}}stage('Test') {echo "2.代码扫描"}stage('Build') {echo "3.构建docker镜像"	// 执行 Maven 构建,生成 jar 文件sh 'mvn clean package -Dmaven.test.skip=true'// 打包成镜像sh "docker build -t cqweiheng/test:myspringboot-${build_tag} ."}stage('Push') {echo "4.推送镜像"withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"// 这里可以改用 harbor//sh "docker login 192.168.86.100 -u ${harborUser} -p ${harborPassword}"sh "docker push cqweiheng/test:myspringboot-${build_tag}"}}stage('Deploy to dev') {echo "5.发布到 dev 环境"sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev.yaml"sh "cat k8s-dev.yaml"sh "kubectl apply -f k8s-dev.yaml"sh "sleep 10"sh "kubectl get pods -n dev"}	stage('Deploy to test') {	def userSelected = input(id: 'userSelected',message: '确认发布到【测试】环境?',parameters: [[$class: 'ChoiceParameterDefinition',choices: "确认\n取消",name: '请选择']])echo "用户选择:${userSelected}"if (userSelected == "确认") {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-test.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-test.yaml"sh "cat k8s-test.yaml"sh "kubectl apply -f k8s-test.yaml"sh "sleep 10"sh "kubectl get pods -n test"} else {//exitecho "用户选择不发布到测试环境,本次部署流程终止。"currentBuild.result = 'ABORTED'error("用户选择取消发布到测试环境。")}}stage('Deploy to pro') {	def userSelected = input(id: 'userSelected',message: '确认发布到【生产】环境?',parameters: [[$class: 'ChoiceParameterDefinition',choices: "确认\n取消",name: '请选择']]// 仅允许指定用户操作 - 通过授权,仅测试团队可以操作//,submitter: 'test-user,test-group')echo "用户选择:${userSelected}"if (userSelected == "确认") {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod.yaml"sh "cat k8s-prod.yaml"sh "kubectl apply -f k8s-prod.yaml --record"sh "sleep 10"sh "kubectl get pods -n prod"}}
}

4. 演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在 deploy to test 这里就停住了,等待授权
开发人员在 dev 环境自测完毕后,确认发布到测试环境,由测试团队进行验证
在这里插入图片描述

发布到生产这里可以通过添加 submitter 来控制用户权限,比如仅测试团队可以提交
在这里插入图片描述
在这里插入图片描述
到这里整个流程就结束了
从下图中可以看到Jenkins slave这个 pod 生命周期结束
在命名空间 dev, test, prod 中分别生成了新的 pod
在这里插入图片描述

访问一下,自己写的一个springboot 应用 -> OK的
在这里插入图片描述

5. 闲聊

  1. 这里 svc 用的 NodePort,实际生产中如果做四层负载的话,应该会用 LoadBalance
  2. 做版本回滚的话,可以新起一个pipeline,调用shell脚本,选择版本号后进行回滚操作
    参考:
    #查看历史版本
    kubectl rollout history deployment/<deployment_name>
    #回退到指定版本
    kubectl rollout undo deployment/<deployment_name> --to-revision=<revision_number>
    
  3. 这里是用的单个集群,将开发、测试和生产环境部署在 同一个 K8S 集群中,并通过 Namespace 来区分不同环境。这种方式简单高效,但需要合理的规划和配置,确保资源隔离和环境安全性。
    比如按 namespace 做资源配额,按 单个pod 做资源限制
    #按 namespace 做资源限制
    apiVersion: v1
    kind: ResourceQuota
    metadata:name: resource-quotanamespace: dev
    spec:hard:pods: "20"                  # 最大允许 20 个 Podrequests.cpu: "4"           # 总 CPU 请求限制 4 核requests.memory: "8Gi"      # 总内存请求限制 8GBlimits.cpu: "8"             # 总 CPU 限制 8 核limits.memory: "16Gi"       # 总内存限制 16GB#按 单个pod 做资源限制 - 防止单个 Pod 占用过多资源
    apiVersion: v1
    kind: LimitRange
    metadata:name: limitsnamespace: dev
    spec:limits:- default:cpu: "500m"memory: "512Mi"defaultRequest:cpu: "200m"memory: "256Mi"type: Container
    
  4. Jenkins 的 Pipeline 可以通过不同的 kubeconfig 文件操作不同的集群。再直白点就是,可以通过 kubeconfig 文件 做服务器隔离、集群隔离的CICD 发布到dev、test、prod环境 - 当然这个我还没实际操作过
    顺带搜了一下,大约是这样做的,下面的内容仅供参考
    #1.为每个集群(dev 和 test)生成独立的 kubeconfig 文件
    kubectl config view --raw > kubeconfig-dev.yaml
    kubectl config view --raw > kubeconfig-test.yaml
    #2.将这些 kubeconfig 文件上传到 Jenkins 的凭据管理系统,确保安全性
    #在 Jenkins 中添加 kubeconfig 凭据
    #	打开 Jenkins Dashboard。
    #	进入 "Manage Jenkins" > "Credentials"。
    #	添加凭据:
    #		Kind:Secret file
    #		File:上传 kubeconfig-dev.yaml 和 kubeconfig-test.yaml。
    #		ID:分别命名为 kubeconfig-dev 和 kubeconfig-test。#3.在 Jenkins Pipeline 中使用 kubeconfig 文件
    #利用 withCredentials 加载对应的 kubeconfig 文件,动态切换集群。
    pipeline {
    agent any
    stages {stage('Deploy to Dev') {steps {script {echo "Deploying to Dev Cluster..."withCredentials([file(credentialsId: 'kubeconfig-dev', variable: 'KUBECONFIG')]) {// 使用 kubeconfig-dev 操作 dev 集群sh 'kubectl apply -f k8s-dev.yaml'sh 'kubectl get pods -n dev'}}}}stage('Deploy to Test') {steps {script {input "Confirm deployment to Test environment?"echo "Deploying to Test Cluster..."withCredentials([file(credentialsId: 'kubeconfig-test', variable: 'KUBECONFIG')]) {// 使用 kubeconfig-test 操作 test 集群sh 'kubectl apply -f k8s-test.yaml'sh 'kubectl get pods -n test'}}}}
    }
    

}
```
这种就是各集群的资源、权限完全独立,不会相互影响。即使某一环境出现问题,其他环境仍可正常工作。

适合场景
- 多集群部署:开发、测试、生产环境分布在不同的 Kubernetes 集群中。
- 跨区域服务器管理:如不同集群位于不同的云平台(阿里云、腾讯云、AWS 等)。
- 严格隔离需求:需要通过不同的 kubeconfig 文件实现权限和资源隔离。

6. 踩过的坑

6.1 FailedCreatePodSandbox - error getting clusterInfomation: connection is unauthorized

在这里插入图片描述
这个错误纠结了好久,最开始解题思路有误
看日志一直以为是授权出了问题
做了如下尝试,又检查了calico插件,发现全都是正常的
第二天Google搜了一下:
https://devopscube.com/clusterinformation-connection-unauthorized/
重启calico后OK,气不气?

#授权
kubectl create clusterrolebinding calico-access-jenkins-admin \--clusterrole=calico-kube-controllers \--serviceaccount=devops:jenkins-admin#绑定token - vim jenkins-admin-token.yaml
apiVersion: v1
kind: Secret
metadata:name: jenkins-admin-tokennamespace: devopsannotations:kubernetes.io/service-account.name: jenkins-admin
type: kubernetes.io/service-account-token
#kubectl apply -f jenkins-admin-token.yaml#验证是否生效
kubectl -n devops describe secret $(kubectl -n devops get secret | grep jenkins-admin | awk '{print $1}')
curl -k -H "Authorization: Bearer <your-token>" https://<kube-apiserver>:6443/apis/crd.projectcalico.org/v1/clusterinformations#能正常访问说明权限没有问题
kubectl --token=<your-token> get clusterinformation -o yaml

6.2 jenkins svc 没有暴露50000 端口

这个好像没什么可说的,加上就好了
在这里插入图片描述

6.3 Jenkins slave 构建镜像时提示 docker: not found

在这里插入图片描述
这个东西也搞了一阵子,后来自己基于
FROM jenkins/agent:latest
添加了 docker.io、maven-3.9.5、kubectl v1.31.2
然后打包成自己的Jenkins slave镜像使用,整个流程才正常跑通
这个镜像我推送到了 dockerhub 上,有需要的同学可以直接拿来用(不过由于版本问题,估计大概率也只有我自己用,哈哈)
镜像:cqweiheng/test:jenkins-agent-with-docker-v4

相关文章:

K8S + Jenkins 做CICD

前言 这里会做整体CICD的思路和流程的介绍&#xff0c;会给出核心的Jenkins pipeline脚本&#xff0c;最后会演示一下 实验/实操 结果 由于整体内容较多&#xff0c;所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用 要看保姆式教学的可以划走了&…...

http/https

1、http与https HTTPHTTPS信息明文传输加入ssl加密传输协议&#xff0c;可以使得报文加密传输默认端口80默认端口443连接简单TCP三次握手通信TCP三次握手后还要SSL/TLS握手过程&#xff0c;才可以加密报文传输无状态不安全需要到CA申请证书&#xff0c;身份认证&#xff0c;自…...

腾讯云 AI 代码助手:产品研发过程的思考和方法论

一、文章摘要 本文将详细阐述 腾讯云 AI 代码助手的历史发展形态与产品整体架构&#xff0c;并从技术、研发方法论的角度分别阐述了产品的研发过程。 全文阅读约 5&#xff5e;8 分钟。 二、产品布局 AI 代码助手产品经历了三个时代的发展 第一代诸如 Eclipse、Jetbrains、V…...

淘宝商品评论爬虫:Java实现指南

在当今的互联网时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是用户生成的内容&#xff0c;如商品评论&#xff0c;对于理解消费者行为和市场趋势具有重要意义。淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品评论数据。本文将介绍如何使用Java编写一个简单…...

银河麒麟v10 x86架构二进制方式kubeadm+docker+cri-docker搭建k8s集群(证书有效期100年) —— 筑梦之路

环境说明 master&#xff1a;192.168.100.100 node: 192.168.100.101 kubeadm 1.31.2 &#xff08;自编译二进制文件&#xff0c;证书有效期100年&#xff09; 银河麒麟v10 sp2 x86架构 内核版本&#xff1a;5.4.x 编译安装 cgroup v2启用 docker版本&#xff1a;27.x …...

【Linux】详解shell代码实现(上)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 学校开始搞蓝桥的校选…...

Ruby 模块(Module)

Ruby 模块&#xff08;Module&#xff09; 概述 Ruby 是一种动态、开放源代码的编程语言&#xff0c;以其简洁明了的语法和强大的功能而闻名。在 Ruby 中&#xff0c;模块&#xff08;Module&#xff09;是一个重要的概念&#xff0c;它用于封装一组相关的方法和常量。模块提…...

成都睿明智科技有限公司怎么样可靠不?

在这个日新月异的数字时代&#xff0c;电商行业如同一股不可阻挡的洪流&#xff0c;席卷着每一个消费者的生活。而抖音&#xff0c;作为短视频与电商完美融合的典范&#xff0c;更是为无数商家开辟了一片全新的蓝海。在这片充满机遇与挑战的海洋中&#xff0c;成都睿明智科技有…...

内网安全隧道搭建-ngrok-frp-nps-sapp

1.ngrok 建立内网主机与公网跳板机的连接&#xff1a; 内网主机为客户机&#xff1a; 下载客户端执行 2.frp &#xff08;1&#xff09;以下为内网穿透端口转发 frp服务端配置&#xff1a; bindPort 为frp运行端口 服务端运行 ./frps -c frps.ini frp客户端配置&#xf…...

k8s 对外服务之 Ingress

LB ingress //Ingress 简介 service的作用体现在两个方面&#xff0c;对集群内部&#xff0c;它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制&#xff1b;对集群外部&#xff0c;他类似负载均衡器&#xff0c;…...

前端速通(JavaScript)

1 初识JavaScript 1 JavaScript是什么 JavaScript 是一种高层的、轻量级的、解释型的编程语言&#xff0c;最初由 Netscape 公司于 1995 年开发。它的特点包括&#xff1a; 动态性&#xff1a;JavaScript是动态类型语言&#xff0c;允许开发者灵活地操作数据。跨平台&#xf…...

Unity图形学之着色器之间传递参数

1.初始化 struct&#xff1a; UNITY_INITIALIZE_OUTPUT&#xff08;type,name&#xff09; Type: struct 名字 Name :变量的名字 struct Input{float2 uv_MainTex;float3 myColor;};half _Glossiness;half _Metallic;fixed4 _Color;void MyVertx(inout appdata_base v,out I…...

JavaScript中的this指向问题

JavaScript中的this指向问题 1.1 为什么需要this? 为什么需要this? 在常见的编程语言中&#xff0c;几乎都有this这个关键字&#xff08;Objective-C中使用的是self),但是在JavaScript中的this和常见的面向对象语言中的this不太一样 常见面向对象的编程语言中&#xff0c;比…...

Qt之QWidget相关

Qt概述 Qt 是一个跨平台的 C 开发框架。 跨平台支持&#xff1a;可以用于开发 Windows、macOS、Linux、Android、iOS 等多种操作系统下的应用程序。这意味着开发者使用 Qt 编写的代码&#xff0c;在经过适当的编译和配置后&#xff0c;能够在不同平台上运行&#xff0c;减少了…...

Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析

1. 产品定位 Ease Monitor 有如下的产品定位&#xff1a; 关注于整体应用的SLA。 主要从为用户服务的 API 来监控整个系统。 关联指标聚合。 把有关联的系统及其指示聚合展示。主要是三层系统数据&#xff1a;基础层、平台中间件层和应用层。 快速故障定位。 对于现有的系统…...

苹果MacOS 调用自编译opencv的Dylib显示一个图片程序的步骤

前言 为了测试自编译的opencv库是否能在苹果MacOS系统下使用&#xff0c;需要写一个简单的测试程序。这个测试程序写起来不难&#xff0c;麻烦的是一些配置。网上的办法很多&#xff0c;里面因为版本的问题有一些坑。特此写了一个建立步骤&#xff0c;供大家参考。 1、新建一个…...

网页中调用系统的EXE文件,如打开QQ

遇到一个实际的问题&#xff0c;需要在网页中打开本地的某个工业软件。 通过点击exe文件就可以调用到程序。 比如双击qq的exe就可以启动qq的程序。 那么问题就变成了如何加载exe程序呢&#xff1f; 可以通过Java的 Process process Runtime.getRuntime().exec(command);通过…...

在 Ubuntu 系统上安装 npm 环境以及 nvm(Node Version Manager)

在 Ubuntu 系统上安装 npm 环境以及 nvm&#xff08;Node Version Manager&#xff09; 步骤 1: 更新系统包步骤 2: 安装 nvm步骤 3: 安装 Node.js 和 npm步骤 4: 设置默认 Node.js 版本&#xff08;可选&#xff09;总结 在 Ubuntu 系统上安装 npm 环境以及 nvm&#xff08;No…...

Linux环境开启MongoDB的安全认证

文章目录 1. MongoDB安全认证简介1.1 访问控制1.2 角色1.3 权限 2. MongoDB中的常见角色3. MongoDB Shell3.1 下载MongoDB Shell3.2 通过MongoDB Shell连接MongoDB 4. 创建管理员用户5. 为具体的数据库创建用户6. 开启权限认证7. 重启MongoDB服务8. 连接MongoDB9. MongoDB数据库…...

实现了两种不同的图像处理和物体检测方法

这段代码实现了两种不同的图像处理和物体检测方法&#xff1a;一种是基于Canny边缘检测与轮廓分析的方法&#xff0c;另一种是使用TensorFlow加载预训练SSD&#xff08;Single Shot Multibox Detector&#xff09;模型进行物体检测。 1. Canny边缘检测与轮廓分析&#xff1a; …...

经典工具 | 使用SIFT预测错义突变的有害性

SIFT 用计算机替代人预测复杂事件的影响&#xff0c;是我们这个时代最令人兴奋的科学进展之一。SIFT就是这样一个应用于基因组学研究的经典工具。 SIFT可预测多种生物体的基因组变异&#xff0c;主要是错义突变的影响与效应&#xff0c;最大的特点是物种丰富&#xff0c;是一个…...

如何给 Apache 新站点目录配置 SELinux ?

在 web 服务器管理领域&#xff0c;确保服务器环境的安全性至关重要。SELinux (Security-Enhanced Linux) 是保护 Linux 服务器最有效的工具之一&#xff0c;它是一种强制访问控制 (MAC mandatory access control) 安全机制。当使用最流行的 web 服务器 Apache 提供 web 内容时…...

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展&#xff0c;流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言&#xff0c;把握这些趋势并积极应对挑战将是实现成功的关键…...

云讷科技Kerloud无人飞车专利发布

云讷科技Kerloud无人飞车获得了“一种室内外两用的四旋翼无人飞车”的实用新型专利证书&#xff0c;作为科教社区第一款四旋翼飞车&#xff0c;这项技术结合了无人机和无人车的优势&#xff0c;提供了一种能够在多种环境下使用的多功能飞行器。 这项设计的优势如下&#xff…...

快速识别模型:simple_ocr,部署教程

快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型&#xff1a;检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…...

Qt交叉编译x86和arm心得

最近一直在Linux上开发qt程序&#xff0c;主要工作是在x86的Ubuntu上开发编译调试程序&#xff0c;确定没有问题后交叉编译到arm的linux系统上运行 1.环境 Qt的交叉编译环境厂家已经提供了&#xff0c;嵌入式的同事帮我安装调试的&#xff0c;具体就是装了厂家给的gcc编译套件…...

用CAXA CAD电子图板导入图框、标题栏并导出pdf的方法

1.导入图框&#xff1a; 点击调入图框->出现读入图框文件 一个一个点击&#xff0c;选择合适的图框 然后点击导入 2.导入标题栏&#xff1a; 调入标题栏->出现读入标题栏文件 一个一个点击&#xff0c;选择合适的标题栏&#xff0c;然后点击导入 3.导出pdf&#x…...

在 Ubuntu/Debian 上安装 Go

使用官方二进制文件安装&#xff08;推荐&#xff09; Go 提供了官方的二进制安装包&#xff0c;适用于大多数 Linux 发行版&#xff0c;包括 Ubuntu 和 Debian。步骤如下&#xff1a; 更新包索引&#xff1a; bash sudo apt update 安装依赖&#xff08;如果尚未安装&#…...

设计模式之策略模式-工作实战总结与实现

文章目录 应用场景存在问题解决方案继续延伸 应用场景 假设有这样的业务场景&#xff0c;大数据系统把文件推送过来&#xff0c;根据不同类型采取不同的解析方式。多数的小伙伴就会写出以下的代码&#xff1a; public class Question {public static void main(String[] args…...

自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

实验十三 生态安全评价

1 背景及目的 生态安全是生态系统完整性和健康性的整体反映&#xff0c;完整健康的生态系统具有调节气候净化污染、涵养水源、保持水土、防风固沙、减轻灾害、保护生物多样性等功能。维护生态安全对于人类生产、生活、健康及可持续发展至关重要。随着城市化进程的不断推进&…...

【MySQL实战45讲笔记】基础篇——redo log 和 binlog

系列文章 基础篇——MySQL 的基础架构 目录 系列文章1. 重要的日志模块&#xff1a;redo log 和 binlog1.1 redo log1.2 binlog1.3 执行器和 InnoDB 引擎内部如何执行更新语句 1. 重要的日志模块&#xff1a;redo log 和 binlog 前面系统的了解了一个查询语句的执行流程&…...

Java 基于SpringBoot+vue框架的老年医疗保健网站

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是Java Java 基于SpringBootvue框架的老年医疗保健网站。该系统采用 Java 语言开发&#xff0c;SpringBoot 框架&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大…...

Java集合分页

一、前言 在Java开发中&#xff0c;若单次展示的数据量太大&#xff0c;会造成程序响应缓慢&#xff0c;就需要用到分页功能&#xff0c;每一页展示一定量的数据&#xff0c;分多次展示 ... 那么在List集合中&#xff0c;如何实现分页功能呢&#xff1f; 本文将以3种方式&…...

python语言基础-5 进阶语法-5.5 上下文管理协议(with语句)

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 5.5 上下文管理协议&#xff08;with语句&#xff09;&#xff08;参考链接&#xff1…...

周志华深度森林deep forest(deep-forest)最新可安装教程,仅需在pycharm中完成,超简单安装教程

1、打开pycharm 没有pycharm的&#xff0c;在站内搜索安装教程即可。 2、点击“文件”“新建项目” 3、创建项目&#xff0c;Python版本中选择Python39。如果没有该版本&#xff0c;选择下面的Python 3.9下载并安装。 4、打开软件包&#xff0c;搜索“deep-forest”软件包&am…...

技术美术百人计划 | 《2.1 色彩空间介绍》笔记

总览 一、色彩发送器 色彩认知&#xff1a; 光源是出生点&#xff0c;光源发射出光线&#xff0c;光线通过直射反射折射等路径最终进入人眼。 但人眼接收到光线后&#xff0c;人眼的细胞产生了一系列化学反应。 由此把产生的信号传入大脑&#xff0c;最终大脑对颜色产生了认…...

设计模式:6、装饰模式(包装器)

目录 0、定义 1、装饰模式包含的四种角色 2、装饰模式的UML类图 3、示例代码 0、定义 动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。 1、装饰模式包含的四种角色 抽象组件&#xff08;Component&#xff09;&#xff1a;抽象组件是一个抽象…...

vue-office:word(.docx)、pdf、excel(.xlsx,.xls)格式文件预览

vue-office&#xff1a;word&#xff08;.docx&#xff09;、excel&#xff08;.xlsx&#xff0c;.xls&#xff09;格式文件预览 组件安装 // docx文档预览组件 npm install vue-office/docx vue-demi0.14.6// excel文档预览组件 npm install vue-office/excel vue-demi0.14.…...

简单工厂模式

简单工厂模式详解 定义 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;用于创建对象的实例。通过一个工厂类来决定实例化哪一个具体类&#xff0c;降低客户端与具体类之间的耦合。 对于长switch或者长if、else&#xff0c;且…...

得物彩虹桥架构演进之路-负载均衡篇

文 / 新一 一、前言 一年一更的彩虹桥系列又来了&#xff0c;在前面两期我们分享了在稳定性和性能2个层面的一些演进&优化思路。近期我们针对彩虹桥 Proxy 负载均衡层面的架构做了一次升级&#xff0c;目前新架构已经部署完成&#xff0c;生产环境正在逐步升级中&#xf…...

【大数据学习 | Spark-Core】spark-shell开发

spark的代码分为两种 本地代码在driver端直接解析执行没有后续 集群代码&#xff0c;会在driver端进行解析&#xff0c;然后让多个机器进行集群形式的执行计算 spark-shell --master spark://nn1:7077 --executor-cores 2 --executor-memory 2G sc.textFile("/home/ha…...

macos 使用 nvm 管理 node 并自定义安装目录

系统环境&#xff1a;MacOS Version 参考文章&#xff1a; Github 地址&#xff1a;https://github.com/nvm-sh/nvm 安装的方式是很简单的&#xff0c;直接执行下面的命令即可&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bas…...

MongoDB分片集群搭建

什么是分片 分片是一种跨多台机器分布数据的方法。MongoDB 使用分片来支持超大数据集和高吞吐量操作的部署。什么情况下使用分片 存储容量受单机限制&#xff0c;即磁盘资源遭遇瓶颈。读写能力受单机限制&#xff0c;可能是CPU、内存或者网卡等资源遭遇瓶颈&#xff0c;导致读…...

MySQL数据库基础

1.数据库的操作 1.1 显示当前数据库 show databses; 1.2 创建数据库 create database [if not exist] db_name; 创建名为db_test1的数据库 create database db_test1; 说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集;utf8,校验规则是 utf8_general_c…...

前端性能优化

前端性能优化是提升用户体验的重要环节&#xff0c;优化的目标是减少页面加载时间、提高交互响应速度、降低资源消耗。以下从 加载性能优化、渲染性能优化 和 交互性能优化 三个维度详细说明&#xff1a; 一、加载性能优化 目标是减少页面首次加载时间&#xff0c;提升页面的加…...

深度学习中的正则化技术

在深度学习中&#xff0c;正则化是一种防止模型过拟合的重要手段。过拟合是指模型在训练数据上表现良好&#xff0c;但在未见数据上表现不佳的现象。正则化通过引入额外的约束或信息来限制模型的复杂性&#xff0c;从而提高模型的泛化能力。本文将介绍几种常见的正则化技术&…...

工商银行湖仓智一体创新应用实践

数智技术已经成为企业数字化转型的核心动力 国家《“十四五”数字经济发展规划》指出数字经济是未来的主要经济形态,数据因其倍增效应和乘数效应,可以带来全要素效率的提升,已经成为数字经济的核心要素资源,是企业数字化转型的新要素、新动能。为了高质量推进企业数字化转…...

测试实项中的偶必现难测bug之模糊匹配逻辑

问题: 现在有一个场景,如果只是通过功能测试会比较难测,例如刚开始我们做会员的时候,只有白银会员,在用户分群的场景下,需要用条件逻辑匹配,当时开发用了like的匹配方式没有问题。1年后加了白银试用会员,导致在统计会员分群的时候明明条件选的是白银会员,但是统计的数…...

金融科技白皮书:2022-2023年度回顾与前瞻

在金融科技领域&#xff0c;2022至2023年见证了一系列创新技术的应用和发展。本白皮书将回顾过去一年的主要成就&#xff0c;并展望未来一年的发展趋势。 2022年亮点回顾 **低代码平台&#xff1a;**低代码平台通过高度抽象化和自动化的可视化过程&#xff0c;简化了应用程序开…...