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

Jenkins中UnknownHostException异常处理及主机存在性验证问询

问题与解决方案

问题背景

现有Jenkinsfile代码在FQDN可正常解析时能正常执行,但遇到不存在的FQDN(如fully.unexistent.tld)时,会抛出java.net.UnknownHostException导致构建直接失败。需要实现两个目标:

  1. 捕获并处理该异常,适配FQDN不存在的场景
  2. 找到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:12:37