결론부터 이야기하자면, 오래된 로그는 제때제때 삭제해야한다.
플러그인 추천
1. 오래된 빌드 삭제 정책 플러그인
젠킨스를 사용하는 프로젝트라면 대부분 사용하고 있을 것 같다. 일반적으로 사용하는 정책은 두가지다.
- N일 이상 지난 빌드 ( days )
- M개 이상의 빌드 ( build num )
2. 빌드 로그 사이즈 체커 플러그인
진행되는 빌드 출력 파일( 로그 파일 )의 크기를 모니터링하면서, 로그파일이 미리 정해둔 크기보다 커지만 빌드를 중지하는 플러그인이다. 젠킨스 전체(글로벌) 설정도 가능하고, 개별 잡 설정도 가능하다.
게임회사에서 Jenkins를 사용해서 빌드를 하면서 빌드 소요 시간이 24시간이 넘어가기도 하고, 빌드 파일크기가 수십기가가 되는 일이 비일비재했다. 특히 행이 걸렸을 때 등 무한루프에 빠져서 무의미한 빌드를 계속할 때나 로그 파일이 너무 커지면 중지를 해야하는데, 애플리케이션 단에서 문제가 수정되는게 베스트지만 세상일이 다 원하는대로 되지는 않기때문에, 이런 플러그인을 사용했다.
플러그인 적용 팁
개별 잡마다 플러그인 설정하는게 귀찮을 때가 많다.
1.GroovyScriptConsole 사용하기
2.JenkinsRestAPI 사용하기
my_job = server.get_job_config('cool-job')
server.reconfig_job('empty_copy', jenkins.RECONFIG_XML)
로그 용량 관리 주의하기
플러그인 주의하기(경험담)
(1) disk usage plugin
정확히 이 플러그인이 맞는지는 잘 기억이 안난다.
평화로운 아침 8시 일어났더니, 젠킨스가 접속이 안된다는 제보가 들어와있었다. 급하게 출근을 하고 확인해보니, 젠킨스 마스터서버의 메모리가 100%를 치고 있었다. 시스템로그와 그라파나를 확인해보니 특정 시점부터 접근 실패 에러가 급증하고, 리소스 사용률이 올라가있었다. 해당 시점은 disk-usage(또는 이름을 찾지 못한 플러그인) 플러그인의 설치 및 적용 시점부터었다.
직접적인 원인은 플러그인 설치고, 구체적인 원인을 파헤쳐보니 삭제되지 않은 로그의 개수가 매우 많은데 용량도 컸던게 문제었다.
이때 취한 액션은 크게 두가지였다.
- 플러그인 관리
- disk-usage(또는 이름을 찾지 못한 플러그인) 플러그인 삭제
- 용량이 큰 로그 삭제 -> build log file size checker 플러그인 설치 및 로그 용량 제한
- 오래된 빌드 삭제 정책 -> discard old build 플러그인 설정
- 슬랙 알림 추가
- 그라파나 - 메모리/CPU 사용률이 특정 기준을 넘어갈 경우 슬랙 알림 전송
- 젠킨스 - 잡 추가 및 삭제가 잦았기 때문에, 주기적으로 도는 잡(cron job)을 생성해서 특정 잡이 기준을 충족하지 않으면(플러그인 사용 및 설정 등등) 슬랙 알림 전송
물론 오래된 빌드를 삭제하는게 늘 답이 되지는 않는다. 빌드 로그를 감사등의 이유로 보관이 필요하기도 하니까.
(2) statistics gatherer plugin
Jenkins shared library 를 최적화하기 위해서 선택한 젠킨스 모니터링 플러그인이다.
젠킨스 사용량이 많지 않은 경우에는 문제가 되지 않았지만, 특정 시간에 젠킨스 사용이 몰릴 경우 젠킨스가 느려지는 현상이 발생했다.
위의 플러그인(disk-usage)을 설치했을 때 처럼, 그라파나로 확인해본 결과 네트워크 트래픽이 비정상적으로 올라가고 젠킨스가 느려지곤 했다.
우선 사용 빈도가 높은 젠킨스에서는 해당 플러그인을 제거하고, 사용 빈도가 낮은 젠킨스에서는 별다른 문제가 되지 않았기 때문에 플러그인을 지속해서 사용했다.
이 경험을 통해 꼭 바로 장애가 발생하지 않더라도, 이상현상이 보이면 주의해야 한다는걸 뼈져리게 느끼게 됐다. 단순히 알고 있는거랑 몸으로 한번 느낀거에는 큰 차이가 있었다.
위의 문제가 있었지만 수집하는 데이터를 통해 좋은 데이터를 수집해서, 많은 부분을 개선했기때문에 나쁜 플러그인은 아니다. 좋은 플러그인인데 잘 모르고 썼던게 문제였다. 추후 설정을 일부 변경하니 젠킨스 사용량이 많아도 문제가 없었다.
'Jenkins' 카테고리의 다른 글
[Jenkins] .pem 포맷에서 .jks(java keystore) 포맷으로 변환하기 (0) | 2023.06.19 |
---|