Jenkins的错误处理需结合Pipeline语法(推荐)和日志分析,覆盖异常捕获、流程控制及通知等场景。
error关键字)用于在Pipeline中主动标记错误并终止构建。适用于校验失败(如代码格式检查未通过)等场景,会立即终止当前流程并将构建标记为FAILURE。
示例:
stage('Validate Code') {
steps {
script {
def hasError = sh(script: 'git diff --check', returnStatus: true)
if (hasError != 0) {
error "Code validation failed: Found uncommitted changes or whitespace errors."
}
}
}
}
try-catch块)通过Groovy的try-catch捕获异常,避免因单个步骤失败导致整个Pipeline终止。适用于需要记录错误但不中断流程的场景(如备份操作失败)。
示例:
stage('Backup Artifacts') {
steps {
script {
try {
sh 'tar -czf backup.tar.gz /var/lib/jenkins/artifacts'
} catch (Exception e) {
echo "Backup failed: ${e.message}"
// 可选:发送通知或执行恢复操作
}
}
}
}
catchError步骤)catchError可捕获指定范围内的错误,并允许Pipeline继续执行。适用于“部分失败不影响整体”的场景(如单元测试失败但仍需继续部署)。
示例:
stage('Run Tests') {
steps {
script {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh 'mvn test'
}
echo "Tests completed (some may have failed)."
}
}
}
post块位于Pipeline末尾,根据构建结果(success/failure/aborted等)执行后续操作(如发送通知、清理资源)。是错误处理的“收尾环节”。
示例:
post {
failure {
emailext body: '${DEFAULT_CONTENT}\n\nBuild Log: ${BUILD_URL}console',
subject: 'Jenkins Job Failed: ${JOB_NAME} #${BUILD_NUMBER}',
to: 'dev-team@example.com'
}
always {
cleanWs() // 清理工作空间
}
}
通过/var/log/jenkins/jenkins.log查看详细错误日志,结合tail -f实时监控:
tail -f /var/log/jenkins/jenkins.log | grep -i "error\|failed"
日志中会记录步骤执行状态、异常堆栈等信息,是排查错误的关键依据。
Jenkins的重试机制可通过内置步骤、插件或Shell脚本实现,覆盖任务失败后的自动重试场景。
retry步骤(Pipeline原生支持)retry步骤用于重试指定步骤或代码块,适用于临时性错误(如网络波动、依赖下载失败)。
示例:
stage('Download Dependencies') {
steps {
retry(3) { // 最多重试3次
sh 'mvn dependency:go-offline'
}
}
}
timeout与retry组合通过timeout设置步骤执行时间上限,避免无限重试;结合retry实现“超时后重试”。适用于部署任务卡死等场景。
示例:
stage('Deploy to Production') {
steps {
timeout(time: 5, unit: 'MINUTES') { // 最长执行5分钟
retry(2) { // 超时后重试2次(共最多3次)
sh './deploy.sh'
}
}
}
}
Naginator是Jenkins常用的重试插件,可实现失败Job自动重试,支持配置重试次数、延迟时间及触发条件(如非稳定构建)。
安装与配置步骤:
Manage Jenkins → Manage Plugins → 搜索“Naginator”并安装。Retry count:重试次数(如3次);Retry delay:重试延迟(如5秒);Retry on unstable build:是否重试非稳定构建(如测试未通过)。retry的delay参数设置间隔(如retry(3, delay: 10)表示延迟10秒后重试)。echo "Retry ${retryCount}: ${e.message}"),便于后续分析。