Jenkins+Dcoker+Gitee+Rancher实现SpringBoot项目的持续集成自动化部署以及管理

前言:

无论工作中还是平时自己写代码,我们经常需要部署各种环境,作者经历的部署方式。
(1)本地打war/jar包,上传到服务器放到Tomcat或者原始命令java -jar xxx.war方式启动项目
(2)服务器安装git,通过跑脚本在服务器上运行。
以上方式对于经常要进行部署的项目来说每次更新代码都需要打包、上传、执行命令、删除原来的包,对于开发人员来说这会是意见非常烦躁和无聊的事情。
本文作者通过Jenkins+Dcoker+Gitee+Rancher的集成教大家实现代码的持续集成自动化部署,解放出你的时间做更多的业务逻辑开发工作。

1、架构图

在这里插入图片描述

2、Jenkins
2.1Jenkins安装

Jenkins可以在Docker中安装也可以在服务器(centos)中直接安装,作者推荐后者,Docker中的安装会遇到各种问题,Jenkins工作路径要挂载到外部,而且安装完成后下载插件各种失败,改了国内下载地址依然不行,通过离线插件引入的方式也不好用总之个人感觉很坑,也有可能是我的方法不对。后来想了想放在Docker中确实没有必要
以下安装教程是基于Centos7进行的安装,作者不推荐Windows安装
请移步至作者的另一篇博客:https://blog.csdn.net/m0_37027631/article/details/104987046
改文章详细描述了Jenkins的安装、备份、迁移

2.2Jenkins插件安装
2.2.1 插件下载地址修改

因为国外地址访问比较慢,所以修改成国内下载地址会提高插件的下载速度 ,修改站点地址为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
在这里插入图片描述

2.2.2 Publish Over SSH插件安装

安装该插件的目的是为了在创建任务的构建环节添加Send files or execute commands over SSH(文章下面详细介绍为何要添加Send files or execute commands over SSH环节)
在这里插入图片描述

2.2.3 其他插件

由于插件的安装方式与2.2.2中的操作步骤是相同的,本文不做过多赘述。罗列以下需要装的插件Git、Git plugin、Gitee plugin、maven-plugin根据自己的需要进行安装

2.3全局工具配置

在项目的构建过程中需要Java、Maven、Git等环境

2.3.1 JDK环境配置

别名:自己起名 v
JAVA_HOME:服务器中jdk路径
填入路径之后如果有报错,说明路径不对
服务器中安装java环境自行百度,基础操作不多说

在这里插入图片描述

2.3.2Maven

name:自己起名字
MAVEN_HOME:服务器中安装maven的路径
服务器中安装maven自行百度,基础操作不多说
在这里插入图片描述

2.3.3Git

服务器中安装Git环境自行百度,基础操作不多说 强调一点,Git安装版不能太低1.8以上,服务器默认安装的是1.8会有出错的风险
在这里插入图片描述

2.3.4 Publish over SSH配置

通常情况下Jenkins需要自动化部署的项目会分布于多个服务器,Publish over SSH配置就是通过SSH的方式建立服务器之间的连接实现Jenkins的一些列操作
(1)系统管理 -> 系统配置->Publish over ssh
(2)如下图,这里主要是配置 Jenkins ssh key 来登录服务器,然后通过 ssh 的方式发送的远程主机,以达到远程部署的目的,一般有密码和密钥两种方式配置,本文使用密钥的方式来配置
在这里插入图片描述

在这里插入图片描述

Passphrase:私钥 key 的密码,如果密钥使用了密码加密,则在此处进行设置。
Path to key:Jenkins master上要使用的私有 SSH密钥 的位置,路径可以是密钥的绝对路径,也可以是相对于JENKINS_HOME目录的路径。(可忽略)
Key:将服务器上的私钥粘贴到这里,密钥应包括页眉和页脚(----)以及介于两者之间的所有内容。
(3)ssh server 配置
SSH Server Name:表示这个 ssh 的名字,自定义
Hostname:需要连接ssh的主机名或ip地址,此处填写应用服务器IP,本文中,Jenkins 服务器跟应用服务器一台机,所以是 127.0.0.1
Username:服务器 ssh 登录的用户名
Remote Directory:远程部署目录,Jenkins 会将包传到这个目录下。
   点击 Test Configuration,出现 success 就表示成功了,如果是 auth fail ,就要注意密钥是否正确以及配对成功。可以添加多个 ssh server,发送给多个应用服务器进行部署,jenkins 配置 ssh 服务器的时候,需要在服务器生成密钥对,私钥复制到 key 值里,然后将公钥复制到 authorized_keys (该文件与公钥、私钥都在服务器的/root/.ssh路径下)文件里面去,才可以连接远程主机成功。 ssh密钥生成命令:ssh-keygen -t rsa
