● 환경 : Centos 7, 젠킨스 2.346.1, openJDK 1.8, 스프링, SVN, Maven 환경
● 개요 : 요세는 거의 잘 안쓰는 SVN 환경에서 젠킨스를 구축할 일이 생겨서 설치 및 설정 후 빌드를 실행하니 자꾸 아래의 오류 메시지가 나타나면서 빌드가 실패하였다.
● 오류메시지 :
The Tomcat Manager responded "FAIL - Deployed application at context path [/devsim-1.0.0-BUILD-SNAPSHOT] but context failed to start
" instead of the expected "OK" message
「젠킨스 콘솔 오류 메시지」
java.io.FileNotFoundException: class path resource [config/file.properties] cannot be opened because it does not exist
「톰캣 Catalina.out 로그 오류 메시지」
아무리 구글링을 해보아도 마땅한 방법이 나오지 않고 SVN 리포지토리를 확인해보니 SNAPSHOT.jar 파일에서 없다고 나타나는 파일이 SVN 오류로 제대로 커밋이 안되어서 나타나는 문제인가 하고 한참을 헤맸었다
● 해결책 :
한참 삽질을 하다가 아래와 같은 내용으로 문제를 해결하였다.
1. 먼저 SVN에 찾을 수 없다는 파일이 정상적으로 커밋이 되었는지 체크한다.
2. 젠킨스 해당 프로젝트 [구성] -> [Build] 항목의 Goals and options에 clean install 이 누락되었는지 확인한다.
3. 빌드전에 해당 프로젝트 war 파일, 프로젝트 디렉토리를 삭제한다.(테스트 중 snapshot이 붙은 war 파일이 있는 경우 해당 파일과 디렉토리 전부 삭제한다.)
젠킨스 환경설정의 길은 멀고도 험했다.... 가상호스트에 TLS(SSL)까지 적용된 환경에서는 뭔놈의 에러가 이리 많이 발생하는지... 테스트 환경의 설정하고는 난이도가 비교조차 되지 않았다 ㅡㅡ;;;; 구글에서 검색조차 되지 않을 정도로 삽질한 사람들도 적다................
아무튼 각설하고 젠킨스 자동빌드 환경을 구성하려고 하는데
Caused by: javax.net.ssl.SSLHandshakeException: No subject alternative names matching IP address 아이피주소 found
요딴 에러가 발생하면 아래 해결책이 있다....
● 환경
- CentOS 7
- 젠킨스 2.346.1
- 아파치 톰캣 8.5
- 젠킨스와 톰캣은 동일한 서버에 설치됨
- 톰캣 가상호스트 사용중
- TLS(SSL) 적용중..
● 원인
일단 웹브라우저로 톰캣 매니저에 접속해본다. (예: https://서버IP주소:SSL포트/manager/html 와 https://서버IP주소:SSL포트/host-manager/html 이다. 접속 성공하면 아이디 비밀번호를 물어본다..) 정상적으로 접속이 된다면 넘어간다..
다음으로 젠킨스 설정 중 빌드 후 조치는 위와 같이 되어 있었을 것이다....
이 상태에서 빌드 후 배포를 하려고 하면 젠킨스가 IP 주소로 톰캣 메니저에 접근 할려고 하니 인증서 도메인과 일치하지 않아서 SSLHandShakeException이 발생한다... 서버 jre의 keystore에 TLS(SSL)파일을 등록해도 안된다... 죽어도 안된다.
● 해결책
위 원인에서 톰캣 매니저 접근 시 주소가
https://서버IP주소:SSL포트/manager/html
https://서버IP주소:SSL포트/host-manager/html
이런식으로 되어 있는데 본인이 업무하는 곳이라면 DNS 담당자에게 요청해서 DNS서버에 도메인으로 접속할 수 있도록 도메인을 생성해야 한다.
문제 : CentOS 7 환경에서 젠킨스를 테스트 하기 위하여 설치 후 서비스를 시작하려고 하는데
자꾸 아래와 같은 오류가 발생하였다.
[root@localhost ~]# service jenkins start Starting jenkins (via systemctl): Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details. [실패] [root@localhost ~]# systemctl status jenkins.service //자세한 사항을 확인하라고 하여 확인을 해보았다 ● jenkins.service - Jenkins Continuous Integration Server Loaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled) Active: failed (Result: start-limit) since 목 2022-06-30 08:32:00 KST; 7s ago Process: 7079 ExecStart=/usr/bin/jenkins (code=exited, status=1/FAILURE) Main PID: 7079 (code=exited, status=1/FAILURE)
localhost.localdomain systemd[1]: Failed to start Jenkins Continuous Integration Server. localhost.localdomain systemd[1]: Unit jenkins.service entered failed state. localhost.localdomain systemd[1]: jenkins.service failed. localhost.localdomain systemd[1]: jenkins.service holdoff time over, scheduling restart. localhost.localdomain systemd[1]: Stopped Jenkins Continuous Integration Server. localhost.localdomain systemd[1]: start request repeated too quickly for jenkins.service localhost.localdomain systemd[1]: Failed to start Jenkins Continuous Integration Server. localhost.localdomain systemd[1]: Unit jenkins.service entered failed state. localhost.localdomain systemd[1]: jenkins.service failed. [root@localhost ~]# journalctl -xe //더 자세한 사항을 확인해보라고 하여 확인 해보았다..... localhost.localdomain jenkins[7079]: Caused: java.io.IOException: Failed to bind to 0.0.0.0/0.0.0.0:8080 localhost.localdomain jenkins[7079]: at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349) localhost.localdomain jenkins[7079]: at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310) localhost.localdomain jenkins[7079]: at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80) localhost.localdomain jenkins[7079]: at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:234) localhost.localdomain jenkins[7079]: at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73) localhost.localdomain jenkins[7079]: at org.eclipse.jetty.server.Server.doStart(Server.java:401) localhost.localdomain jenkins[7079]: at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73) localhost.localdomain jenkins[7079]: at winstone.Launcher.<init>(Launcher.java:202) localhost.localdomain jenkins[7079]: Caused: java.io.IOException: Failed to start Jetty localhost.localdomain jenkins[7079]: at winstone.Launcher.<init>(Launcher.java:206) localhost.localdomain jenkins[7079]: at winstone.Launcher.main(Launcher.java:405) localhost.localdomain jenkins[7079]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) localhost.localdomain jenkins[7079]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) localhost.localdomain jenkins[7079]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) localhost.localdomain jenkins[7079]: at java.lang.reflect.Method.invoke(Method.java:498) localhost.localdomain jenkins[7079]: at Main._main(Main.java:342) localhost.localdomain jenkins[7079]: at Main.main(Main.java:117) localhost.localdomain systemd[1]: jenkins.service: main process exited, code=exited, status=1/FAILURE localhost.localdomain systemd[1]: Failed to start Jenkins Continuous Integration Server.
원인 : 포트가 충돌나서 발생하는 문제이다. 분명 블로그 등에서 검색해서 /etc/sysconfig/jenkins 경로의 포트를 8080에서 9090으로 변경했는데... 오류가 발생하였다. 그리하여 로그를 자세히 보니 /usr/lib/systemd/system/jenkins.service 파일에도 동일한 내용이 들어있었다.
해결책 : vi나 vim을 사용하여 jenkins.service 파일의 Environment="JENKINS_PORT=9090"로 변경 후 다시 service jenkins start를 시도해 보면 정상적으로 젠킨스 서비스가 올라오는 것을 확인 할 수 있다.