jenkins部署

  • 开发者将代码push到git
  • 运维人员通过jenkins部署,自动到git上pull代码
  • 通过maven构建成jar包,并结合dockerfile打包成镜像,push docker镜像到docker registry
  • 通过k8s发起 发布/更新 服务 操作

在这里插入图片描述

通过Jenkins部署,自动到Git上PULL代码

①、配置SSH-KEY

jenkins需要pull git上的代码,正常来说,代码都是私有的,git clone操作的时候会需要密码,就不能完成自动化操作了。这里使用SSH-KEY 的方式,让git clone操作无需密码就能完成克隆

在jenkins所在环境里执行ssh-keygen -t ed25519 -C “xxxxx@xxxxx.com” ,生成/添加SSH公钥

按照提示完成三次回车,即可生成 ssh key。通过查看 ~/.ssh/id_ed25519.pub 文件内容,获取到你的 public key
在这里插入图片描述
得到公钥 public key 内容,cat ~/.ssh/id_ed25519.pub

cat ~/.ssh/id_ed25519.pub

②、将公钥配置的git平台

git平台可以是github,gitee,也可以是自己搭建的gitlab等
通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,添加生成的 public key 添加到仓库中。
在这里插入图片描述

添加成功后,到jenkins所在环境运行 ssh -T git@gitee.com

在这里插入图片描述
首次使用需要确认并添加主机到本机SSH可信列表。若返回 Hi XXX! You’ve successfully authenticated, but Gitee.com does not provide shell access. 内容,则证明添加成功

③、测试

在这里插入图片描述
在jenkins所在环境执行git clone git@gitee.com:xxxx.git
在这里插入图片描述

④、Jenkins创建任务
在这里插入图片描述
选择流水线 确定
在这里插入图片描述

这里勾选参数化构建,选择字符参数,用于输入构建代码的版本
在这里插入图片描述
在这里插入图片描述,默认值填master,根据自身项目实际填写
在这里插入图片描述
拉到最下面的流水线,写pipeline脚本,如果不知道怎么写,可以点击流水线语法进行参考
在这里插入图片描述
REPOSITORY 填写项目的ssh地址,REPOSITORY_VERSION是刚刚配置的构建参数
在这里插入图片描述

⑤、测试拉取代码

返回Jenkins 首页,选择刚刚创建的项目
在这里插入图片描述

点击右边的运行按钮

在这里插入图片描述
输入代码分支版本,点击开始构建
在这里插入图片描述
看到这里就是已经构建成功了
在这里插入图片描述

jenkins需要先安装maven工具,补充pipeline脚本

pipeline {agent anyenvironment {REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"MODULE="cloud-demo-m-test-dubbo-service"}stages {stage('拉代码') {steps {echo "start fetch code from git:${REPOSITORY}"deleteDir()git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"}}stage('编译代码') {steps {echo "start compile"sh "cd cloud-demo-project && mvn -U clean install"echo "compile project ................................"sh "cd cloud-demo-dependencies && mvn -U clean install"echo "compile dependencies ................................"sh "cd cloud-demo-common && mvn -U clean install"echo "compile common ................................"sh "cd cloud-demo-m-test && mvn -U -am clean install"echo "compile m-test ................................"sh "cd cloud-demo-m-test/cloud-demo-m-test-common && mvn -U -am clean install"echo "compile m-test-dubbo-api ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-api && mvn -U -am clean install"echo "compile m-test-dubbo-service ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service && mvn -U -am clean package"}}}
}

这里补充了stage(‘编译代码’) {} 部分,用于maven编译。具体编译脚本需要根据自己项目实际,这个是项目的编译必须步骤。

⑥、测试拉代码流程+构建项目过程
在这里插入图片描述

将maven构建后的jar打包成docker镜像 并 push docker镜像到docker registry
在jenkins环境下,创建目录用于存放脚本文件

mkdir /usr/local/project/.env/cloud-demo-m-test-dubbo-service/ -p

