ನನ್ನ CI/CD ಪೈಪ್ಲೈನ್ 3 ತಿಂಗಳ ಕಾಲ ಯಶಸ್ವಿಯಾಗಿತ್ತು — ನಂತರ ನಾನು ಲಾಗ್ಗಳನ್ನು ಓದಿದೆ
ಹಸಿರು ಚೆಕ್ಮಾರ್ಕ್ಗಳು ನೋಡಲು ಚೆನ್ನಾಗಿರುತ್ತವೆ. ಪ್ರತಿಯೊಂದು ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ (pull request) ಪಾಸಾಯಿತು. ಪ್ರತಿಯೊಂದು ಡಿಪ್ಲಾಯ್ (deploy) ಯಶಸ್ವಿಯಾಯಿತು.
ನಂತರ ಒಬ್ಬ ಬಳಕೆದಾರರು ಒಂದು ವೈಫಲ್ಯದ ಫೀಚರ್ ಬಗ್ಗೆ ವರದಿ ಮಾಡಿದರು. ಅದು ವಾರಗಟ್ಟಲಾಗಿ ಕೆಟ್ಟು ಹೋಗಿತ್ತು.
ನಾನು ಪೈಪ್ಲೈನ್ ಲಾಗ್ಗಳನ್ನು ತೆರೆದೆ. ನಮ್ಮ ಯಶಸ್ವಿ ಬಿಲ್ಡ್ಗಳು ನಮಗೆ ಸುಳ್ಳು ಹೇಳಿದ್ದವು.
ನಮ್ಮ ಪ್ರಕ್ರಿಯೆಯು ಪರಿಪೂರ್ಣವಾಗಿ ಕಾಣುತ್ತಿತ್ತು:
- ಲಿಂಟಿಂಗ್ (Linting)
- ಯೂನಿಟ್ ಟೆಸ್ಟ್ಗಳು (Unit tests)
- ಇಂಟಿಗ್ರೇಷನ್ ಟೆಸ್ಟ್ಗಳು (Integration tests)
- ಬಿಲ್ಡ್ (Build)
- ಡಿಪ್ಲಾಯ್ (Deploy)
ತಿಂಗಳುಗಟ್ಟಲೆ ಪ್ರತಿಯೊಂದು ಹಂತವೂ 100% ಯಶಸ್ಸಿನ ದರವನ್ನು ಹೊಂದಿತ್ತು.
ಎಕ್ಸ್ಪೋರ್ಟ್ (export) ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಏನೂ ಆಗುತ್ತಿರಲಿಲ್ಲ. ಯಾವುದೇ ಎರರ್ (error) ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತಿರಲಿಲ್ಲ. ನಾನು ಇದನ್ನು 11 ವಾರಗಳ ಹಿಂದಿನ ಬದಲಾವಣೆಯೊಂದಿಗೆ ಪತ್ತೆಹಚ್ಚಿದೆ. ಪೈಪ್ಲೈನ್ ಪಾಸಾಗಿತ್ತು. ಕೋಡ್ ರಿವ್ಯೂ (code review) ಅನುಮೋದಿಸಲ್ಪಟ್ಟಿತ್ತು. ಫೀಚರ್ ಮೊದಲಿನಿಂದಲೂ ಕೆಟ್ಟು ಹೋಗಿತ್ತು.
ಸಮಸ್ಯೆ ನಮ್ಮ ಕೋಡ್ನಲ್ಲಿರಲಿಲ್ಲ. ಅದು ನಮ್ಮ ಟೆಸ್ಟ್ ಕೋಡ್ನಲ್ಲಿತ್ತು.
ನಮ್ಮ ಇಂಟಿಗ್ರೇಷನ್ ಟೆಸ್ಟ್ಗಳು ಎಲ್ಲದಕ್ಕೂ 'ಮಾಕ್ಸ್' (mocks) ಬಳಸುತ್ತಿದ್ದವು. ನಾವು ಇಡೀ ಎಕ್ಸ್ಪೋರ್ಟ್ ಸರ್ವಿಸ್ ಅನ್ನು ಮಾಕ್ ಮಾಡಿದ್ದೆವು. ಟೆಸ್ಟ್ ನಿಜವಾದ ಕೋಡ್ ಬದಲಿಗೆ ಮಾಕ್ ಅನ್ನು ಮಾತ್ರ ಪರಿಶೀಲಿಸುತ್ತಿತ್ತು. ಮಾಕ್ ಯಾವಾಗಲೂ ಯಶಸ್ವಿ ಸ್ಥಿತಿಯನ್ನು (success status) ನೀಡುತ್ತಿತ್ತು.
ನಾವು 'ಓವರ್-ಮಾಕಿಂಗ್' (over-mocking) ಎಂಬ ಬಲೆಯಲ್ಲಿ ಸಿಲುಕಿದ್ದೆವು:
- ಯೂನಿಟ್ ಟೆಸ್ಟ್ಗಳು: ಯೂನಿಟ್ ಅನ್ನು ಪ್ರತ್ಯೇಕಿಸಲು ಎಲ್ಲವನ್ನೂ ಮಾಕ್ ಮಾಡುವುದು. ಇದು ಸರಿ ಇದೆ.
- ಇಂಟಿಗ್ರೇಷನ್ ಟೆಸ್ಟ್ಗಳು: ವೇಗಕ್ಕಾಗಿ ಎಲ್ಲವನ್ನೂ ಮಾಕ್ ಮಾಡುವುದು. ಇದು ತಪ್ಪು.
- E2E ಟೆಸ್ಟ್ಗಳು: ಈ ನಿರ್ದಿಷ್ಟ ಹರಿವನ್ನು (flow) ಗಮನಿಸದೆ ಹೋಗಿದ್ದವು.
ನಮ್ಮ ಇಂಟಿಗ್ರೇಷನ್ ಟೆಸ್ಟ್ಗಳು ಕೇವಲ ದುಬಾರಿ ಯೂನಿಟ್ ಟೆಸ್ಟ್ಗಳಾಗಿದ್ದವು. ಅವು ನಮ್ಮ ಮಾಕ್ಗಳು ಕೆಲಸ ಮಾಡುತ್ತವೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸುತ್ತಿದ್ದವು. ಆದರೆ ನಮ್ಮ ಕೋಡ್ ಕೆಲಸ ಮಾಡುತ್ತವೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸುತ್ತಿರಲಿಲ್ಲ.
ಇದನ್ನು ಸರಿಪಡಿಸಲು ನಾನು ಮೂರು ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಿದೆ:
ಮಾಕ್ಗಳನ್ನು ಯೂನಿಟ್ ಟೆಸ್ಟ್ಗಳಿಗೆ ಮಾತ್ರ ಸೀಮಿತಗೊಳಿಸಿ. ಇಂಟಿಗ್ರೇಷನ್ ಟೆಸ್ಟ್ಗಳು ನಿಜವಾದ ಡೇಟಾಬೇಸ್ಗಳು, APIಗಳು ಮತ್ತು ಫೈಲ್ ಸಿಸ್ಟಮ್ಗಳನ್ನು ಬಳಸಲೇಬೇಕು. ಒಂದು ವೇಳೆ ಟೆಸ್ಟ್ ನಿಧಾನವಾಗಿದ್ದರೆ, ಅದನ್ನು ಮಾಕ್ ಬಳಸಿ ಮರೆಮಾಚಬೇಡಿ. ಆ ವೇಗವನ್ನು ಆಪ್ಟಿಮೈಸ್ (optimize) ಮಾಡಲು ಸಂಕೇತವಾಗಿ ಬಳಸಿ.
ಕಾಂಟ್ರಾಕ್ಟ್ ಟೆಸ್ಟ್ಗಳನ್ನು (contract tests) ಸೇರಿಸಿ. ಇವು ನಿಮ್ಮ ಮಾಕ್ಗಳು ನಿಜವಾದ ಸರ್ವಿಸ್ ನಡವಳಿಕೆಗೆ ಹೊಂದಿಕೆಯಾಗುವಂತೆ ನೋಡಿಕೊಳ್ಳುತ್ತವೆ. ಒಂದು ವೇಳೆ ಮಾಕ್, ನಿಜವಾದ ಸರ್ವಿಸ್ ನೀಡದ ಡೇಟಾವನ್ನು ನೀಡಿದರೆ, ಕಾಂಟ್ರಾಕ್ಟ್ ಟೆಸ್ಟ್ ಫೇಲ್ ಆಗುತ್ತದೆ.
ನೈಜ ಕವರೇಜ್ (coverage) ಅನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಿ. ನಾವು ಕೇವಲ ಪಾಸಾದ ದರಗಳನ್ನು ನೋಡುವುದನ್ನು ನಿಲ್ಲಿಸಿದೆವು. ಟೆಸ್ಟ್ಗಳು ವಾಸ್ತವವಾಗಿ ಏನನ್ನು ಪರೀಕ್ಷಿಸುತ್ತಿವೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿದೆವು. ನಮ್ಮ ಕವರೇಜ್ ಸಂಖ್ಯೆಗಳು 94% ರಿಂದ 67% ಕ್ಕೆ ಇಳಿದವು. ಇದು ನಮ್ಮ ಬಳಿಯಿದ್ದ ಅತ್ಯಂತ ಪ್ರಾಮಾಣಿಕ ಅಳತೆಗೋಲಾಗಿತ್ತು.
ಹಸಿರು ಪೈಪ್ಲೈನ್ ಎಂದರೆ ನಿಮ್ಮ ಕೋಡ್ ಕೆಲಸ ಮಾಡುತ್ತದೆ ಎಂದರ್ಥವಲ್ಲ. ಅದರರ್ಥ ನಿಮ್ಮ ಟೆಸ್ಟ್ಗಳು ಪಾಸಾಗಿವೆ ಎಂದರ್ಥ. ಇವೆರಡೂ ಬೇರೆ ಬೇರೆ ವಿಷಯಗಳು.
ನಿಮ್ಮ ಪೈಪ್ಲೈನ್ ಎಲ್ಲವೂ ಸರಿಯಾಗಿದೆ ಎಂದು ಹೇಳುವ ಬಗ್ಗಳೇ ಅತ್ಯಂತ ಅಪಾಯಕಾರಿ.
ಈ ಪ್ರಶ್ನೆಗಳನ್ನು ನಿಮ್ಮನ್ನು ನೀವೇ ಕೇಳಿಕೊಳ್ಳಿ:
- ನನ್ನ ಟೆಸ್ಟ್ಗಳು ಬಗ್ಗಳನ್ನು ಪತ್ತೆ ಮಾಡುತ್ತಿವೆಯೇ ಅಥವಾ ಕೇವಲ ಮಾಕ್ಗಳನ್ನು ಖಚಿತಪಡಿಸುತ್ತಿವೆಯೇ?
- ನನ್ನ ಇಂಟಿಗ್ರೇಷನ್ ಟೆಸ್ಟ್ಗಳು ನಿಜವಾಗಿಯೂ ಇಂಟಿಗ್ರೇಟ್ ಆಗುತ್ತಿವೆಯೇ?
- ನಾನು ಎಲ್ಲಾ ಮಾಕ್ಗಳನ್ನು ತೆಗೆದುಹಾಕಿದರೆ, ಎಷ್ಟು ಟೆಸ್ಟ್ಗಳು ಪಾಸಾಗುತ್ತವೆ?
- ನಾನು ಕವರೇಜ್ ಅನ್ನು ಅಳೆಯುತ್ತಿದ್ದೇನೆ ಅಥವಾ ವಿಶ್ವಾಸವನ್ನು (confidence) ಅಳೆಯುತ್ತಿದ್ದೇನೆ?
ಎಂದಿಗೂ ಫೇಲ್ ಆಗದ ಪೈಪ್ಲೈನ್ ನಂಬಲರ್ಹವಲ್ಲ. ಅದು ಪರೀಕ್ಷಿಸಲ್ಪಟ್ಟಿಲ್ಲ (untested).
ಮೂಲ: https://dev.to/kollittle/my-cicd-pipeline-passed-for-3-months-then-i-read-the-logs-4mbj
