Jenkins 배포 속도를 더 빠르게 할 수 있나
회사에서 사용하고 있는 젠킨스에서 배포 잡을 하나 실행하면 7분정도가 소요된다. 환경 구성상으로 7분후에 완료가 된다고 해도 Rancher(쿠버네티스 베이스의 솔루션)에 설치된 Fleet(Git Ops릴 지원해주는 솔루션)에서 변경된 git을 읽어가서 다시 디플로이먼트를 구성하고 파드가 새로 생성되기까지는 또 얼마간의 시간이 걸린다. 그 시간이 정확히는 얼만지 측정하기가 애매하니 그냥 3분정도 추가로 걸린다고 치자. 그러면 내가 배포 버튼을 누른후에 프로덕션에는 10분후에 변경된 것이 반영되어 있다는 것이 된다. 생각보다 오래 걸린다. 버그 픽스나 핫픽스는 항상 빠르게 반영되고 싶다는 열망이 있다.
아직도 저기까지 밖에 안온 잡의 상태를 보면서 마음속으로 “하야끄! 하야끄!”를 외친다.
최근 소요시간을 보면 답답함을 금할 수 없다. 특단의 조치를 취해야만 한다.
일단 회사 서비스의 배포 단계를 요약해 보면,
- 깃에서 소스 다운로드
- 빌드스크립스 실행
- 도커이미지로 생성
- 생성된 이미지를 레지스트리에 등록
- GitOps용 Git을 업데이트
크게 5단계로 젠킨스에서는 진행되고 마지막 5단계에 입력된 정보를 가지고 랜처에서 정보를 가져가서 서비스를 만들고 디플로이먼트를 만들고 다! 해준다.
위의 그림1에서 진행중이던 #2의 배포 작업은 결국 8분 13초가 걸렸다. 흐엉.
본격적으로 뭐가 문제인지 어떤녀석이 시간을 잡아먹고 있는지 알아본다.
누구냐넌
자 방금전에 오래걸렸던 녀석을 클릭해서 들어가 본다.
어디서 오래걸리는지는 로그를 보면 알수 있을 것 같다. 실행한 잡을 클릭해서 들어왔으면 왼쪽에 Console Output 을 클릭해서 로그를 확인해본다.
아주 긴 로그가 반겨준다. 그런데 시간이 표시가 안되어있다. 아놔…
Timings라는 메뉴가 있어서 클릭해본다.
Building 가 8부정도 소요되었다고 나오는데 어딘진 모르겠다.
더 아래로 메뉴가 보이는 Pipeline Steps라는 메뉴가 있다.
원하는 정보가 있다.
대략적으로 살펴보니 git에서 내려 받아서 준비하는 과정에서 3분30초정도걸렸고 gradle로 빌드하는 과정이 또 3분30초 걸린다. 이 두가지 단계에서 거의 시간을 다 잡아먹었다. 나머지 단계에서는 몇초 단위로 시간을 소요 했다.
범인은 둘이었다. “GIT”, “GRADLE”
한놈만팬다.
gradle은 프로그램을 손대야 할 것 같은 느낌이 있다. git은 매번 소스를 내려 받는 부분을 개선할 여지가 있지 않을까 하는 생각이 든다.
GIT 너로 정했어.
온전히 깃에서 소모한 시간 이걸 최소화 해보자.
일단 기본 설정에서 뭔가 빨라질것 같은 옵션들을 체크 한다.
faster가 있어서 체크 했다. 후후
다시 빌드 해보았다.
빨리졌다!
1분 30초 가량 속도가 빨라졌다. 확인해봐야지~
??? 실제로는 Gradle빌드 단계가 줄었다. 뭐지!? 나는 git 으로 소스 받는 시간을 줄이고 싶다고!!! 결국은 지인의 쳇쥐피티의 도움을 받기로 했다.
stage('Prepare') {
steps {
script {
if (fileExists('.git')) {
sh 'git fetch --all'
sh 'git reset --hard origin/develop'
} else {
git credentialsId: 'sample3', url: 'git@bitbucket.org:xx/xxx.git', branch: 'develop', depth: 1
}
}
}
}
원래 git credentialsId 어쩌고 쓰던 부분을 위처럼 분기처리해서 하라는 쳇쥐피티님이 솔루션을 주셨다. 그리고 최신 커밋을 받기위해 depth:1을 적용하라고 했다. 하지만 예상대로면 .git이 있을테니 위의 로직을 타게 될것이다. 기대를 하며 다시 빌드를 시작했다.
WARNING: Unknown parameter(s) found for class type 'jenkins.plugins.git.GitStep': depth
The recommended git tool is: NONE
어? depth를 모른다는데? 쳇쥐피티놈아?
결론
갑자기 결론인데, 결론 위까지 글을 쓰고 우여곡절이 많이 있었다. 우아한 테크님들의 동영상을 참고하여 젠킨스 파이프 라인을 마무리 했는데, 사실 극적인 효과는 없었다. 그래도 전보단 빠른 것 같은 느낌이라 아래 풀어놔본다.
- 멀티 프로젝트라서 git clone 이 오래 걸리는 느낌이라. 미리 git clone 한 이미지를 만들어놓는다. 젠킨스에서 해당 잡을 만들고 15일마다 한번씩 실행되게 스케쥴링을 했다.
- 각 모듈에서는 빌드시 위에서 만든 이미지를 베이스로 하여 빌드를 수행한다. 나머지는 동일하다.
git 의 속도를 잡으려는 것이 목표였었고 어느정도는 해결이 된것 같다. 그런데 아직도 이 방법이 맞는지는 의문이 든다. 더 좋은 방법이 있다면 evilcurse@birdspring.com 으로 메일 한번만… 주떄여