Jenkins集成OWASP ZAP执行停滞于监听状态求助
问题排查与解决方案
核心原因
第一个Execute Zap Jar阶段中,ZAP启动命令未在Jenkins Shell中真正后台运行,Jenkins的sh步骤会一直等待该命令执行退出,但ZAP守护进程启动后会持续运行,导致步骤停滞。
修复步骤
1. 调整ZAP启动命令,实现后台运行
修改第一个stage的shell脚本,将ZAP进程放到后台,并将输出重定向到日志文件,避免占用当前Shell的IO流:
stage('Execute Zap Jar') { steps { sh ''' java -jar /home/pl/tools/com.cloudbees.jenkins.plugins.customtools.CustomTool/OwaspZap/ZAP_2.12.0/zap-2.12.0.jar \ -dir "/home/pl/.ZAP" \ -host 0.0.0.0 \ -port 8090 \ -daemon \ -config api.disablekey=true > zap-startup.log 2>&1 & ''' } }
&:将进程放到后台执行> zap-startup.log 2>&1:将标准输出和错误输出都重定向到日志文件,方便后续排查启动问题
2. 增加ZAP就绪等待逻辑
ZAP启动后需要一定时间完成初始化,直接执行后续的zap-cli命令可能因为服务未就绪失败。新增等待阶段确保ZAP完全就绪:
stage('Wait for ZAP Ready') { steps { sh ''' export ZAP_URL=http://localhost export ZAP_PORT=8090 # 最多等待5分钟,每隔5秒检查一次 for i in {1..60}; do if zap-cli status; then echo "ZAP service is ready" break fi echo "Waiting for ZAP initialization... attempt $i/60" sleep 5 done ''' } }
3. 修正脚本中的转义问题
原流水线中的"和&&是HTML转义字符,在Jenkins Shell脚本中应替换为正常的双引号"和逻辑与&&。
完整修复后的流水线示例
pipeline { agent any stages { stage('Execute Zap Jar') { steps { sh ''' java -jar /home/pl/tools/com.cloudbees.jenkins.plugins.customtools.CustomTool/OwaspZap/ZAP_2.12.0/zap-2.12.0.jar \ -dir "/home/pl/.ZAP" \ -host 0.0.0.0 \ -port 8090 \ -daemon \ -config api.disablekey=true > zap-startup.log 2>&1 & ''' } } stage('Wait for ZAP Ready') { steps { sh ''' export ZAP_URL=http://localhost export ZAP_PORT=8090 for i in {1..60}; do if zap-cli status; then echo "ZAP service is ready" break fi echo "Waiting for ZAP initialization... attempt $i/60" sleep 5 done ''' } } stage('Execute Zap Session and Zap Scan') { steps { sh ''' export ZAP_URL=http://localhost export ZAP_PORT=8090 zap-cli session new && \ zap-cli spider https://portail-re7-test.XXXXXX.com/ && \ zap-cli ajax-spider https://portail-re7-test.XXXXXX.com/ && \ zap-cli active-scan https://portail-re7-test.XXXXXX.com/ && \ zap-cli session save default ''' } } stage('Extract Zap Report') { steps { sh ''' export ZAP_URL=http://localhost export ZAP_PORT=8090 zap-cli report -o report-default.html -f html ''' } } } post { always { // 构建结束后终止ZAP进程,避免占用节点资源 sh 'pkill -f zap-2.12.0.jar || true' // 归档日志与报告,方便后续排查 archiveArtifacts artifacts: 'zap-startup.log, report-default.html' } } }
额外建议
- 保留
post阶段的清理和归档逻辑,避免Jenkins节点上残留ZAP进程,同时方便回溯扫描过程 - 若ZAP启动仍有问题,可查看
zap-startup.log日志定位具体启动错误
内容的提问来源于stack exchange,提问作者Samurai
相关产品推荐
相关产品推荐