在这里插入图片描述

2.3.5Gitee

Gitee Jenkins Plugin 是码云基于 GitLab Plugin 开发的 Jenkins 插件。用于配置 Jenkins 触发器,接受码云平台发送的 WebHook 触发 Jenkins 进行自动化持续集成或持续部署,并可将构建状态反馈回码云平台。本文文中描述的框架未曾用到触发器,此章节可以忽略
(1)系统管理 -> 系统配置->Gitee
链接名:自己起名
Gitee 域名 URL:https://gitee.com 在这里插入图片描述
证书令牌:
Gitee APIV5 私人令牌:从Gitee中生成的私人令牌
在这里插入图片描述
(2)Gitee生成私人令牌方式
在这里插入图片描述

2.3.6 添加凭据

在构建项目的->源码管理 用的到
在这里插入图片描述
构建Gitee账号密码的凭据
非常玄学的地方 以下是废话
作者遇到了比较头疼的问题,前期作者用的是密钥方式的凭据(通过git生成密钥的方式,基于gitee账号的邮箱生成的),我在凭据中添加了两个凭据一个是Gitee账号密码,一个是密钥的凭据,我选择密钥凭据的时候提示无法拉去gitee上的代码,然后选择账号密码的凭据就可以,但是更加扯淡的是我的账号密码随便输入都可以,很懵逼,但就是可以。于是我就这样用着,直到集成Publish over SSH的时候也需要密钥,于是我用git命令生成的密钥怎么都不行,此时我把git生成的密钥删除之后通过ssh-keygen -t rsa命令生成新的密钥这个时候我发现源码管理的地方又报错了感觉很懵逼,于是我就换了gitee用户密码的方式从gitee上拉取项目,这个时候懵逼的事情又出现了:用户密码的方式依然不行,于是我把我要拉取的项目改成了公开然后就可以,更扯淡的还在后面,当我把项目改成私有之后竟然就不报错了,挺懵逼的,不知道是Jenkins反应慢还是什么我操作有问题
在这里插入图片描述
添加Gitee用户/密码的凭证
在这里插入图片描述
最后讲基于Jenkins构建一个完整的SpringBoot项目

3、Docker
3.1安装部署

(1)安装Dockeryum -y install docker
(2)启动Dockersystemctl start docker
(3)设置开机自启动systemctl enable docker

4、Docker中安装Rancher
4.1安装部署

(1)安装Rancherdocker run -d --name=rancher --restart=always --privileged=true -p 80:8080 rancher/server
一般需要先去Docker Hub中下载Rancher镜像,再执行上面的命令,如果直接执行,会默认下载最新的Rancher镜像

4.2Rancher配置

(1)通过docker ps指令查看Racnher的运行情况,如果正常通过IP:80访问Rancher的客户端,如果启动失败通过docker ps -a查看未启动的rancher的ID,然后通过docker logs ID查看报错日志
(2)第一次访问需要设置账户/密码
在这里插入图片描述
(3)添加主机
图片中的操作要仔细看幺
在这里插入图片描述
(4)主机添加完成之后可以看到docker容器中的所有服务
在这里插入图片描述

5、Jenkins构建项目

