You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:20:59