这个目录下存放4个文件

  • build.sh
  • Dockerfile
  • application.properties
  • bootstrap.properties

application.properties 和 bootstrap.properties 是springcloud的配置文件,内容根据自己项目情况

buils.sh 文件内容

#!/usr/bin/env bashREPOSITORY_VERSION=$1
GIT_REVISION=`git log -1 --pretty=format:"%h"`
TIME=`date "+%Y.%m.%d.%H.%M"`
IMAGE_NAME=192.168.31.100:5000/cloud-demo/cloud-demo-m-test-dubbo-service
IMAGE_TAG=${REPOSITORY_VERSION}-${GIT_REVISION}-${TIME}docker build -t ${IMAGE_NAME}:${IMAGE_TAG} .docker push ${IMAGE_NAME}:${IMAGE_TAG}echo "${IMAGE_NAME}:${IMAGE_TAG}" > IMAGE
## 内容说明
REPOSITORY_VERSION 是需要传入的参数,传项目git分支名,用于打标签使用
GIT_REVISION 是获取当前git的提交版本 如 c9c8525,线上问题可以根据这个版本查找具体代码问题
TIME 年.月.日.时.分  记录打包时间,也用于打标签使用
IMAGE_NAME 镜像名,这里前缀包含了192.168.31.100:5000 是因为我打包之后会push到192.168.31.100:5000,其他服务器可以到这里来pull镜像
docker build -t ${IMAGE_NAME}:${IMAGE_TAG} . 构建镜像
docker push ${IMAGE_NAME}:${IMAGE_TAG}  推送镜像
echo "${IMAGE_NAME}:${IMAGE_TAG}" > IMAGE  把镜像名:镜像标签 输出到IMAGE文件里,方便后续步骤获取

Dockerfile文件内容

FROM openjdk:8u342-jdk
MAINTAINER yanger yanger@qq.comCOPY target/cloud-demo-m-test-dubbo-service-1.0-SNAPSHOT.jar /cloud-demo-m-test-dubbo-service.jar
COPY application.properties /application.properties
COPY bootstrap.properties /bootstrap.properties
ENTRYPOINT ["java", "-jar", "/cloud-demo-m-test-dubbo-service.jar"]
## 内容说明
FROM openjdk:8u342-jdk 使用openjdk:8u342-jdk 作为基础镜像
COPY 文件到镜像
ENTRYPOINT ["java", "-jar", "/cloud-demo-m-test-dubbo-service.jar"] 启动时运行 java -jar /cloud-demo-m-test-dubbo-service.jar

这里用到了docker registry 如果还没有registry 请先启动,可以用docker的方式启动

docker run -d -p 5000:5000 --name registry registry

build.sh文件需要可执行权限:build.sh文件需要可执行权限

补充pipeline脚本

pipeline {agent anyenvironment {REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"SCRIPT_PATH="/usr/local/project/.env/cloud-demo-m-test-dubbo-service/"}stages {stage('拉代码') {steps {echo "start fetch code from git:${REPOSITORY}"deleteDir()git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"}}stage('编译代码') {steps {echo "start compile"sh "cd cloud-demo-project && /usr/local/maven/bin/mvn -U clean install"echo "compile project ................................"sh "cd cloud-demo-dependencies && /usr/local/maven/bin/mvn -U clean install"echo "compile dependencies ................................"sh "cd cloud-demo-common && /usr/local/maven/bin/mvn -U clean install"echo "compile common ................................"sh "cd cloud-demo-m-test && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test ................................"sh "cd cloud-demo-m-test/cloud-demo-m-test-common && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test-dubbo-api ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-api && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test-dubbo-service ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service && /usr/local/maven/bin/mvn -U -am clean package"}}stage('构建镜像') {steps {echo "start build image"sh "cp ${SCRIPT_PATH}/build.sh cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/Dockerfile cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/application.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/bootstrap.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/ && ./build.sh ${REPOSITORY_VERSION}"}}}
}

