如何检查管道脚本中的 SSL 错误

How can I check for SSL error inside the pipeline script

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

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

更新

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

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}"
}

我不知道 conan 在遇到 SSL 错误时具体做了什么,但我假设它要么在 Jenkins 中抛出错误,要么 returns 一个非零退出代码。

如果抛出 Jenkins 错误

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

connected = false

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

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

如果它returns一个非零退出代码

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

bat("conan_connect.bat || exit")

编辑:编辑评论以明确失败的地方