上面所有的工作准备完成之后,就可以开始构建项目了
(1)创建下图项目
项目名称:baiduapplet
在这里插入图片描述
(2)添加git源码管理
这里其实推荐配置使用SSH免密,我这边多次配置之后各种连不上,放弃治疗了,就直接用账密登录了,点击添加,Domain选择全局凭据,类型选择Username with password。
连接成功后,选择你的分支,比如测试环境,你就填测试分支,生产就填生产的分支
在这里插入图片描述
凭据添加方式在——2.3.6 添加凭据中写的非常详细了
(3)构建触发器
这里一般测试环境我们希望,只要push代码到仓库,gitee就会触发webhook执行此任务(会给你配置的 url 发送一个post请求),这种比轮询要高效一点,但是生产环境的话建议还是使用手动点击构建。
(4)构建环境
在这里插入图片描述
(5)构建
这一步我们将通过shell脚本完成备份-编译-打包-发布等一系列操作。
第一步,执行maven打包命令,这一步会在你的jenkins容器内完成,然后把你的源码打成jar包,路径如下:
/var/jenkins_home/workspace/baiduapplettarget/xxx.war
其中baiduapplet为你的任务名,如果你改了的话,这个目录也会改
在这里插入图片描述
第二步,执行shell脚本,这里暂只做备份jar,生成Dockerfile,这里有个坑,就是容器内的时区可能不对,导致java获取的时间有问题,这里解决方案是在生成Dockerfile的时候加上Asia/Shanghai
在这里插入图片描述
脚本:

#!/bin/bash
# 上面这个东西不加,会报空间不足异常
# 注意:所有镜像,容器和应用的命名,最好不要有大写字母

# docker镜像/容器名字
SERVER_NAME=baiduapplet
# 操作/项目路径(Dockerfile和Jar存放的路径)
BASE_PATH=/var/jenkins_home/docker/project/$SERVER_NAME
# 备份目录
BACKUP_PATH=/var/jenkins_home/docker/project/backup


# jar名字
JAR_NAME=$SERVER_NAME-0.0.1-SNAPSHOT.war
# 源jar路径(注:更新任务名需要同步更新这个路径,例:baiduapplet)
SOURCE_PATH=/var/lib/jenkins/workspace/$SERVER_NAME/target/$JAR_NAME
# 当前日期时间
DATE=`date +%Y%m%d-%H%M%S`

# 备份
function backup(){
	if [ ! -d $BACKUP_PATH  ]; then
  		mkdir $BACKUP_PATH
	else
  		echo "备份文件夹已存在"
	fi

	if [ -f "$BASE_PATH/$JAR_NAME" ]; then
    	echo "$JAR_NAME 备份..."
        	cp $BASE_PATH/$JAR_NAME $BACKUP_PATH/$SERVER_NAME-$DATE.jar
        echo "备份 $JAR_NAME 完成"
    else
    	echo "$BASE_PATH/$JAR_NAME不存在,跳过备份"
    fi
}

# 迁移,构建好的Jar包,复制到DockerFile一起
function transfer(){

    echo "迁移代码开始"
    
    rm -rf $BASE_PATH
    
    mkdir -p $BASE_PATH
    
    echo "最新构建代码 $SOURCE_PATH 迁移至 $BASE_PATH ...."
        cp $SOURCE_PATH $BASE_PATH 
        
    echo "迁移完成"
    
}

# 生成Dockerfile文件
function dockerfile(){
	echo "开始生成Dockerfile文件"
    
echo """

FROM java:8

ADD $JAR_NAME $JAR_NAME

#更改容器时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 容器启动后执行的操作
CMD java -jar $JAR_NAME

""" > $BASE_PATH/Dockerfile
	echo "生成Dockerfile文件成功"

}


#入口
backup		# 1:备份
transfer	# 2:迁移
dockerfile	# 3:生成dockerfile

第三步,ssh内执行shell脚本,这里为啥要放ssh呢,因为容器内是没办法使用宿主机的命令的,所以得通过ssh,这里配置参考这里,配置好之后再jenkins的系统设置中添加SSH Server ,执行脚本,功能:停止->删除旧容器,删除旧镜像,重建镜像,run容器
下图中的腾讯云服务器宿主机就是在——2.3.4 Publish over SSH配置 中添加的
在这里插入图片描述
脚本:

#!/bin/bash
# 上面这个东西不加,会报空间不足异常
# 注意:所有镜像,容器和应用的命名,最好不要有大写字母