补充了stage(‘构建镜像’){} 内容和 environment 部分加了个参数 SCRIPT_PATH

SCRIPT_PATH参数是上面创建的文件夹路径

stage(‘构建镜像’){}这一步是复制相应文件到项目目录下,并且执行build.sh脚本

测试
在这里插入图片描述
可以看到镜像已经打包好,并且已经push到registry了
浏览器访问http://192.168.31.100:5000/v2/cloud-demo/cloud-demo-m-test-dubbo-service/tags/list
可以看到registry有cloud-demo/cloud-demo-m-test-dubbo-service:master-7012e1d-2023.05.01.10.16这个镜像

⑦、通过k8s发起 发布/更新 服务 操作

配置构建K8S资源的描述文件,在 /usr/local/project/.env/cloud-demo-m-test-dubbo-service/ 目录新增文件 cloud-demo-m-test-dubbo-service.yaml

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: cloud-demo-m-test-dubbo-servicename: cloud-demo-m-test-dubbo-service
spec:replicas: 1selector:matchLabels:app: cloud-demo-m-test-dubbo-servicestrategy: {}template:metadata:creationTimestamp: nulllabels:app: cloud-demo-m-test-dubbo-servicespec:containers:- image: IMAGE_AND_TAGname: cloud-demo-m-test-dubbo-serviceresources: {}volumeMounts: - name: log-pathmountPath: /logsvolumes: - name: log-pathhostPath: path: /root/k8s/cloud-demo-m-test-dubbo-service/logs
status: {}---apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:app: cloud-demo-m-test-dubbo-servicename: cloud-demo-m-test-dubbo-service
spec:ports:- port: 20881protocol: TCPtargetPort: 20881selector:app: cloud-demo-m-test-dubbo-servicetype: NodePort
status:loadBalancer: {}

这个文件是构建K8S资源的描述文件,创建deployment 和service,暴露端口20881,挂载/logs目录到主机
其中 IMAGE_AND_TAG 是需要替换为相应 容器名:容器标签 的

⑧、完善jenkins步骤

pipeline {agent anyenvironment {REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"SCRIPT_PATH="/usr/local/project/.env/cloud-demo-m-test-dubbo-service"IMAGE=""}stages {stage('拉代码') {steps {echo "start fetch code from git:${REPOSITORY}"deleteDir()git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"}}stage('编译代码') {steps {echo "start compile"sh "cd cloud-demo-project && /usr/local/maven/bin/mvn -U clean install"echo "compile project ................................"sh "cd cloud-demo-dependencies && /usr/local/maven/bin/mvn -U clean install"echo "compile dependencies ................................"sh "cd cloud-demo-common && /usr/local/maven/bin/mvn -U clean install"echo "compile common ................................"sh "cd cloud-demo-m-test && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test ................................"sh "cd cloud-demo-m-test/cloud-demo-m-test-common && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test-dubbo-api ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-api && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test-dubbo-service ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service && /usr/local/maven/bin/mvn -U -am clean package"}}stage('构建镜像') {steps {echo "start build image"sh "cp ${SCRIPT_PATH}/build.sh cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/Dockerfile cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/application.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/bootstrap.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/ && ./build.sh ${REPOSITORY_VERSION}"}}stage('发布') {steps {echo "start deploy"script {IMAGE = readFile "cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/IMAGE"IMAGE = IMAGE.trim()if (IMAGE == "") {throw new Exception("获取镜像名文件失败,请重试")}}echo "IMAGE: -- ${IMAGE}"sh "cp ${SCRIPT_PATH}/cloud-demo-m-test-dubbo-service.yaml cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "sed -i \"s#IMAGE_AND_TAG#${IMAGE}#g\" cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/cloud-demo-m-test-dubbo-service.yaml"sh "kubectl apply -f cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/cloud-demo-m-test-dubbo-service.yaml"}}}
}

