Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署

冒泡APP(升级版)之Jenkins自动化部署

      • Jenkins自动化部署完整流程
      • 基于Docker安装Jenkins
      • Jenkins基本配置
          • Jenkins初始化设置
          • 汉化Jenkins
          • 配置JDK
          • 配置Maven环境
      • 编译代码并打包成Jar,上传至Maven私服
          • 新建任务
          • 构建任务
      • 将编译/打包完成的Jar包,上传至部署服务器并运行
          • 新建任务
          • 部署服务
          • 连接部署服务器
          • 构建任务
      • 开发者push/merge代码至指定分支(master)时触发构建
          • 配置Jenkins
          • 配置Gitlab
          • 测试效果
          • 补充配置
      • 全流程测试

Jenkins自动化部署完整流程

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第1张图片

基于Docker安装Jenkins

查看jenkins/jenkins镜像版本

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第2张图片

拉取Jenkins镜像

docker pull jenkins/jenkins:2.346.3-2-lts-jdk11

创建Jenkins挂载目录并授权

mkdir -p /home/jenkins/jenkins_home
chmod 777 /home/jenkins/jenkins_home

运行Jenkins

docker run -d \
	-p 8850:8080 -p 50000:50000 \
	-v /home/jenkins/jenkins_home:/var/jenkins_home \
	-v /etc/localtime:/etc/localtime \
	--restart=always jenkins/jenkins:2.346.3-2-lts-jdk11

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第3张图片

如果在执行docker run命令时遇到以下错误,重启docker后再执行

docker: Error response from daemon: driver failed programming external connectivity on endpoint boring_mclean (bbd33296c7b1a2c851c31db07d6dd7a44a95d1b5fa443c08e59508f1524790b9):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 50000 -j DNAT --to-destination 172.17.0.2:50000 ! -i docker0: iptables: No chain/target/match by that name.

重启docker

systemctl restart docker

关闭防火墙

systemctl stop firewalld

Jenkins基本配置

Jenkins初始化设置

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第4张图片

获取密钥

docker ps
docker exec -it 容器ID /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
exit

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第5张图片

跳过新手入门

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第6张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第7张图片

进入Jenkins首页

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第8张图片

创建新用户

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第9张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第10张图片

修改密码

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第11张图片

汉化Jenkins

安装插件

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第12张图片

选择【Available】,搜索【Localization】,选中【Localization: Chinese (Simplified)】插件,点击【Install without restart】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第13张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第14张图片

重启Jenkins

docker ps
docker restart 容器ID

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第15张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第16张图片

配置JDK
docker ps
docker exec -it 容器ID /bin/bash
echo $JAVA_HOME
exit

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第17张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第18张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第19张图片

配置Maven环境

安装Maven

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第20张图片

安装【Config File Provider】插件(用于管理配置文件)

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第21张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第22张图片

在【Managed files】中创建settings.xml文件

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第23张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第24张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第25张图片

可修改或删除配置文件

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第26张图片

在【全局工具配置】中配置settings.xml文件

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第27张图片

编译代码并打包成Jar,上传至Maven私服

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第28张图片

  1. Jenkins从Gitlab上拉取代码;
  2. Jenkins从Nexus上拉取Jar包;
  3. Jenkins将编译/打包完成的文件或者Jar包上传至Nexus;
新建任务

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第29张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第30张图片

由于没有构建Maven项目的选项,因此我们还需要安装【Maven Integration】插件

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第31张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第32张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第33张图片

配置【General】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第34张图片

由于源码管理是无,因此我们还需要安装【Git】插件管理源码(暂时保存配置)

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第35张图片

安装【Git】插件

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第36张图片

安装完成后回到刚刚的配置页面

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第37张图片

配置【源码管理】

连接Gitlab代码仓库,添加Git管理凭证

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第38张图片

填写Gitlab账号密码

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第39张图片

