
이번에 젠킨스를 하기 목적에 맞게 사용하고자 하였다.
gitlab 특정 브렌치 push시에 webhook을 통해 소스 코드를 WAR 파일으로 빌드하여서 톰캣에 자동 배포 되도록 구현
이 때 아래 레퍼런스의 도움을 받으며 구현을 하였다.
https://dev-joo.tistory.com/28
구현간 발생한 트러블들이 있었는데, 이번 블로그 글에서는 요구사항을 개발하면서 발생했던 트러블들을 슈팅하는 과정과 방법에 대해 중점적으로 작성하고자 한다.
Host는 윈도우 PC였고, Docker를 사용하여서 WEB, WAS, 젠킨스를 구축 하였다.
WEB 서버로는 nginx, WAS로는 톰캣을 사용 하였다.
version: '3'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- nginx-config:/etc/nginx
networks:
- mynetwork
tomcat:
image: tomcat:8.5-jdk8
networks:
- mynetwork
networks:
mynetwork:
volumes:
nginx-config:
이 때 docker-compose를 통해 한번에 구축 하였으며, 이들간 네트워크는 동일하게 처리 하였다.
FROM jenkins/jenkins:lts-jdk11
USER root
USER jenkins
젠킨스는 별도 Docker File로 빌드하여 이미지를 생성하였는데, 별다른 이유 없이 추후 별도로 생성 되었기 때문이다.
이 때 젠킨스는 위 Nginx와 톰캣 컨테이너와 같은 네트워크에서 동작 하도록 별도 설정 하였다.
웹훅을 통한 빌드 후 젠킨스 컨테이너에서 톰캣 컨테이너에 접근할 때 발생했던 에러들에 대하여 다룬다.
Server returned HTTP response code: 500 for URL: http://tomcat:8085/manager/text/list
500 에러
500 에러 같은 경우에는 톰캣 유저의 권한이 잘못 설정 되었거나, IP가 허용 되지 않아서 발생했을 가능성이 크다.
<role rolename="manager-script"/>
<user username="jenkins" password="yourpassword" roles="manager-script"/>
반드시 유저의 권한을 manager-script 를 부여 하여야 한다.
<Context antiResourceLocking="false" privileged="true">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1" />
</Context>
/webapps/manager/META-INF/context.xml 아래에 위 코드를 살펴봤을 때 allow가 127.x 으로 되어있으면 외부에서는 접근이 되지 않는다.
<Context antiResourceLocking="false" privileged="true">
<!-- 모든 IP 허용 -->
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow=".*" />
</Context>
위는 예시일 뿐 위험하니 특정 IP만 허용 해두자.
404 에러
Docker 이미지를 통해 실행한 톰캣에는 manager 앱이 없는 경우가 있다고 한다.
이로 인해서 404 에러가 주로 발생한다.
우리는 manager 앱을 통해 톰캣에 외부에서부터 접근 하기에 해당 앱이 필수로 존재 하여야 한다.
cd /usr/local/tomcat/webapps
curl -O https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.96/bin/extras/catalina-manager-webapp-8.5.96.tar.gz
tar -xzf catalina-manager-webapp-8.5.96.tar.gz
mv catalina-manager-webapp-8.5.96 manager
본인의 톰캣 버젼과 일치하는 톰캣을 설치해서 해당 manager 폴더를 우리 webapp 경로로 복사 해주자.
위 두 문제를 해결 했다면 아래 명령어를 젠킨스 컨테이너에서 쳐보자.
curl -i -u {톰캣 유저 ID}:{톰캣 유저 비밀번호} http://{톰캣 컨테이너 이름}:{톰캣 실행 포트}/manager/text/list
위 명령어가 200이 나와야 정상적으로 톰캣 컨테이너의 Manager 접근이 된 것이다.
프로젝트는 jdk8인데, 이 때문에 젠킨스 버젼을 낮추면 제대로 동작하는 플러그인 자체가 없는 경우가 많다.
그렇기에 울며 겨자먹기로 젠킨스 버젼을 최소 11이상으로 갖추는데, 이 때 추후 빌드 및 배포시 문제가 발생할 가능성이 크다.
이 때 기본 JDK11 제외하고, 다른 버젼의 JDK를 설치하는 방법을 공유 하고자 한다.
먼저 AdoptOpenJDK 플러그인을 설치한다.
그후 Jenkins 관리 > Tools > JDK installations에 접근한다.

그리고 위와 같이 원하는 버젼을 선택 해주면 된다.