Jenkins中UnknownHostException异常处理及主机存在性验证问询
问题与解决方案
问题背景
现有Jenkinsfile代码在FQDN可正常解析时能正常执行,但遇到不存在的FQDN(如fully.unexistent.tld)时,会抛出java.net.UnknownHostException导致构建直接失败。需要实现两个目标:
- 捕获并处理该异常,适配FQDN不存在的场景
- 找到Groovy/Java内置的主机存在性验证方法(
DomainValidator仅做语法校验,无法满足实际存在性验证需求)
原代码及异常信息如下:
原Jenkinsfile代码
import jenkins.org.apache.commons.validator.routines.DomainValidator pipeline { agent any stages { stage ('Validate actions') { steps { script { env.TEST_FQDN = "fully.unexistent.tld" env.TEST_IP = "1.2.3.4" if (InetAddress.getByName(env.TEST_FQDN).address.collect { it & 0xFF }.join('.') == env.TEST_IP) { echo "the fqdn is and points to ${env.TEST_IP}" } else { currentBuild.result = 'ABORTED' error('the fqdn is valid but not points to ${env.TEST_IP}') } } } } } }
异常信息
... [Pipeline] End of Pipeline Also: hudson.remoting.ProxyException: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 2fe8a515-f7e5-4555-ab09-85aee87243a3 hudson.remoting.ProxyException: java.net.UnknownHostException: fully.unexistent.tld: Name or service not known at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ... Finished: FAILURE
解决方案
1. 捕获并处理UnknownHostException
通过try-catch块包裹DNS解析逻辑,捕获UnknownHostException后自定义处理逻辑(比如标记构建状态、输出明确提示),避免构建直接失败。
2. Groovy/Java内置主机存在性验证方法
Java的InetAddress.getByName()或InetAddress.getAllByName()方法会实际发起DNS解析请求:
- 若FQDN不存在,会抛出
UnknownHostException - 若解析成功,则返回对应的
InetAddress对象
这是Groovy/Java中内置的、能验证主机实际存在性的方法,区别于仅做语法校验的DomainValidator。
修改后的Jenkinsfile代码
import jenkins.org.apache.commons.validator.routines.DomainValidator pipeline { agent any stages { stage ('Validate actions') { steps { script { env.TEST_FQDN = "fully.unexistent.tld" env.TEST_IP = "1.2.3.4" def resolvedIp = null try { // 尝试解析FQDN,完成实际主机存在性验证 def inetAddr = InetAddress.getByName(env.TEST_FQDN) resolvedIp = inetAddr.address.collect { it & 0xFF }.join('.') } catch (java.net.UnknownHostException e) { // 处理FQDN不存在的场景 currentBuild.result = 'ABORTED' error("FQDN ${env.TEST_FQDN} 不存在,无法解析") } // 验证解析后的IP是否匹配目标IP if (resolvedIp == env.TEST_IP) { echo "FQDN ${env.TEST_FQDN} 解析到目标IP ${env.TEST_IP}" } else { currentBuild.result = 'ABORTED' error("FQDN ${env.TEST_FQDN} 解析到IP ${resolvedIp},与目标IP ${env.TEST_IP} 不匹配") } } } } } }
代码说明
- 用
try-catch捕获UnknownHostException,当FQDN无法解析时,标记构建为ABORTED并抛出自定义错误信息 - 通过
InetAddress.getByName()完成实际DNS解析,实现主机存在性验证 - 解析成功后再对比IP是否匹配,逻辑更清晰健壮
内容的提问来源于stack exchange,提问作者Darwick
相关产品推荐
相关产品推荐

