Jenkins构建指定Maven组件成功却返回NOT_BUILT致FTP步骤异常
嗨,我之前维护多模块Maven项目时也碰到过一模一样的问题——明明指定构建的模块都成功了,Jenkins却揪着那些没构建的模块标记NOT_BUILT,直接跳过FTP上传步骤。下面是我试过的几个有效解决方案,你可以挨个试试:
原因分析
本质上是Jenkins的构建结果判定逻辑和Maven部分模块构建的场景不兼容:Jenkins默认会检查所有模块的状态,那些没被-pl指定的模块会被标记为NOT_BUILT,导致Jenkins认为整体构建状态不符合“成功”标准,进而跳过后续的FTP步骤,哪怕你要上传的模块都已经构建好了。
解决方案
1. 手动强制设置构建结果为成功(最直接)
在FTP步骤之前,添加一个Groovy脚本步骤(自由风格项目)或者直接在Pipeline里写一行代码,强制把当前构建结果改成SUCCESS:
currentBuild.result = 'SUCCESS'
如果是自由风格项目找不到Groovy步骤,也可以用shell脚本(Linux/macOS):
# 注意替换成你的Jenkins地址、项目名,以及你的用户名和API令牌 curl -X POST "http://your-jenkins-url/job/your-project-name/${BUILD_NUMBER}/postBuildResult" \ --data-urlencode "result=SUCCESS" \ --user your-username:your-api-token
这个方法能直接绕过Jenkins的状态判定,让FTP步骤正常触发。
2. 调整FTP步骤的触发条件(更严谨)
如果不想强制改构建结果,可以修改FTP插件的执行条件:
- 先把FTP步骤的“Run only if build is successful”改成**“Run regardless of build result”**
- 然后在FTP步骤之前加一个shell脚本步骤,用来检查指定模块是否真的构建成功:
# 检查构建日志里是否同时存在两个模块的成功标记 if grep -q "component-x ............................ SUCCESS" "${BUILD_LOG}" && \ grep -q "component-y ............................ SUCCESS" "${BUILD_LOG}"; then echo "目标模块构建成功,准备执行FTP上传" exit 0 else echo "目标模块构建失败,跳过FTP上传" exit 1 fi
- 最后把FTP步骤设置为**“Run only if previous step is successful”**
这样只有当你指定的两个模块真的成功时,才会执行FTP上传,既解决了状态问题,又保留了错误判断的逻辑。
3. 优化Maven构建命令,让Jenkins正确识别状态
尝试在Maven命令里加上-am参数(构建指定模块及其依赖),虽然你说依赖已经构建成功,但有时候Jenkins的Maven插件需要看到完整的依赖链状态才能正确判定:
clean install -pl component-x,component-y -am -P develop -X
另外,也可以检查Jenkins的Maven插件配置,看看有没有“只关注指定模块状态”的选项,不同版本的插件位置可能不一样,你可以找一下。
4. 调整Jenkins的构建结果判定规则
如果你的项目是自由风格,可以在项目配置的“构建”部分,找到Maven构建的高级选项,看看有没有“忽略未构建模块的状态”之类的设置;如果是全局配置,检查Jenkins全局工具配置里的Maven插件设置,有没有相关的判定规则可以调整。
总结
我当时用的是第一种方法(强制改构建结果),最快解决问题;如果想要更严谨的逻辑,第二种方法更合适。你可以根据自己的项目需求选一个试试。
内容的提问来源于stack exchange,提问作者Zeinab Abbasimazar

