使用Generic Webhook Trigger插件实现Jenkins+WebHooks(云效)持续集成

使用Generic Webhook Trigger插件实现Jenkins+WebHooks(云效)持续集成

一,业务背景

我们在开发的时候,特别是前后端分离的时候,前端需要我们后端提供的API接口,可能需要每次有一个接口的变动都需要重新部署到dev环境上,例如:最常见的Git工作流的方式,develop和master是分开的,在开发过程中提交的代码首先合并到develop上,如下图:

如果,使用Jenkins做集成工具,每次有代码合并的时候,也需要手动的去构建:

这是一件很繁琐的事情,如何实现当代码自动提交到develop分支的时候自动触发构建功能,目前,有效的解决方案是使用“钩子”。

钩子功能(callback),是帮助用户push了代码后,自动回调一个您设定的http地址。 这是一个通用的解决方案,用户可以自己根据不同的需求,来编写自己的脚本程序(比如发邮件,自动部署等)。

这里就学习一下代码托管在云效平台上,使用通用的“Generic Webhook Trigger” 插件实现。

关于“云效”WebHooks的介绍及使用请参考:https://thoughts.aliyun.com/sharespace/5e8c37eb546fd9001aee8242/docs/5fe1ba4220764b001fa6b725

二,准备工作

1.安装Generic Webhook Trigger插件

在“系统设置–插件管理–可选插件”界面搜索:Generic Webhook Trigger,可以看到,点击安装,然后重启。

这里是我已经装过,所以在“已安装”界面给大家看一下!

三,搭建工作

一、创建Job

这里我的是自由风格项目,

二、配置Job

1)源码管理

2)构建触发器

由HTTP请求触发http://JENKINS_URL/generic-webhook触发器/调用

Git存储库中有一些配置示例。

你可以在这里摆弄JSONPath。您可能还想在这里检查语法。

您可以在这里摆弄XPath。您可能还想在这里检查语法。

你可以在这里摆弄正则表达式。您可能还想在这里检查语法。

如果您的作业没有参数化,那么解析的变量只会贡献给构建。如果您的作业是参数化的,并且您解析了与这些参数同名的变量,那么在触发作业时插件将填充这些参数。例如,这意味着您可以将参数与SCM插件(如GIT插件)结合使用来选择分支。

3)定义post请求中的变量

4)post 请求url加密令牌

5)拉取代码仓库的条件

6)构建作业的条件

7) 执行shell开始构建作业

四,构建shell代码

# 定义打印变量信息的函数
function print_info() {
	echo "${ref}"
	echo "${project}"
}

print_info
# 开始编译代码
mvn clean package -DskipTests

# 定义dev分支的函数
function branch_dev() {
	echo "dev"
	service_ip=`netstat -lntp | grep 9181 | awk '{print $7}' | awk -F'/' '{print $1}'`
	api_ip=`netstat -lntp | grep 9100 | awk '{print $7}' | awk -F'/' '{print $1}'`
        kill -9 $service_ip $api_ip
	sleep 3
	cd /app/apps/ && tar czf skyfish.tar.gz skyfish-core-service*.jar skyfish-shop-api*.jar
	mkdir  /yunyu_down/${BUILD_NUMBER}
	mv /app/apps/*.tar.gz  /yunyu_down/${BUILD_NUMBER}/
	cp /var/lib/jenkins/workspace/skyfish-test/skyfish-shop-api/target/*.jar /app/apps/
	cp /var/lib/jenkins/workspace/skyfish-test/skyfish-core-service-build/target/*.jar /app/apps/
        bash /root/test_execute.sh
}

    # 脚本的代码
[root@skyfish-studio-test ~]# vim test_execute.sh 
sleep 3
nohup java -jar  -Xms128M -Xmx1024M /app/apps/skyfish-core-service-build*.jar --spring.config.location=/app/apps/config/skyfish-core-service-build/ >> /app/logs/skyfish-core-service-build/catalina.out &
nohup java -jar  -Xms128M -Xmx1024M /app/apps/skyfish-shop-api-0.0.1*.jar --spring.config.location=/app/apps/config/skyfish-shop-api/ >> /app/logs/skyfish-shop-api/catalina.out &


# 定义master分支的函数
function branch_master() {
	echo "master"
	rsync skyfish-core-service-build/target/*.jar root@172.16.1.1:/app/apps/
	rsync skyfish-shop-api/target/*.jar root@172.16.1.1:/app/apps/
	
	cat > /root/master_excute.sh <<- ENDEOF
	cd /app/apps/ && tar czf skyfish.tar.gz skyfish-core-service*.jar skyfish-shop-api*.jar
	mkdir -p  /yunyu_down/${BUILD_NUMBER}/
	mv /app/apps/*.tar.gz  /yunyu_down/${BUILD_NUMBER}/
	api_port=$(netstat -lntp | grep 9100 | awk '{print $7}' | awk -F'/' '{print $1}')
	service_port=$(netstat -lntp | grep 9181 | awk '{print $7}' | awk -F'/' '{print $1}')
	if [[ -z $api_port ]];then 
	    echo '没有启动api服务 不用kill掉 直接启动就好了'; 
	else 
	    kill -9 $api_port &> /dev/null 
	fi
	
	if [[ -z $service_port ]];then 
	    echo '没有启动service服务 不用kill掉 直接启动就好了'; 
	else 
	    kill -9 $service_port &> /dev/null 
	fi
	ENDEOF
	chmod +x /root/master_excute.sh
	rsync /root/master_excute.sh root@172.16.1.1:/root/
	expect <<- EOF
	spawn ssh -tt 172.16.1.1
	expect {
	"Compute Service !" {send "bash /root/master_excute.sh
"}}
	expect eof
	EOF
}
	
# 判断post请求触发的那个分下的环境 代码部署到相应的环境中
if [ $ref == "refs/heads/master" ];then
	branch_master
	sleep 3
	expect <<- EOF
	spawn ssh -tt 172.16.1.1
	expect {
	"Compute Service !" {send "nohup java -jar -Xms128M -Xmx2048M /app/apps/skyfish-core-service-build-0.0.1-SNAPSHOT.jar --spring.config.location=/app/apps/config/skyfish-core-service-build/ >> /app/logs/skyfish-core-service-build/catalina.out &
";exp_continue}
	"stderr to stdout" {send "nohup java -jar  -Xms128M -Xmx2048M /app/apps/skyfish-shop-api-0.0.1-SNAPSHOT.jar --spring.config.location=/app/apps/config/skyfish-shop-api/ >> /app/logs/skyfish-shop-api/catalina.out &
"}
	}
	expect eof
	EOF
elif [ $ref == "refs/heads/dev" ];then
	 branch_dev
fi
原文地址:https://www.cnblogs.com/xiaolang666/p/14790204.html