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,查問題,不能發散,必須緊扣細節,找到依據,不能想當然。

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