无红色报错提示则说明Git仓库已经成功连接

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第40张图片

配置【构建环境】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第41张图片

配置【Build】

clean install deploy -P prod

在这里插入图片描述

构建任务

保存配置并构建当前任务

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第42张图片

很遗憾,任务构建失败了

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第43张图片

根据错误提示,我们可以发现这是因为settings.xml文件存在问题所导致的,我们需要把【localRepository】配置为当前linux系统的目录

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第44张图片

Linux系统下的【localRepository】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第45张图片

创建【localRepository】目录,并授权(Jenkins需要写入Jar包的权限)

docker ps
docker exec -ti --user root 容器ID sh
mkdir -p /usr/maven/bubble
chmod 777 /usr/maven/bubble
exit

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第46张图片

重新构建任务,如下图则说明任务构建成功

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第47张图片

检查项目代码是否成功deploy到了maven私服上,可以根据最后修改时间进行判断(GMT是格林尼治时间,北京时间CST=GMT+8小时)

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第48张图片

将编译/打包完成的Jar包,上传至部署服务器并运行

到这里我们已经可以从Git上拉取代码并进行构建了,但是构建完之后我们还需要实现代码的自动化部署。

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第49张图片

  1. Jenkins从Gitlab上拉取代码;
  2. Jenkins从Nexus上拉取Jar包;
  3. Jenkins将编译/打包完成的文件或者Jar包上传至Nexus;
  4. Jenkins将编译/打包完成的Jar包上传至部署服务器的指定目录,并执行shell脚本运行此Jar包;
新建任务

再新建一个任务,复制bubble-parent的配置内容

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第50张图片

根据情况调整有差异化的配置

【General】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第51张图片

【源码管理】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第52张图片

【Build】

clean install deploy -Dmaven.test.skip=true -P prod

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第53张图片

部署服务

保存调整好的配置,在实现自动化部署之前我们还需要进行一些准备,需要准备一下部署项目的服务器。

接下来我会用这台云服务器进行部署微服务

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第54张图片

部署的方式:Jenkins构建项目并打成Jar包上传至(部署微服务的)服务器后,再执行sh文件将Jar包制作成docker镜像并运行。比如Jenkins在构建bubble-gateway时,将打包好的bubble-gateway.jar上传至/home/bubble-app/bubble-gateway(具体目录结构如下图),上传完毕之后会执行bubble-gateway.sh脚本,将bubble-gateway.jar制作成docker镜像并运行。

目录结构:

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第55张图片

文件示例:

Dockerfile

FROM adoptopenjdk/openjdk11:jdk-11.0.8_10-alpine
# 复制文件到容器
ADD bubble-gateway.jar /bubble-gateway.jar
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","-Duser.timezone=GMT+08 -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx512m","/bubble-gateway.jar"]

bubble-gateway.sh

#!/bin/bash
server_name=bubble-gateway
server_port=81

echo $server_name
if [[ -n $(docker ps | grep $server_name) ]];then
	echo $server_name
	
	docker stop $server_name
	
	docker rm -f $server_name
	
	docker rmi -f $server_name
fi

docker build -t $server_name .

docker run --name $server_name -it --restart=always -v /etc/localtime:/etc/localtime:ro -d -p $server_port:$server_port $server_name
连接部署服务器

准备好了这些之后我们需要让Jenkins将构建好的Jar包上传至云服务器

首先我们需要在Jenkins上安装【Publish over SSH】插件用于连接远程服务器

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第56张图片

生成SSH密钥,并将公钥发布到(部署微服务的)服务器

在Jenkins服务器上执行以下操作

安装SSH

yum install -y openssl openssh-server

生成公钥和私钥

ssh-keygen

直接回车

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第57张图片

设置一个【passphrase】密码,也可以不加密码直接回车。我这里设置了密码,比如【honey】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第58张图片

确认密码

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第59张图片

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第60张图片

