Jenkins执行OpenShift start-build命令时如何获取更详细日志?
OpenShift二进制构建场景下获取详细调试日志方案
针对Jenkins OpenShift插件执行二进制构建报错时无法获取完整日志的问题,可通过拆分构建启动、日志拉取、状态查询三个步骤解决,无需使用不支持的--build-loglevel参数,具体操作如下:
步骤1:调整构建启动参数,获取唯一构建标识
按照官方建议移除startBuild中的--wait、--follow参数,启动构建后直接获取构建对象名称用于后续操作:
// 启动二进制构建,返回构建对象全称 def buildName = openshift.selector(BUILD_CONFIG_NAME, "${appBcName}").startBuild("--from-dir=${artifactPath}", '-o=name').out.trim() echo "已触发OpenShift构建任务:${buildName}"
步骤2:拉取全量构建执行日志
构建启动后可通过logs命令获取完整构建流程输出,包含镜像拉取、构建执行、产物推送全阶段日志,不受二进制源类型限制:
// 等待构建初始化完成,避免日志查询命令报错 sleep 10 // 拉取带时间戳的全量构建日志 def buildFullLogs = openshift.selector(buildName).logs('--timestamps', '-f').out echo "构建全量日志如下:\n${buildFullLogs}"
步骤3:构建启动失败时查询状态与关联事件
如果遇到构建调度超时等平台侧错误,可直接查询构建对象的状态详情和关联事件,定位调度失败根因(如资源不足、权限异常、镜像拉取失败等):
// 查询构建对象完整状态信息 def buildStatusDetail = openshift.selector(buildName).object().status echo "构建状态详情:\n${new groovy.json.JsonBuilder(buildStatusDetail).toPrettyString()}" // 查询该构建关联的集群事件,快速定位异常原因 def buildRelatedEvents = openshift.raw( 'get', 'event', '--field-selector', "involvedObject.name=${buildName.split('/')[1]}", '-o', 'custom-columns=触发时间:.lastTimestamp,事件类型:.type,错误原因:.reason,详情:.message' ).out echo "构建关联集群事件:\n${buildRelatedEvents}"
完整流水线容错示例
将上述逻辑整合为带异常捕获的流水线片段,无论构建成功或失败都可输出完整排查信息:
def buildName = "" try { // 1. 启动构建 buildName = openshift.selector(BUILD_CONFIG_NAME, "${appBcName}").startBuild("--from-dir=${artifactPath}", '-o=name').out.trim() echo "已启动构建:${buildName}" // 2. 等待构建完成,自定义超时时间(单位:分钟) openshift.selector(buildName).untilEach(120) { return it.object().status.phase in ['Complete', 'Failed', 'Cancelled'] } // 3. 输出构建日志 def buildLogs = openshift.selector(buildName).logs('--timestamps').out echo "构建执行日志:\n${buildLogs}" // 4. 判断构建结果 def finalStatus = openshift.selector(buildName).object().status.phase if (finalStatus != 'Complete') { error "构建执行失败,最终状态:${finalStatus}" } } catch (Exception e) { echo "构建流程异常,输出排查信息:" if (buildName) { // 异常时输出构建状态和关联事件 def events = openshift.raw( 'get', 'event', '--field-selector', "involvedObject.name=${buildName.split('/')[1]}", '-o', 'custom-columns=TIME:.lastTimestamp,TYPE:.type,REASON:.reason,MESSAGE:.message' ).out echo "关联集群事件:\n${events}" def status = openshift.selector(buildName).object().status echo "构建状态详情:\n${new groovy.json.JsonBuilder(status).toPrettyString()}" } throw e }
内容的提问来源于stack exchange,提问作者Kaliyug Antagonist
相关产品推荐
相关产品推荐

