如何检查管道脚本中的 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")
编辑:编辑评论以明确失败的地方
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")
编辑:编辑评论以明确失败的地方