密钥默认存放的路径:/root/.ssh

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第61张图片

其中id_rsa为私钥,id_rsa.pub为公钥

将公钥发布到(部署微服务的)服务器(root 是远程服务器的登录名,@ 后面是目标服务器IP)

ssh-copy-id [email protected]

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第62张图片

验证免密连接是否成功,无需输入密码登录到47.102.152.222即可。

ssh [email protected]

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第63张图片

进入【系统配置】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第64张图片

配置【Publish over SSH】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第65张图片

完成配置后,点击下方的【Test Configuration】,如果出现【Success】则说明连接成功

配置【Post Steps】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第66张图片

配置【Send files or execute commands over SSH】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第67张图片

构建任务

构建bubble-gateway前:

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第68张图片

构建bubble-gateway

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第69张图片

构建结果:

bubble-gateway.jar文件成功上传至/home/bubble-app/bubble-gateway目录,且创建bubble-gateway容器并运行

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第70张图片

配置防火墙

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第71张图片

访问正在运行的bubble-gateway项目

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第72张图片

开发者push/merge代码至指定分支(master)时触发构建

到这里说明自动化部署已经成功了,接下来我们还需要优化一下Jenkins构建的触发方式,期望能够在往Gitlab上的指定分支(如master分支)push或者merge代码时触发构建,该功能我们可以通过webhook进行实现。

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第73张图片

  1. Developer将代码push/merge至指定分支(master);
  2. Gitlab通过web钩子对Jenkins发送webhook请求,Jenkins收到请求后则开始构建任务;
  3. Jenkins从Gitlab上拉取代码;
  4. Jenkins从Nexus上拉取Jar包;
  5. Jenkins将编译/打包完成的文件或者Jar包上传至Nexus;
  6. Jenkins将编译/打包完成的Jar包上传至部署服务器的指定目录,并执行shell脚本运行此Jar包;
配置Jenkins

安装【Gitlab】插件

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第74张图片

安装完成【Gitlab】插件后,则会出现如下图所示的选项

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第75张图片

【http://192.168.102.130:8850/project/bubble-parent】为webhook地址,在配置Gitlab时需要用到该地址,当Gitlab收到用户的合并请求等操作后会通过Web钩子调用该地址,以达到自动化的目的。

点击【高级】,配置更多信息

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第76张图片

点击【Generate】,生成安全令牌

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第77张图片

配置Gitlab

填写webhook地址和安全令牌

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第78张图片

在点击【增加Web钩子】时出现了异常

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第79张图片

【原因】

Gitlab 10.6 版本以后为了安全,默认不允许向本地网络发送webhook请求,但是可以修改默认值

【解决方法】

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第80张图片

测试效果

重新【增加Web钩子】成功后,发送Push事件测试一下

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第81张图片

测试结果:

HTTP 200(说明发送请求成功)

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第82张图片

Jenkins也开始构建任务

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第83张图片

补充配置

当开发者push/merge到master分支时才会发送事件

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第84张图片

Jenkins只有收到push/merge到master分支的请求才会触发构建

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第85张图片

全流程测试

开发者push代码至Gitlab

Jenkins开始构建

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第86张图片

此次构建的修改记录

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第87张图片

Jenkins构建成功

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第88张图片

部署服务器接收到Jar包后,制作成Docker镜像并运行

配置防火墙

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第89张图片

不过在访问时发现项目启动异常了,根据错误日志,可以定位到是由于数据库连接等配置统一放置在bubble-common,而bubble-common和bubble-auth是一起构建的,导致bubble-auth读取的公共依赖依然是bubble-common构建前的代码。之后可以关注一下项目关系,建立上下游项目关系,让多个项目能够有序的构建。

重新构建一下bubble-auth就能看到效果啦

Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署_第90张图片

构建完成所有任务

在这里插入图片描述

你可能感兴趣的:(Bubble,jenkins,mr,自动化)