Jenkins Version: 1.642
문제
WAR 파일을 이용해서 Tomcat에 자동으로 배포가 되도록 설정 시 두세번 배포가 되면 다음과 같은 문제가 발생하며 정상적으로 작동되지 않았다.
(이런 경우에는 서버에 접속하여 수동으로 톰캣을 재기동 시킬 수 밖에 없었다.)
java.lang.OutOfMemoryError: PermGen space
원인
WAR 배포 시 Tomcat 이 자동으로 압축을 풀고 Container 를 Reload 하게된다.
하지만 기존의 Permanent 영역의 Memory 가 해제되지 않기 때문에 몇번 Container 가 Reload 되면 Permanent Memory 가 모자라서 OOM(OutOfMemory) Error 가 발생이 된다.
해결방법
젠킨스에 쉘 스크립트를 등록하여 배포 후 톰캣 재기동을 하도록 설정을 해준다.
'프로젝트' => '설정' 항목에 가면 아래와 같이 빌드 후 작업을 지정할 수 있는데
'Execute shell' 항목을 선택한다.
'Command' 항목에 아래와 같이 쉘을 등록해 준다.
(경로는 각각의 환경에 맞게 수정해 주어야 한다.)
cp /var/lib/jenkins/jobs/Project_Name/workspace/target/*.war /home/1004lucifer/servers/apache-tomcat/webapps/Project_Name.war chmod 777 /home/1004lucifer/servers/apache-tomcat/webapps/Project_Name.war sleep 20 /home/1004lucifer/servers/apache-tomcat/bin/shutdown.sh sleep 10 sudo su - 1004lucifer /home/1004lucifer/servers/apache-tomcat/bin/startup.sh
위와같이 구성 후 배포 후 무조건 톰캣을 재기동하게 되어있어서 OOM Error 가 발생하지 않도록 구성이 되었다.
(개발서버에 셋팅을 한 것이며 운영중인 서버에 적용하기에는 무리가 있다.)
* 위와같이 셋팅 후 에도 톰캣에서 WAR 파일 Deploy 시 종종 OOM Error 발생하여 PermGen Memory 설정을 조금 늘려주었다.
(그제서야 배포 시 문제가 없었다.)
PS.
작동방식에 대한 설명
(경로는 각각의 환경에 맞게 수정해 주어야 한다.)
- maven 을 사용하여 빌드 시 war 파일이 생성되도록 셋팅이 되어 있다.
- Jenkins 에 Command 를 등록해 놓으면 젠킨스에서 빌드를 수행 시 입력한 command를 /tmp/ 디렉토리에 임시로 파일로 만들어 놓은 후 /bin/sh 로 실행을 시켜버린다.
cp /var/lib/jenkins/jobs/Project_Name/workspace/target/*.war /home/1004lucifer/servers/apache-tomcat/webapps/Project_Name.war chmod 777 /home/1004lucifer/servers/apache-tomcat/webapps/Project_Name.war # Jenkins 에서 war로 빌드한 것을 Tomcat 의 프로젝트 경로에 복사후 권한을 부여한다. # (이때 톰캣이 war를 자동으로 Deploy 한다.) sleep 20 # Tomcat이 Deploy 하는 시간을 기다려준다. /home/1004lucifer/servers/apache-tomcat/bin/shutdown.sh # Tomcat 을 종료시킨다. sleep 10 # Tomcat 을 종료하는 시간을 기다려준다. (사실 이렇게 오래걸리지 않음) sudo su - 1004lucifer /home/1004lucifer/servers/apache-tomcat/bin/startup.sh # sudo 명령어를 이용해 Tomcat 을 구동하는 계정으로 Tomcat 을 구동시킨다. # sudo 로 해당 계정으로 명령어 실행 시 암호입력 안해도 되도록 미리 셋팅해야 한다.(중요)
댓글
댓글 쓰기