shell script 테스트하기
젠킨스로 되어 있는 빌드 시스템을 사내 빌드 시스템으로 전환을 검토하는 작업을 진행 중입니다.
작업 중에 하나로 젠킨스 파이프라인을 shell script로 재작성해야 할 필요가 생겼습니다.
shell script에 익숙하지 않았지만 chatGPT를 이용해서 작업을 시작하였습니다.
현재 빌드 시스템은 크게 빌드, 도커라이징, 배포 시스템 호출로 나누어져 있으며 아시다시피 빌드와 도커라이징은 수분이 소요가 됩니다.
shell script를 작성하고 수분이 소요되는 빌드 시스템을 테스트를 반복하는 하는 지루한 작업이 시작이 되었습니다. 테스트해야 할 모듈은 대략 10개, 개발 phase가 3개 그리고 브랜치의 prefix에 따라 달라지는 업무가 있어서 테스트가 점점 힘들어졌습니다. 리팩토링도 하고 싶었지만 테스트가 힘들어 엄두도 못 내고 있었습니다.
이대로 계속 진행하는 것은 비효율적이라 판단하고 shell script 테스트 환경 구성을 먼저 해야겠다고 결정하였습니다. ShellSpec이라는 프레임워크를 발견하고 대략 훑어보니 직관적이고 쉽게 테스트할 수 있을 것 같아서 이것으로 테스트 환경을 구성해 봤습니다. kcov라는 코드 커버리지툴과 연동이 잘 되어 있어서 이 부분도 추가였습니다.
https://github.com/shellspec/shellspec
https://github.com/SimonKagstrom/kcov
설치와 설정은 chatGPT 도움으로 mac에서 쉽게 할 수 있었습니다.
shell script를 실행했을 때 stdout을 비교하는 방식으로 테스트를 작성하였고 도커라이징과 같은 명령어들은 fucntion으로 쉽게 모킹해서 unit 테스트를 작성하였습니다.
그리고 integration 테스트도 작성하여 unit 테스트를 보완하였습니다.
build_deploy.sh는 실제 실행하는 shell script이고 나머지는 테스트를 위한 shell script, 결과를 비교할 텍스트 파일, curl의 결과를 모킹하는 json 파일들입니다.
아래는 unit_test.sh 파일의 일부로 배치 모듈이 sandbox에 자동으로 배포되었을때 정상적인 output이 출력되는지를 테스트 하는 코드입니다.
테스트를 실행할때 kcov와 연동하면 아래와 같이 Coverage Report도 자동으로 생성됩니다.
아래와 같이 라인 커버리지도 잘 표시되고 있어서 어떤 부분이 테스트가 안되었는지 확인하기 쉬웠습니다.
이렇게 테스트 환경이 구성되고 부터는 안정감 있고 빠른 속도로 개발을 진행할 수 있게되었습니다.
또 다른 업무로 shell script 작성해야 할 경우에 초기에 테스트 환경을 구성하고 자신감 있게 작업을 할 수 있을 것 같습니다.
ShellSpec과 kcov를 만들어주신 분에게 고마운 마음을 표현하고 싶습니다.
여러분들도 shell script 작업을 하게 된다면 ShellSpec과 kcov를 한번 검토해 보시면 좋을 것 같습니다.
감사합니다.