jenkins+mqtt实现本地构建和远程自动发版

Posted gsls200808

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jenkins+mqtt实现本地构建和远程自动发版相关的知识,希望对你有一定的参考价值。

长期以来,一些本地项目发版不是特别友好,需要在IDE里面打war包,然后远程客户电脑传的客户远程机上,远程机和服务器往往不是同一台机器,还需要多一步传输。所以有了下面的软件结构

jenkins+自建/公共mqtt服务器+文叔叔命令行工具+客户机监听消息执行shell

适用于公司和客户都有公网环境的情况。

本文系统使用Rocky Linux 8,命令同样适用于Centos 7/8

一、jenkins安装

1.jenkin安装

推荐配置 4核/4G内存/50G硬盘

对于Rocky Linux 8有4中安装方式,rpm在线离线安装、docker安装、jar包安装、war包安装,这里使用最通用的war包安装

war包安装先要安装jdk tomcat,具体可以参见Centos 7 安装tomcat并设置开机自启_gsls200808的专栏-CSDN博客

war包从Jenkins download and deployment这个网址下载最新的LTS版本即可

war包下载后放到tomcat的webapp目录,这样出来的路径带/jenkins,如果不想带,解压后放到ROOT目录下也可以

我这里的访问网址是

http://10.24.220.102:8080/jenkins/

初次安装可能会提示

Please wait while Jenkins is getting ready to work

等几分钟即可,等几分钟后如果还没有出现初始化界面就需要改配置了。

初始界面需要填入初始密码,使用cat命令可以查看。

cat /root/.jenkins/secrets/initialAdminPassword
2c259dcd73784792a256cb5c0198f971

之后安装插件的界面点击安装推荐的插件接口

管理员界面设置一个管理员账号。

这样jenkins基本就安装完成了。

2.git maven jdk安装和配置

jdk之前安jenkins安过了,这里不赘述

git安装

yum install git

git安装验证

git --version

maven安装

wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
cp apache-maven-3.5.4-bin.tar.gz /usr/local/
cd /usr/local/
tar -zxvf apache-maven-3.5.4-bin.tar.gz
rm apache-maven-3.5.4-bin.tar.gz
mv apache-maven-3.5.4 maven

maven环境变量配置

#编辑 /etc/profile 文件
vi /etc/profile
#末尾增加如下内容
# set maven environment
export M2_HOME=/usr/local/maven
export PATH=$M2_HOME/bin:$PATH

#使环境变量生效
source /etc/profile

maven安装验证

mvn -v

jenkins里的配置

Manage Jenkins-->Global Tool Configuration

点击jdk安装/新增jdk填入如下内容

 点击maven安装/新增maven,填入如下内容

点击git安装/新增git,填入如下内容

 我这里的git默认识别了就不用填git的了,最后点击下方的保存

需要注意的是,已经配置过的项目重新进入这个页面之后不会默认显示,需要点击安装jdk/maven/git按钮才会显示已经配置的信息

3.gitlab插件GitLab+Gitlab API Plugin安装和配置

4.git多分支插件Git Parameter使用

5.maven打包war项目配置

关键命令

clean package -Pdev -U -Dmaven.test.skip

二、上传及mqtt消息发送

1.transfer命令工具安装

下载地址:GitHub - Mikubill/transfer: 🍭 集合多个API的大文件传输工具.

安装:

2.mqtt客户端安装

安装命令

yum install epel-release
yum install mosquitto

3.jenkins上传和发消息shell

完整命令如下

cd ./saas-wis-basic/target
/usr/local/transfer/transfer wss basic.war >wenshushu.txt
endlinestr=$(cat wenshushu.txt | awk 'END print')
echo $endlinestr
str=$endlinestr#*Link: 
mosquitto_pub -h mq.tongxinmao.com -t topic/sunwardpord -m "\\"module\\":\\"saas-wis-basic\\",\\"link\\":\\"$str\\""

4.修改pom的module不编译不需要的工程

shell命令如下

#删除<modules>下的第一行
sed -i '/<modules>/n;d' pom.xml
#在<modules> 下添加 <module>saas-wis-production</module>
sed -i '/<modules>/a\\ <module>saas-wis-production<\\/module>\\n' pom.xml

三、客户端接收mqtt消息自动备份替换war包重启tomcat发版

目前计划用go+shell脚本实现。后续开发完再补充。

1.go接收mqtt消息部分实现

// test
package main

import (
	"fmt"
	"os"
	"os/signal"

	mqtt "github.com/eclipse/paho.mqtt.golang"
)

var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) 
	fmt.Printf("Received message: %s from topic: %s\\n", msg.Payload(), msg.Topic())
	//读取发布配置,备份war包,替换war包,重启tomcat或者docker


var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) 
	fmt.Println("Connected")


var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) 
	fmt.Printf("Connect lost: %v", err)


func main() 

	//合建chan
	c := make(chan os.Signal)
	//监听指定信号 ctrl+c kill
	signal.Notify(c, os.Interrupt, os.Kill)
	//阻塞直到有信号传入
	fmt.Println("启动")

	//执行具体方法
	initmqtt()

	//阻塞直至有信号传入
	s := <-c
	fmt.Println("退出信号", s)



func initmqtt() 
	var broker = "mq.tongxinmao.com"
	var port = 1883
	opts := mqtt.NewClientOptions()
	opts.AddBroker(fmt.Sprintf("tcp://%s:%d", broker, port))
	opts.SetClientID("go_mqtt_client")
	opts.SetUsername("emqx")
	opts.SetPassword("public")
	opts.SetDefaultPublishHandler(messagePubHandler)
	opts.OnConnect = connectHandler
	opts.OnConnectionLost = connectLostHandler
	client := mqtt.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil 
		panic(token.Error())
	

	sub(client)


func sub(client mqtt.Client) 
	topic := "topic/sunwardpord"
	token := client.Subscribe(topic, 1, nil)
	token.Wait()
	fmt.Printf("Subscribed to topic: %s\\n", topic)

2.客户端发布json定义

定义moudule名、war包目录、替换war前后执行的脚本

3.客户端解析json调用shell脚本实现

以上是关于jenkins+mqtt实现本地构建和远程自动发版的主要内容,如果未能解决你的问题,请参考以下文章

使用Jenkins Pipeline自动化构建发布Java项目

Jenkins扩展共享库进阶

Jenkins+Docker+Maven+gitlab实现自动构建远程发布

Jenkins构建推送拉取镜像和发布应用

Jenkins构建推送拉取镜像和发布应用

一个jenkins远程操作另一个jenkins进行构建