文章目录
- 前言
- 一、jenkins配置
- 1.1 jenkins配置git
- 1.2 jenkins 配置maven
- 1.3 jenkins配置java
- 二、jenkins流水线配置
- 2.1.新增项目
- 2.2 springboot项目配置git仓库
- 2.3 springboot项目配置maven打包
- 2.4 系统配置 ssh到hadoop1配置,也就是k8s的master节点
- 2.6 springboot项目配置拷贝jar包到远端
- 2.5 springboot项目配置打包完成后的执行脚本
- 2.6 验证
- 总结
前言
前面已经完成了k8s集群的部署,现在尝试jenkins自动集成到k8s集群。jenkins搭建可以参考,jenkins搭建
一、jenkins配置
前面已经完成了jenkins的搭建,但是还没有集成git,maven,java,这里做下配置。
1.1 jenkins配置git
linux安装git如下
yum install git
如下图的路径配置里如果没有git,去插件安装处安装一下git插件即可
配置git,如果没有git去插件管理安装一下就行
/usr/bin/git
1.2 jenkins 配置maven
自己下载maven安装包,解压到你自己的安装目录,修改conf文件
<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url>
</mirror>
export MAVEN_HOME=/opt/*/maven3.6/apache-maven-3.6.3
export PATH=MAVEN_HOME/bin:MAVEN_HOME/bin:PATH
#刷新配置
source /etc/profile
检查是否安装成功
mvn help:system
如果出现下载文件,则maven安装成功了,接下来去jenkins配置maven如图所示,我的安装路径如下,
/root/tools/apache-maven-3.6.3/conf/settings.xml
配置maven安装路径如图
1.3 jenkins配置java
/root/tools/jdk/jdk1.8.0_144
二、jenkins流水线配置
2.1.新增项目
2.2 springboot项目配置git仓库
这里我使用的国内免费的gittee作为仓库。
先到linux服务器上生成公钥私钥,用来联通linux和git
ssh-keygen -t rsa -C "your_email@youremail.com"
然后两次回车即可,cd ~/.ssh 目录下拷贝公钥到gitee,公钥管理处
公钥存放的文件为id_rsa.pub
私钥存放的文件为id_rsa
- 然后到jenkins配置证书,点击添加证书
这里选择的是ssh username with private key
username和id随便填,下面框框里面填的内容为刚刚生成的私钥
id_rsa里的所有内容。
完成后会报错如下,
Failed to connect to repository : Command "/usr/bin/git ls-remote -h https://gitee.com/jiangbingsong/k8s-demo.git HEAD" returned status code 128:
stdout:
stderr: fatal: Authentication failed for 'https://gitee.com/jiangbingsong/k8s-demo.git/
可能原因:
1.你的秘钥配置填写错误,检查一下就行
2.gittee仓库的权限不是公开的,把它配置成公开,或者设置仓库秘钥重新配置。
仓库秘钥配置的地方如下图,我配置了好几次都失败了,提示成功却没有秘钥出来
然后修改为仓库公开了,在基本信息下面设置仓库公开即可。
2.3 springboot项目配置maven打包
clean install
这里的pom路径为相对路径,根据你仓库地址到pom.xml文件的路径例如我的仓库下载下来的代码pom文件路径就是根路径下的,pom.xml
2.4 系统配置 ssh到hadoop1配置,也就是k8s的master节点
Dashboard-Manage Jenkins-System,publish over ssh 这里配置,
如果没有该选项,则去插件配置里面搜索这个插件安装重启一下就好了。
Passphrase 登录主机的密码
- name 主机名,可以随便填
- hostname 主机ip
- username 登录用户名
- Remote Directory 登录到远端的地址。
编辑完成后点下测试,返回sucess配置成功。
2.6 springboot项目配置拷贝jar包到远端
配置Send files or execute commands over SSH 拷贝生成的jar到远端。
target/demo-0.0.1-SNAPSHOT.jar
target
/root/dockerimage
pwd
echo “传输完成”
- source files jar包生成的相对目录 整个工作空间地址为
/var/lib/jenkins/workspace/springboot maven在springboot下生成target文件夹,从这里开始算 - Remove prefix 前缀 要去掉target否则会连整个文件夹一起拷贝到远端,我们只是想拷贝jar包过去,所以去掉
- Remote directory 拷贝到远端的目录
2.5 springboot项目配置打包完成后的执行脚本
新增远端执行指令,选择刚刚系统配置的远端主机
这个红色的警告不用管,这个是你jenkins要带到远端的文件,我这里不需要带过去,就不配置了。
- Remote directory 远端登录的目录
- Exec command 执行的指令
cd /root/dockerimage
./start.sh
./imagerm.sh
这里要执行的命令,我写成了shell脚本去执行,脚本如下
start.sh如下
#!/bin/sh
#
# 镜像仓库地址
DOCKER_REPOSITORIES="192.168.184.129:5000"
# 项目名称
APP_NAME="springbootdemo"
# 初始化版本号
init_version="0.0.1"
#下一个版本号
nextPlatformTags=""
#登录到私有仓库
# 处理私服docker镜像版本号 旧的版本号
platformRepoTags=$(curl -u jiangbingsong:123456 ${DOCKER_REPOSITORIES}/v2/${APP_NAME}/tags/list |jq ".tags" |awk -F',' '{print $NF}'|sed 's/[][]//' |sed '/^$/d'|sed 's/\"//g')
echo "platformRepoTags:" $platformRepoTags
#去掉空格
platformRepoTags=${platformRepoTags// /}
if [ "$platformRepoTags" = null ]; then
nextPlatformTags="${init_version}"
else
OLD_IFS="$IFS"
IFS="."
arryPlatTags=($platformRepoTags)
IFS="$OLD_IFS"
# 处理私服docker镜像版本号 升级版本
nextPlatformTags=${arryPlatTags[0]}.${arryPlatTags[1]}.$[arryPlatTags[2]+1]
fi
# 构建的命令
APP_NAME_BUILD="${DOCKER_REPOSITORIES}/${APP_NAME}:${nextPlatformTags} ."
echo "构建的命令: build -t ${APP_NAME_BUILD}"
docker build -t ${APP_NAME_BUILD}
#push到镜像仓库
PUSH_APP_NAME="${DOCKER_REPOSITORIES}/${APP_NAME}:${nextPlatformTags}"
#echo "提交到私有镜像仓库命令: docker push ${PUSH_APP_NAME}"
docker login ${DOCKER_REPOSITORIES} -u jiangbingsong -p 123456
docker push ${PUSH_APP_NAME}
#docker logout
kubectl apply -f springbootDeployment.yaml
echo "PUSH_APP_NAME:" ${PUSH_APP_NAME}
kubectl set image -n=webservice deployment/springbootdeploy $APP_NAME=${PUSH_APP_NAME}
echo "success !"
解释下,这里主要做的事有生成docker镜像,查询仓库内的镜像版本号,自动升级版本号,使用版本号进行升级,然后推送到仓库,最后设置deployment的镜像镜像更新。
- springbootdeploy 为你depoyment的名字,
springbootDeployment.yaml 和dockerfile文章内容,前面的文章有,可以找找。
同时springbootDeployment.yaml做以下修改。
清理镜像脚本imagerm.sh如下
这个内容不用改直接用就行,项目镜像只保留最新的2个版本
#!/bin/bash# 获取所有镜像列表,并按照创建时间排序
image_list=$(docker image ls --format "{{.Repository}}:{{.Tag}}|{{.CreatedAt}}" | sort -t "|" -k2,2)# 获取所有镜像名
image_names=$(echo "$image_list" | awk -F ':' '{print $1}' | uniq)# 遍历每个镜像名
for image_name in $image_names; do# 获取特定镜像名的镜像列表filtered_images=$(echo "$image_list" | awk -F ':' -v name="$image_name" '$1 == name')# 获取镜像数量image_count=$(echo "$filtered_images" | wc -l)# 如果镜像数量超过3个,则删除旧的镜像,只保留最近的两个if [ $image_count -gt 3 ]; thenimages_to_delete=$((image_count - 2))images_to_delete_list=$(echo "$filtered_images" | head -n $images_to_delete | cut -d "|" -f 1)for image in $images_to_delete_list; dodocker image rm $imagedonefi
done
2.6 验证
这里我的服务暴露的方式是nodeport,也可以用ingress配置成域名登录,比较麻烦,前面的教程也有弄过,这里这是为了集成jenkins就不搞这么多了。
kubectl get svc --all-namespaces
http://192.168.184.129:30467/hello
返回了200,验证成功。
总结
1.jenkins集成,可以先不直接集成k8s,可以先用jenkins集成java -jar的方式启动,这样能先排除jenkins产生的问题,我这里就不展示过程了,就直接写成了最后的结果。
2.springbootDeployment.yaml文件的镜像拉取设置要修改一下才能拉取到。