添加了 stage(‘发布’) {} 部分

  • 通过读取IMAGE文件,获取镜像名:镜像标签
  • 如果获取不到镜像名:镜像标签,抛出异常
  • 将cloud-demo-m-test-dubbo-service.yaml文件复制到工作目录
  • 用镜像名:镜像标签 替换掉 IMAGE_AND_TAG
  • 使用kubectl命令发布/更新服务

测试

在jenkins上构建项目

在这里插入图片描述
在K8S master服务器上,执行 kubectl get all
在这里插入图片描述

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

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

相关文章

BBR 的 buffer 动力学观感

这周很忙,今天还加了一天班,但还是抽空实现了五一在安徽泾县山区喝着一壶酒写的 BBR ProbeRTT 的想法,没多少行代码,它真就消除了带宽锯齿,皮了个鞋👞,昨天我还在群里说了今天再说说 BBR 的&…

第9讲、深入理解Scaled Dot-Product Attention

Scaled Dot-Product Attention是Transformer架构的核心组件,也是现代深度学习中最重要的注意力机制之一。本文将从原理、实现和应用三个方面深入剖析这一机制。 1. 基本原理 Scaled Dot-Product Attention的本质是一种加权求和机制,通过计算查询(Query…

el-tree结合checkbox实现数据回显

组件代码 <el-tree:data"vertiList"show-checkboxnode-key"id":props"defaultProps"ref"treeRefx"class"custom-tree"check-change"handleCheckChange"> </el-tree>获取选择的节点 handleCheckChan…

OpenResty 深度解析:构建高性能 Web 服务的终极方案

引言 openresty是什么&#xff1f;在我个人对它的理解来看相当于嵌入了lua的nginx; 我们在nginx中嵌入lua是为了不需要再重新编译,我们只需要重新修改lua脚本,随后重启即可; 一.lua指令序列 我们分别从初始化阶段&#xff0c;重写/访问阶段&#xff0c;内容阶段&#xff0c;日志…

多商户商城系统源码解析:开发直播电商APP的技术底层实战详解

随着直播电商的火爆&#xff0c;越来越多的创业者和企业都在寻求打造自己的多商户商城系统&#xff0c;以实现“人、货、场”三者的深度融合。然而&#xff0c;从一个简单的电商平台到一个功能完善的直播电商APP&#xff0c;其技术底层架构和实现过程并非一蹴而就。本文将从架构…

桌面端进程通信

以下是关于 Electron 桌面端进程通信的基本知识点总结: 一、Electron 进程模型基础 1. 进程类型与职责 进程类型职责权限主进程(Main)创建窗口、系统级操作、IPC中枢完全Node.js访问权限渲染进程(Renderer)展示Web内容、UI交互默认受限(可配置开启Node.js)预加载脚本(Prelo…

openEuler24.03 LTS下安装MySQL8.0.42

目录 前提步骤 删除原有mysql及maridb数据库 安装MySQL 启动MySQL 启动查看MySQL状态 设置MySQL开机自启动 查看登录密码 登录MySQL 修改密码及支持远程连接 远程连接MySQL 前提步骤 拥有openEuler24.03 LTS环境&#xff0c;可参考&#xff1a;Vmware下安装openEule…

idea 保证旧版本配置的同时,如何从低版本升到高版本

文章目录 前言idea 保证旧版本配置的同时,如何从低版本升到高版本1. 备份项目2. 下载最新的idea3. 安装安装包4. 导入idea2019旧配置5. 验证前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,…

填坑记: 古董项目Apache POI 依赖异常排除

当你看到NoSuchMethodError的时候&#xff0c;不要慌&#xff0c;深呼吸&#xff0c;这可能只是JAR包版本的问题… 引子&#xff1a;一个平静的周二下午 那是一个看似平常的周二下午&#xff0c;系统运行良好&#xff0c;开发团队在有条不紊地推进着新功能的开发。突然&#x…

CAPL Class: TcpSocket (此类用于实现 TCP 网络通信 )

目录 Class: TcpSocketacceptopenclosebindconnectgetLastSocketErrorgetLastSocketErrorAsStringlistenreceivesendsetSocketOptionshutdown函数调用的基本流程服务器端的基本流程客户端的基本流程Class: TcpSocket学习笔记。来自CANoe帮助文档。 Class: TcpSocket accept /…

微信小程序的开发及问题解决

HttpClient 测试例子 SpringBootTest public class HttpClientTest {/*** 测试通过httpclient发送get方式的请求*/Testpublic void testGET() throws IOException {//创建httpclient对象CloseableHttpClient httpClient HttpClients.createDefault();//创建请求对象HttpGet ht…

foreach中使用await的问题

目录 1.说明 2.示例 3.解决方案 1.说明 在foreach中调用异步方法&#xff0c;即使使用了await&#xff0c;不会依次执行每个异步任务&#xff0c;也就是说Array.prototype.forEach不会等待 Promise 完成&#xff0c;即使你在回调函数中返回一个 Promise&#xff0c;forEach …

Linux调试生成核心存储文件

1.核心存储文件配置&#xff1a; 不知道理解对不对&#xff0c;Linux中的核心存储文件的配置是在/proc/sys/kernel/core_pattern中的&#xff0c;使用 cat /proc/sys/kernel/core_pattern # 打印出 |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E表示核…

Compose笔记(二十三)--多点触控

这一节主要了解一下Compose中多点触控&#xff0c;在Jetpack Compose 中&#xff0c;多点触控处理需要结合Modifier和手势API来实现&#xff0c;一般通过组合 pointerInput、TransformableState 和 TransformModifier 来创建支持缩放、旋转和平移的组件。 一、 API 1. Pointer…

【Java ee初阶】HTTP(4)

构造HTTP请求 1&#xff09;开发中&#xff0c;前后端交互。浏览器运行的网页中&#xff0c;构造出HTTP请求 2&#xff09;调试阶段&#xff0c;通过构造HTTP请求测试服务器 朴素的方案&#xff1a; 通过tcp socket 的方式构造HTTP请求 按照HTTP请求格式&#xff0c;往TCP…

STM32 __main

STM32开发中__main与用户main()函数的本质区别及工作机制 在STM32开发中&#xff0c;__main和用户定义的main()函数是启动过程中的两个关键节点&#xff0c;分别承担运行时初始化和用户程序入口的职责。以下是它们的核心差异及协作机制&#xff1a; 一、定义与层级差异 ​__ma…

什么是PMBus

一、PMBus的定义与背景 PMBus&#xff08;Power Management Bus&#xff0c;电源管理总线&#xff09; 是一种基于SMBus&#xff08;System Management Bus&#xff09;的开放标准数字通信协议&#xff0c;专为电源设备的监控、配置和控制设计。由PMBus联盟&#xff08;现并入…

Python OOP核心技巧:如何正确选择实例方法、类方法和静态方法

Python方法类型全解析&#xff1a;实例方法、类方法与静态方法的使用场景 一、三种方法的基本区别二、访问能力对比表三、何时使用实例方法使用实例方法的核心场景&#xff1a;具体应用场景&#xff1a;1. 操作实例属性2. 对象间交互3. 实现特定实例的行为 四、何时使用类方法使…

业务中台-典型技术栈选型(微服务、容器编排、分布式数据库、消息队列、服务监控、低代码等)

在企业数字化中台建设中&#xff0c;业务中台是核心支撑平台&#xff0c;旨在通过技术手段将企业核心业务能力抽象、标准化和复用&#xff0c;以快速响应前端业务需求。其核心技术流涉及从业务抽象到服务化、治理和持续优化的全流程。以下是业务中台建设中的核心技术体系及关键…

期望是什么:(无数次的均值,结合概率)21/6=3.5

https://seeing-theory.brown.edu/basic-probability/cn.html 期望是什么:(无数次的均值,结合概率)21/6=3.5 一、期望(数学概念) 在概率论和统计学中,**期望(Expectation)**是一个核心概念,用于描述随机变量的长期平均取值,反映随机变量取值的集中趋势。 (一…