Jenkins는 빌드, 배포, 뱃치 작업 등 다양한 용도로 활용할 수 있는 CI 서버다. 그에 맞게 플러그인도 아주 다양해서 여러가지 컴퓨터 작업을 자동화할 수 있다. 내 생각엔 아마도 조만간 커피를 끓여주는 플러그인도 나올 것 같다. ;)

플러그인 중에 Deploy 플러그인이 있는데 이걸 사용하면 자바 개발자들이 애용하는 서블릿 컨테이너인 톰캣(Tomcat)으로 웹애플리케이션을 배포할 수 있다.

빌드 후 단계로 Deploy 플러그인 작업 설정
빌드 후 단계로 Deploy 플러그인 작업 설정

그런데 이러한 방식에는 큰 문제가 있다. 톰캣은 앱을 내리더라도 메모리를 해제하지 않는 문제가 있어서 여러번 앱을 배포하면 메모리 부족 오류가 발생하는 것이다!

그래서 그동안 Jenkins로 배포할 때마다 가끔 Tomcat이 죽느라 수동으로 내렸다 올리는 작업을 해야했기 때문에 상당히 불편했다. 위 링크에 있는 방법으로 하면 느려진다니 그 방법도 좋지 않아보였다.

결국 Deploy 플러그인을 사용하지 않고 톰캣을 내렸다 올리기로 했다. 웹 앱을 Maven으로 빌드하면 .war 파일이 만들어지므로 그 파일을 톰캣 webapps 경로에 넣고 톰캣을 내렸다 올리는 것이다. 물론 수동이 아니라 Jenkins를 활용한 자동 재구동이다.

이를 위해서는 톰캣 시작, 종료 뱃치 파일이 필요하다. 윈도에서는 톰캣을 설치할 때 exe 설치 파일로 설치하면 뱃치 파일은 포함되지 않는다. 대신 zip 설치 파일의 bin 폴더에 있는 아래 뱃치 파일을 톰캣의 bin 폴더에 넣어주도록 한다.

Un*x 계열 OS에서는 *.bat이 아니라 *.sh 파일일 것이다.

준비됐거나 이미 bin 폴더에 이러한 스크립트 파일이 있으면 Jenkins 작업의 설정 페이지로 들어간다. “Add post-build step” 단추를 눌러보면 여러 명령이 있는데 "Execute Windows batch command"나 "Execute shell"을 선택한다.

그리고 윈도 뱃치 명령인 경우는 다음 예와 같이 입력해주면 된다.

set JAVA_HOME=D:\Java\jdk1.6

cd "D:\Java\Tomcat 6"
cmd /c bin\shutdown.bat
timeout 5
cmd /c bin\startup.bat

이 방법의 핵심은 윈도에서 톰캣 서비스를 사용한다거나 tomcat.exe로 실행하면 잘 안된다는 것이다. 여러가지로 확인해본 결과 위와 같이 뱃치 파일을 사용하는 경우만 정상적으로 Jenkins에서 톰캣을 재구동할 수 있었다.

이 방법의 장점은 말한대로 톰캣의 메모리 부족으로 인한 크래시를 방지할 수 있지만 잠깐이나마 톰캣이 내려갔다 올라가므로 만약 운영 서버인 경우 사용자 불편이 발생할 수 있다. (그래도 아예 죽는 것보다는 낫겠지만…) 또한 톰캣 하나에서 여러 도메인으로 사이트를 운영하는 경우 한 도메인의 작업으로 다른 도메인에도 영향을 준다는 것이 단점이라고 하겠다.

11월 19일 수정 - 원래는 call 명령으로 뱃치 파일을 불렀으나 cmd /c가 안정적이라 변경함

11월 28일 수정 - Tomcat 셧다운하고 바로 다음 작업을 하는 것보다는 몇 초 대기하는 것이 안정적이라 timeout 추가(Windows XP에서는 불가)