Jenkinsfile执行SQL查询返回码恒为0的错误处理方案咨询
解决方案
方案1:包装sqlplus调用指令,强制错误时返回非0退出码
sqlplus默认仅在进程本身启动失败时返回非0,SQL执行错误、OS错误默认都会继续运行,最终返回0。可以在不修改原有.sql文件的前提下,在Jenkins的sh调用中给sqlplus前置注入错误退出配置:
def user_code= sh(script: """sqlplus -s /nolog << EOF connect a/b@c WHENEVER SQLERROR EXIT FAILURE ROLLBACK WHENEVER OSERROR EXIT FAILURE ROLLBACK @test.sql EXIT SUCCESS EOF """, returnStatus: true) if (user_code != 0) { error("sql statement failed with status code ${user_code}") } else { println "successfull" }
- 参数说明:
-s开启静默模式,减少sqlplus输出的横幅、提示等无用内容WHENEVER SQLERROR EXIT FAILURE ROLLBACK只要SQL执行报错,直接回滚并返回非0退出码WHENEVER OSERROR EXIT FAILURE ROLLBACK遇到OS层面错误(比如文件找不到、权限不足)也直接返回非0退出码- 所有配置都在Jenkins的sh命令中拼接,不需要修改原有的test.sql文件,完全符合仅在Jenkinsfile侧修改的要求
方案2:输出关键词匹配兜底
如果部分场景下上述配置不生效,可以配合静默模式输出,匹配Oracle错误前缀判断执行结果:
def sql_output = sh(script: """sqlplus -s a/b@c @test.sql""", returnStdout: true).trim() // 匹配Oracle常见错误前缀 ORA-、SP2-、PLS-等 if (sql_output =~ /(ORA-\d+|SP2-\d+|PLS-\d+)/) { error("sql execution found error: ${(sql_output =~ /(ORA-\d+.*|SP2-\d+.*|PLS-\d+.*)/)[0][0]}") } else { println "successfull" }
- 静默模式下输出已经过滤了大部分无用内容,仅保留SQL执行的返回结果和错误信息,关键词匹配准确率很高
内容的提问来源于stack exchange,提问作者bamishr
相关产品推荐
相关产品推荐

