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

Jenkins自动化部署完整流程

在这里插入图片描述

基于Docker安装Jenkins

查看jenkins/jenkins镜像版本

在这里插入图片描述

拉取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

在这里插入图片描述

如果在执行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初始化设置

在这里插入图片描述

获取密钥

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

在这里插入图片描述

跳过新手入门

在这里插入图片描述

在这里插入图片描述

进入Jenkins首页

在这里插入图片描述

创建新用户

在这里插入图片描述

在这里插入图片描述

修改密码

在这里插入图片描述

汉化Jenkins

安装插件

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

重启Jenkins

docker ps
docker restart 容器ID

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

配置Maven环境

安装Maven

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可修改或删除配置文件

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

配置【General】

在这里插入图片描述

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

在这里插入图片描述

安装【Git】插件

在这里插入图片描述

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

在这里插入图片描述

配置【源码管理】

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

在这里插入图片描述

填写Gitlab账号密码

在这里插入图片描述

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

在这里插入图片描述

配置【构建环境】

在这里插入图片描述

配置【Build】

clean install deploy -P prod

在这里插入图片描述

构建任务

保存配置并构建当前任务

在这里插入图片描述

很遗憾,任务构建失败了

在这里插入图片描述

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

在这里插入图片描述

Linux系统下的【localRepository】

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

【General】

在这里插入图片描述

【源码管理】

在这里插入图片描述

【Build】

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

在这里插入图片描述

部署服务

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

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

在这里插入图片描述

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

目录结构:

在这里插入图片描述

文件示例:

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】插件用于连接远程服务器

在这里插入图片描述

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

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

安装SSH

yum install -y openssl openssh-server

生成公钥和私钥

ssh-keygen

直接回车

在这里插入图片描述

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

在这里插入图片描述

确认密码

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

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

ssh-copy-id [email protected]

在这里插入图片描述

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

ssh [email protected]

在这里插入图片描述

进入【系统配置】

在这里插入图片描述

配置【Publish over SSH】

在这里插入图片描述

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

配置【Post Steps】

在这里插入图片描述

配置【Send files or execute commands over SSH】

在这里插入图片描述

构建任务

构建bubble-gateway前:

在这里插入图片描述

构建bubble-gateway

在这里插入图片描述

构建结果:

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

在这里插入图片描述

配置防火墙

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

  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】插件

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

配置Gitlab

填写webhook地址和安全令牌

在这里插入图片描述

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

在这里插入图片描述

【原因】

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

【解决方法】

在这里插入图片描述

测试效果

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

在这里插入图片描述

测试结果:

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

在这里插入图片描述

Jenkins也开始构建任务

在这里插入图片描述

补充配置

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

在这里插入图片描述

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

在这里插入图片描述

全流程测试

开发者push代码至Gitlab

在这里插入图片描述

Jenkins开始构建

在这里插入图片描述

此次构建的修改记录

在这里插入图片描述

Jenkins构建成功

在这里插入图片描述

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

在这里插入图片描述

配置防火墙

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

构建完成所有任务

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_41888963/article/details/129325285