Jenkins流水线执行CSR审批无待处理资源时触发失败如何解决
问题修复方案
报错原因
xargs默认在标准输入为空时仍会执行后续命令,导致oc adm certificate approve没有传入CSR参数抛出参数缺失错误- Jenkins默认将sh命令的非0退出码识别为步骤失败,直接终止流水线
修复后的流水线写法
方案1:变量判断(兼容性最优,无环境依赖)
直接先获取CSR列表做非空判断,没有待审批内容时直接输出提示正常退出:
sh ''' # 仅获取待审批状态的CSR列表 CSR_LIST=$(oc get csr --field-selector status=Pending -o name) if [ -z "$CSR_LIST" ]; then echo "所有节点状态正常,无待审批CSR" exit 0 fi # 存在待审批CSR时执行批量审批 echo "待审批CSR列表:$CSR_LIST" echo "$CSR_LIST" | xargs oc adm certificate approve '''
方案2:xargs参数优化(写法更简洁)
利用GNU xargs的-r(--no-run-if-empty)参数,空输入时自动跳过执行:
sh ''' oc get csr --field-selector status=Pending -o name | xargs -r oc adm certificate approve # 判断是否还有待审批CSR,输出对应提示 if [ -z "$(oc get csr --field-selector status=Pending)" ]; then echo "所有节点状态正常,无待审批CSR" fi '''
注:-r是GNU xargs的扩展参数,OpenShift集群的Node节点默认使用的GNU环境均支持该参数
优化说明
给oc get csr添加--field-selector status=Pending参数可以仅过滤待审批状态的CSR,避免将已审批/已拒绝的CSR传入后续命令,减少不必要的执行日志。
内容的提问来源于stack exchange,提问作者Shaila
相关产品推荐
相关产品推荐

