Jenkins에서 Tomcat 재구동하기

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

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

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

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

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

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

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

  • catalina.bat
  • setclasspath.bat
  • startup.bat
  • shutdown.bat

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에서는 불가)

Jenkins에서 Tomcat 재구동하기”에 대한 의견

  1. 궁금한 점이 있습니다. war파일은 tomcat으로 어떻게 이동하셨어요??
    플러그인을 안쓰셨다고 했는데 .. 도와주세요.~ 빌드하고싶습니다.!

    1. 일단 maven으로 빌드는 하시는지요? maven으로 빌드하면 war 파일이 만들어질 것이고요, 제일 위 그림에 있는 것처럼 WAR/EAR files란에 **/*.war와 같이 지정하면 빌드된 결과 폴더 아래에서 war 파일을 찾아낸답니다. 그리고는 Tomcat의 /manager 앱을 사용해 배포하게 되지요.

  2. 저는 그렇게 톰켓을 내리지 않고 잘 되는데….톰켓 자체를 내릴일은 엔진에 설정을 바꿀때나 내리지 그렇게 내릴일이 많지는 않은것 같습니다…

    1. 제가 본문에 링크로도 붙인 PermGen 문제 때문에 웹앱 재구동이 잘 안되는 경우가 종종 있더군요.

  3. Excute Windows batch command
    를 사용해서

    set JAVA_HOME=C:\Java\jdk1.7.0_65

    cd C:\PDI\bin
    shutdown.bat
    timeout 5

    위와 같이 구현했는데

    shutdown.bat 파일 실행시

    The JAVA_HOME environment variable is not defined correctly
    This environment variable is needed to run this program
    NB: JAVA_HOME should point to a JDK not a JRE
    Build step ‘Execute Windows batch command’ marked build as failure
    Finished: FAILURE

    과 같은 에러가 나고있어서 질문남김니다.

    위에 set JAVA_HOME=C:\Java\jdk1.7.0_65 의 역활이 JAVA_HOME을 설정해주는거같은데

    저한테 지금 나오고 있는 에러가 JAVA_HOME 경로 지정때문인지 혹시 아시면 답변 부탁드립니다.

    1. 우선 방문 감사드립니다.

      메시지 내용은 환경 변수 JAVA_HOME에 JRE 경로가 아닌 JDK 경로를 지정해야 한다는 건데요, 글에 쓰신 c:\java\jdk1.7.0_65는 JDK 경로가 맞는 것으로 보이네요.

      그럼 의심해볼 수 있는 게 혹시 shutdown.bat 파일을 수정해서 그 안에도 JAVA_HOME을 설정하고 있진 않으신지요. 아니라면 c:\java\jdk1.7.0_65 경로가 보이기는 JDK 경로지만 JRE가 설치된 경로는 아닌지요…

의견 있으시면 냉큼 작성해주세요~