jenkins 构建时 ERROR: transport error 202: bind failed: 地址已在使用
环境jenkins:2.25java:1.7场景最近jenkins在自动构建项目时,总是失败;提示的错误信息如下:ERROR: transport error 202: bind failed: 地址已在使用ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)JDWP exit...
环境
jenkins:2.25
java:1.7
场景
最近jenkins
在自动构建项目时,总是失败;提示的错误信息如下:
ERROR: transport error 202: bind failed: 地址已在使用
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [../../../src/share/back/debugInit.c:750]
FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)
因为是play
项目,所以构建时,我需要执行play precompile
命令,上面错误,就是执行这道命令产生。
其实原因我是知道的,就是端口占用了,play
编译时,需要使用8000
端口,但是服务器上没有程序占用这个端口啊?
后面我分析,因为我沙盒和预正式都配置了该项目的自动升级,所以当检测到代码提交时,两个同时触发构建,总有那么一瞬间,该端口会被占用。
解决办法
第一步
将其中一个的SCM
的时间该长点,比如我把预正式的改为H/3 * * * *
,沙盒的是H/2 * * * *
第二步
在构建触发器
中选择Build after other projects are built
,
在Projects to watch
中,输入项目名称,当输入前几个字母后,其会模糊匹配出已有的项目;上图就是我沙盒项目的名称;
再勾选Trigger even if the build fails
,表示,即使项目构建失败,也触发该项目构建。
成功后,会在(我的项目为zygt-web-test
)页面中看到如下:
总结
写这博客的时候,有时会想,要是沙盒那个项目构建失败了怎么办?
jenkins在构建后操作
这个阶段,有失败重试的机制,但是在构建
的Execute shell
这个阶段没有。
所以出了问题,往往需要人工手动构建,或者等待下一回合。
本篇的问题根源是端口占用,即同一时间,同时构建两个相同端口号的项目,
更好的做法,是将这两个项目的构建时间错开了!
我的经历:
①仅仅只是错开时间,依然会出现这个问题;
②在编译项目之前,不管三七二十一,都强杀端口8000
,—-依然没用。
③按照上面的流程,关键是第二步,虽然有时也会出错,但是其会上个项目构建完成后,紧接着立即构建,至少不需要人工干预了,效果如下图:
构建失败后,其立马又构建了一次,并且成功了;这里的立马
,其实是,上个项目zygt-web-test
构建完成,而此次又构建失败,所以jenkins
又构建了一次。
修改
================2018年5月9号================start============
上面那个思路,虽然zygt-web-pre
,这个项目虽然OK,但是zygt-web-test
一旦出了问题,不人工点击构建
,依然不会自动构建。
今天我换了个做法,从脚本入手,把脚本修改了下:
完整脚本:tcwhile.sh
#!/bin/bash
tc=$1
projectName=$2
if [[ "x" != "x$tc" ]] && [[ "$tc" =~ "错误" || "$tc" =~ "error" || "$tc" =~ "Exception" || "$tc" =~ "exception" ]]
then
echo "=====编译出错====="
sleep 2s
echo "睡2秒,再次执行编译"
count=1
path=`dirname $0`
while [[ "$count" -le 2 ]]; do
cd $path/$projectName
echo `pwd`
tc=`play precompile 2>&1`
if [[ "$tc" =~ "Done" ]]
then
echo $count
break;
fi
count=$((count+1))
echo $count
done
echo "$tc"
exit 1
else
echo "=====编译成功====="
echo "$tc"
fi
我的构建脚本是这样的:
#!/bin/bash
export PATH=/opt/play-1.2.7:$PATH
#获得当前目录
cur=$(pwd)
echo "pwd:"${cur}
fielName="ggnews-web-test"
#编译
tc=`play precompile 2>&1`
# 验证编译是否出错
${WORKSPACE%/*}/tcwhile.sh "$tc" "$JOB_NAME"
#进行打包和压缩,方便传输
rm -rf ${fielName}.tar.gz
rm -rf ./public/*
cp -r cdn/* public/
tar -czf ${fielName}.tar.gz ./app/* ./precompiled ./public
假设编译出错了,我上面的脚本,会休眠2秒后,再去执行编译
,要是还是失败,就再循环一次,再编译
一次,成功就break
出来,失败,就把错误信息打印出来!
================2018年5月9号================end============
更多推荐
所有评论(0)