Giaosucan's blog - Chia sẻ kiến thức theo cách bá đạo

Ticker

20/recent/ticker-posts

Nhật ký DevOps - Chuyện về con EPOD

Hà Nội, một buổi chiều mùa thu. 

Vậy là sau 2 tháng phong tỏa, Hà Nội đã chính thức mở giãn cách, cũng như bao nhiêu người dân Hà Nội khác, tôi ra ngoài, hít thở cái không khí trong lành, mát mẻ của mùa thu Hà Nội, mùa đẹp nhất trong năm

Mỗi khi rảo bước trên con phố này, bao nhiêu kỉ niệm trong tôi lại ùa về, một thời bồng bột và vụng dại. Hơn 15 năm đã qua đi, vẫn con phố ấy mà người thì đi đâu mất rồi


Đây là những gì xảy ra trên phố Trần Duy Hưng mỗi đêm | Tin tức Online


Ting ting, tiếng message bắn liên hồi từ Microsoft Team

  • Bên team Developer thông báo PR builder  bị lỗi anh ei, các Pull Request đều không merge được

  • Các pull request của các anh không chạy được, block release 21.13, cuối ngày các chú xử không xong, anh escalate lên lãnh đạo, cho chúng mày chết

  • Fix ASAP, blob la…

Đang lúc dạt dào cảm xúc thì đứt cái phựt, tụt hết cả mood, đành phải phi về kiểm tra. Giở các PR trên Github, ờ cái nào cũng đỏ loét

Trước hết, giải thích chút về cái gọi là PR builder trong hệ thống CICD này. Đây có thể hiểu như là một quality gate, mỗi khi developer tạo PR vào protected branch, PR builder sẽ tự động trigger để thực hiện các bước sau

  • Scan code bằng SonalQuebe

  • Chạy unit test và integration test

  • Scan bảo mật bằng tool snyk

  • Automerge nếu như các step trên đều pass

Trong các step trên thì có đoạn integration test là khá phức tạp. Với CICD pipeline truyền thống, code sẽ được build và deploy lên server cloud và chạy test để generate reports. Server cloud được provision sẵn từ trước để deploy. Tuy nhiên cách làm này không áp dụng vì PR builder là bước CI mục đích chỉ để build và test code, khi nào chính thức release mới deploy. Nếu provision sẵn server thì quá tốn kém, một ngày có hàng trăm PR được tạo cùng lúc, bao nhiêu server cho vừa, và khó quản lý

Do đó, team DevOps đưa ra giải pháp, đó là provisioning 1 server tạm thời mỗi khi PR builder chạy, rồi deploy code vào đó để execute test, do khi test xong thì terminate nó đi. Server temporary này được đặt tên là EPOD

Epod được deploy trên K8S, bao gồm ngnix proxy tới backend pod và các service pod. Tất cả các k8s pod này được đặt trong 1 namespace

PR builder trigger 1 pipeline Jenkins để thực hiện build code, run unit test và launch epod trên, deploy code rồi execute integration test

Để visualize những step trên, plugin Blue Ocean được install vào Jenkins

Thời gian để spin up 1 EPOD và deploy code mất khoảng 45 phút, chạy test mất 60 phút nữa, khoảng 2 tiếng để hoàn thành 1 PR, tương đối lâu cần optimize để giảm thời gian xuống. 

Kiểm tra logs của pipeline, epod vẫn spin up ngon lành, xanh lét, infrastructure vẫn ổn, nhưng sao PR vẫn failed sạch.

Mở hướng điều tra sang integration test, WTF, PR nào cũng reports một số test case failed. Dek, code không pass bộ test suite mà cứ đổ vạ, akay vãi lúa.

Mấy anh xem lại code giùm em, infra vẫn ổn, code bị failed test case

Failed cl, bọn tao có sửa code gì đặc biệt đâu, chỉ change name, add variable thôi, chúng mày làm lởm lại bảo tao sai, tối tao report lãnh đạo, đi mà giải trình

Các sếp to ko nắm về kĩ thuật, nghe báo cáo thì nói

Các chú fix đi, PR builder do các chú build, giờ nó failed thì auto lỗi của các chú

Cay cú lắm, nhưng đang ở thế nắm đằng lưỡi, phải cắn răng đi debug code, đúng là có những PR chỉ minor change, thế nhưng lại fail test cases. Nếu thì chỉ có phía test suites có gì thay đổi rồi

Mất một đêm ngồi truy vết commit code như truy vết F1, F0, cuối cùng đã phát hiện ra

Ticket ABC: add flaky test vào test suites

Flaky test là gì vại, đó là một loại test mà chạy lần đầu thì fail, lần sau thì pass, chạy phát nữa thì lại failed, nói nôm na là test hên xui, mặc dù code thì không thay đổi

Don't Let Flaky Tests Ruin Your Automation | Dev Tester


Ví dụ đơn giản của flaky test dư lày

Một UI test case test 1 cái form phải có chữ Hello Worlds. Test load cái web form về, search content xem có chữ Hello Worlds ko. Nếu web load ngon lành thì sẽ search dc và test pass. Những một ngày đẹp trời cá mập cắn cáp, web load mãi không lên, thế là test cases failed.

Cuối cùng thì rõ, hóa ra là mấy anh Dev add bộ flaky test vào test suites, làm cho PR builder failed. Không phải lỗi của CICD team, 3 năm rõ mười, ticket evidence show up đầy đủ, một cú vả vỡ mồm mấy con giời hay to còi. Việc của mấy cụ là phải xử lý cái flaky test này sao cho hợp lý

….

Rồi một ngày lại trôi qua, lại thả bộ trên con đường nhiều kỉ niệm.

Đăng nhận xét

0 Nhận xét