# docker镜像/容器名字
SERVER_NAME=baiduapplet
# 操作/项目路径(Dockerfile和Jar存放的路径)
BASE_PATH=/var/jenkins_home/docker/project/$SERVER_NAME

# 端口号
APP_PORT=8080 #应用的端口
E_PORT=8080 #服务暴露给外部调用的端口
# 容器id
CID=$(docker ps -a | grep "$SERVER_NAME" | awk '{print $1}')
# 镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')

function dockerBuild(){
	if [ -n "$CID" ]; then
		echo "存在$SERVER_NAME容器,CID=$CID,删除容器 ..."
			docker rm -f $CID 
		echo "$SERVER_NAME容器删除完成..."
	else
		echo "不存在$SERVER_NAME容器..."
	fi


	if [ -n "$IID" ]; then
		echo "存在$SERVER_NAME镜像,IID=$IID"
        docker rmi -f $IID
        echo "镜像删除完成"
		cd $BASE_PATH
		docker build -t $SERVER_NAME .
        echo "镜像构建完成"
	else
		echo "不存在$SERVER_NAME镜像,开始构建镜像"
		cd $BASE_PATH
        docker build -t $SERVER_NAME .
        echo "镜像构建完成"
	fi
    
    echo "启动容器..."
    docker run --name $SERVER_NAME -d -p $E_PORT:$APP_PORT $SERVER_NAME
    echo "容器启动完成"
}

dockerBuild	# 4:停止->删除旧容器,删除旧镜像,重建镜像,run容器


保存后点击立即构建
在这里插入图片描述
查看控制台输出
在这里插入图片描述
然后访问构建的baiduapplet项目进行验证,查看Dcoker容器docker ps
在这里插入图片描述
(6)Rancher查看docker中发布的springboot项目
点击主机,你会发现baiduapplet项目已经运行在里面了,点击查看详情在这里插入图片描述
在这里插入图片描述
查看日志
在这里插入图片描述
日志都在这里了,是不是比在服务器上通过java -jar xxx.war方便快捷多了
在这里插入图片描述
心得
虽然部署整个框架要花费挺长的时间,作者用了两天的时间部署完成的,中间遇到了很多坑,好在最后顺利完成了。但是之后的开发工作你就可以只关注与代码的业务逻辑了,不用在被每次的部署所困扰。工欲善其事必先利其器,希望本篇文章对大家有所帮助。还有不懂得地方可以扫描下面的微信二维码,备注“CSDN”。有问题也欢迎大家指出。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
非常抱歉,但是我无法为您提供实际的代码或详细步骤。我可以给您一个大致的指导方向,帮助您开始搭建这样的环境。请注意,这只是一个简单的概述,具体的步骤可能会因您的具体需求而有所不同。在开始之前,请确保您已经安装了Docker并且具备一定的Linux基础知识。 1. 安装Docker:根据您的Linux发行版,安装Docker并确保其正确运行。 2. 创建Jenkins容器:使用Docker命令创建一个Jenkins容器,并指定端口映射以及其他配置参数。例如: ``` docker run -d -p 8080:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts ``` 这将在本地主机上启动一个Jenkins容器,并将Jenkins的Web界面映射到主机的8080端口。 3. 安装Allure:在Jenkins容器中安装Allure插件。打开Jenkins的Web界面,在“管理插件”中搜索并安装Allure插件。 4. 安装JDK:在Jenkins容器中安装JDK。您可以使用Dockerfile来自定义Jenkins容器,并在其中安装JDK。例如: ``` FROM jenkins/jenkins:lts USER root RUN apt-get update && apt-get install -y openjdk-11-jdk USER jenkins ``` 然后使用Docker命令构建并运行该容器。 5. 安装Python和Pytest:在Jenkins容器中安装Python和Pytest。您可以使用Jenkins的插件管理界面来安装相关的插件,例如Python插件和Pytest插件。 6. 配置Gitee集成:在Jenkins的Web界面中,配置Gitee集成。您可以使用Gitee插件来实现Gitee集成,例如拉取代码、触发构建等。 这只是一个大致的指导方向,具体的步骤和配置可能会因您的具体需求而有所不同。请参考相关文档和教程以获取更详细的信息。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪头的彩虹糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值