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项目