一键部署springcloud微服务,需要用到 jenkins k8s docker等工具,自行安装即可。
本文使用jenkins部署,流程如下图

- 开发者将代码push到git
- 运维人员通过jenkins部署,自动到git上pull代码
- 通过maven构建代码
- 将maven构建后的jar打包成docker镜像 并
push docker镜像到docker registry - 通过k8s发起 发布/更新 服务 操作
其中 2~5步骤都会在jenkins中进行操作
1、开发者将代码push到git
这一步本文不做详细描述
2、通过jenkins部署,自动到git上pull代码
这里需要用到jenkins 的 pipeline插件
2.1、 配置ssh-key
因为jenkins需要pull git上的代码,正常来说,代码都是私有的,git clone操作的时候会需要密码,就不能完成自动化操作了。这里使用ssh-key 的方式,让git clone操作无需密码就能完成克隆
2.1.1、生成/添加ssh公钥
在jenkins所在环境里执行
ssh-keygen -t ed25519 -c "xxxxx@xxxxx.com"
注意:这里的
xxxxx@xxxxx.com只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱
按照提示完成三次回车,即可生成 ssh key。通过查看 ~/.ssh/id_ed25519.pub 文件内容,获取到你的 public key

得到公钥 public key 内容
cat ~/.ssh/id_ed25519.pub
2.1.2、将公钥配置到git平台
git平台可以是github,gitee,也可以是自己搭建的gitlab等
我这里使用gitee
通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,添加生成的 public key 添加到仓库中。

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

首次使用需要确认并添加主机到本机ssh可信列表。若返回 hi xxx! you’ve successfully authenticated, but gitee.com does not provide shell access. 内容,则证明添加成功
2.1.3、测试
复制你项目的ssh链接

在jenkins所在环境
执行git clone git@gitee.com:xxxx.git

2.2、配置jenkins的pipeline 自动clone代码
2.2.1、jenkins创建任务
新建任务

选择流水线 确定

这里勾选参数化构建,选择字符参数,用于输入构建代码的版本

默认值填master,根据自身项目实际填写

拉到最下面的流水线,写pipeline脚本,如果不知道怎么写,可以点击流水线语法进行参考

这是我的脚本, repository 填写项目的ssh地址,repository_version是刚刚配置的构建参数
pipeline {
agent any
environment {
repository="git@gitee.com:xxxxxx/cloud-demo.git"
}
stages {
stage('拉代码') {
steps {
echo"start fetch code from git:${repository}"
deletedir()
git branch: "${repository_version}", url: "${repository}"
}
}
}
}保存
2.2.2、测试拉代码流程
返回jenkins 首页,选择刚刚创建的项目

点击右边的运行按钮

输入代码分支版本
点击开始构建

看到这里就是已经构建成功了

根据日志提示的目录,可以看到目录下已经有代码了
3、通过maven构建代码
3.1、maven插件安装
因为这里使用到了maven,jenkins需要先安装maven工具
3.2、maven构建项目
补充pipeline脚本
pipeline {
agent any
environment {
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编译。具体编译脚本需要根据自己项目实际,这个是我项目的编译必须步骤。
3.3、测试拉代码流程+构建项目过程
重复2.2.2步骤,查看运行结果

构建成功
4、将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 bash
repository_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.com copy 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文件需要可执行权限
chmod 755 build.sh
补充pipeline脚本
pipeline {
agent any
environment {
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这个镜像
5、通过k8s发起 发布/更新 服务 操作
5.1、配置构建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: null
labels:
app: cloud-demo-m-test-dubbo-service
name: cloud-demo-m-test-dubbo-service
spec:
replicas: 1
selector:
matchlabels:
app: cloud-demo-m-test-dubbo-service
strategy: {}
template:
metadata:
creationtimestamp: null
labels:
app: cloud-demo-m-test-dubbo-service
spec:
containers:
- image: image_and_tag
name: cloud-demo-m-test-dubbo-service
resources: {}
volumemounts:
- name: log-path
mountpath: /logs
volumes:
- name: log-path
hostpath:
path: /root/k8s/cloud-demo-m-test-dubbo-service/logs
status: {}
---
apiversion: v1
kind: service
metadata:
creationtimestamp: null
labels:
app: cloud-demo-m-test-dubbo-service
name: cloud-demo-m-test-dubbo-service
spec:
ports:
- port: 20881
protocol: tcp
targetport: 20881
selector:
app: cloud-demo-m-test-dubbo-service
type: nodeport
status:
loadbalancer: {}这个文件是构建k8s资源的描述文件,创建deployment 和service,暴露端口20881,挂载/logs目录到主机
其中 image_and_tag 是需要替换为相应 容器名:容器标签 的
5.2、完善jenkins步骤
pipeline {
agent any
environment {
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命令发布/更新服务
5.3、测试
在jenkins上构建项目

在k8s master服务器上,执行
kubectl get all

搞定
到此这篇关于一键部署 springcloud 微服务的文章就介绍到这了,更多相关springcloud 微服务内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论