【问题标题】:How can I check for SSL error inside the pipeline script如何检查管道脚本中的 SSL 错误
【发布时间】:2021-12-09 14:13:26
【问题描述】:

Jenkins 构建管道作业时出现间歇性 SSL 错误,该错误使用 conan 构建包进行构建。原因是柯南构建文件夹没有刷新缓存的 SSL。

如何检查管道脚本中的 SSL 错误,以便在出现 SSL 错误时删除文件夹,以便柯南在重试构建时从配置文件中获取新证书。

更新

jenkins 控制台日志上的错误如下:

ERROR: HTTPSConnectionPool(host='conan.bintray.com', port=443): Max retries exceeded with url: /v1/ping (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),))

为了模拟错误,infra admin 告诉清空 pem 证书文件会导致此错误或完全删除证书 pem 文件,但以上 错误没有发生,但最近同样的问题再次发生,即使下面的 try catch 已经到位。 知道如何捕获上述错误并使重试成功吗?有人告诉我删除柯南文件夹会刷新证书缓存,但这似乎也没有发生在这里 即使最终管理员最终手动删除柯南文件夹并在它开始工作后。

def conanDir = "~/.conan"
    def sslError = false
    def retryMaxCount = 5
    def retryCount = 0
try {
    if(!sslError){
        try{
            //try to get conan remotes
            remotes = sh (script: "conan remote list", returnStdout: true)
        } catch (Exception ex){
            sslError = true
            dir(conanDir){
                sh "rm -rf ${conanDir}"
            }
            while(retryCount<retryMaxCount && sslError){
                try {
                    remotes = sh (script: "conan remote list", returnStdout: true)
                    sslError = false
                } catch(Exception e) {
                    sslError = true
                    dir(conanDir){
                        sh "rm -rf ${conanDir}"
                    }
                    retryCount++
                }
            }
        }   
    }
    //some other code here
} catch(Exception RemoteNotFound){
    sh "conan remote add $repo http://server/.../repo"
    sh "conan user -p ${pwd} -r $repo ${usr}"
}

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-groovy


    【解决方案1】:

    我不知道柯南在遇到 SSL 错误时具体会做什么,但我认为它要么在 Jenkins 中引发错误,要么返回非零退出代码。

    如果它引发 Jenkins 错误

    您可以将其包装在循环内的 try 步骤中:

    connected = false
    
    while (!connected) {
      try {
        # Connect to conan here
        connected = true
      } catch(Exception exc) {
        println("Connect failed")
    }
    

    您还可以捕获相关异常,而不是将其置于循环中。这可能更好,但我不知道你的例外是什么。如果您确实使用这样的循环,请在其上设置最大重试次数。

    如果返回非零退出代码

    在这种情况下,我猜你是从 bat 步骤调用它,在这种情况下,我认为你可以这样做:

    bat("conan_connect.bat || exit")
    

    编辑:编辑注释以明确失败的位置

    【讨论】:

    • 我已经尝试过您的建议,但问题再次发生。 jenkins 控制台日志上的错误如下: 错误:HTTPSConnectionPool(host='conan.bintray.com', port=443): Max retries exceeded with url: /v1/ping (Caused by SSLError(SSLError(1, '[SSL : CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:852)'),)) 我已经更新了我的 OP,因为评论的字符有限
    • 是的,错误仍然会发生,但如果它在 try 内,它不应该导致构建停止。您需要在 catch 位中执行一些操作来处理错误,然后在更新证书后重试。
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2019-06-06
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多