使用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\r"}}
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 &\r";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 &\r"}
}
expect eof
EOF
elif [ $ref == "refs/heads/dev" ];then
branch_dev
fi