Zero Width Space引发的BUG分析

正在马不停蹄的coding,突然接到sandy老师的请求支援,说site部署已经24个小时了,一直部署不成功。

心中一惊,难道CI/CD的pipeline出bug了,不可能吧,如果是,早炸锅了。

观察一下jenkins上以往的build job,发现是个例,心稍微放松一下。

###发现问题

我司是容器化的jenkins pipeline,每个ultra site 部署完成需要4个pod,首先以问题site的实例名,在整个部署cluster的namespace中 grep一把,想看看当前是什么状态,发现没有任何pod信息输出。

kubectl -n learn-deployments  get pods --show-all |grep submission-list-after

猜测应该是时间比较久了,经过重试一直不成功,被K8s 调度器delete掉了。

那么首先应该复现问题,我rebuild一下job,直接看到错误

submission-list-after-learn-postgres-9f56f79d9-fbxbj      1/1       Running            0          2h
submission-list-after-learn-tomcat-86cb76c85d-qv6nz       2/2       Running            0          2h
submission-list-after-ultra-5fcd59d9b4-gk95p              0/1       InvalidImageName   0          2h
submission-list-after-ultra-router-7cbf4c7875-48mp4       1/1       Running            0          2h

“InvalidImageName” 这么明显的问题,其实如果想看进一步的detail 错误信息,只需要一步

kubectl -n learn-deployments describe pods/submission-list-after-ultra-5fcd59d9b4-gk95p

Warning  InspectFailed          13s (x8 over 34s)  kubelet, ip-10-146-22-185.ec2.internal  Failed to apply default image tag "AWSACCOUNTID.dkr.ecr.us-east-1.amazonaws.com/learnci/feature/lrn-142928-submission-\u200blist-perf/docker-ultra-ui-3500.6.0-ci:1546_958929e6": couldn't parse image reference "AWSACCOUNTID.dkr.ecr.us-east-1.amazonaws.com/learnci/feature/lrn-142928-submission-\u200blist-perf/docker-ultra-ui-3500.6.0-ci:1546_958929e6": invalid reference format

看到了不速之客“\u200b”, 问题找到了,google一把

原来这货是U+200B,它还有个学名,叫做:Zero Width Space

##分析问题

什么地方引入了这个bug呢?

部署的时候,使用的image 是从远端的aws ecr上拉取的,不会有任何改变,说明生成的image name就出问题了。

回想创建image的pipelinehttps://bbjenkins.dev.bbpd.io/view/Learn/job/ultra/job/create-ultra-ui-images/

image name 是由branch name +version number 通过一定的算法生成的,现在是前半部分出现了问题,是输入branch name时引入的问题。

image 本身没有问题,re-run 同一个image 可以正常部署,所以应该是deploy的时候输入的branch name错误(rebuild功能或者复制、粘贴惹得祸),导致部署的job找image错误。

##解决问题

以后runjob 尽可能手动输入参数,rebuild可能会因前人的失误,带到坑里。

加强保护,使用branch_name/version/instance_name的地方都增加上去空格保护。

###经验教训

1,系统设计时,尽可能减少人为输入,否则容易不可控

2,用户输入参数为字符串类型时,例如instance_name,需要严格给出使用规范,比如长度,大小写,有无空格,数字,有效字符等。否则很可能引入BUG。

3,查问题,不能发散,必须紧扣细节,找到依据,不能想当然。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章