먼저 이전 Section에서 시행했던 Tomcat에 대한 설정을 모두 했다고 생각하고 과정을 진행하도록 하겠다.
(당연히 Tomcat은 구동되고 있는 상태여야 한다)
당연히 Maven Project로 생성해야 한다.
아래에 "Copy from"이라는 Section이 존재하는데, 이전에 생성했던 Item 설정을 그대로 가지고 오고 싶다면 이전 Item의 이름을 입력하면 된다.
이번 Item은 두 번째 Maven Project Item에서 Build 과정까지는 동일하고 Tomcat에 패키징 한 WAR 파일을 구동시키는 과정만 추가된 것이므로 두 번째 Item의 설정을 그대로 가지고 오도록 하겠다.
나머지 부분은 두 번째 Item의 동작 과정과 동일하므로 설정을 바꾸지 말고, General > 설명 부분만 Tomcat에 구동시킨다는 것을 명시해주자.(필수 과정은 아니다)
빌드 후 조치 과정이라는 것은 말 그대로 WAR 파일로 Packaging이 끝난 이후 수행할 작업을 의미하는 것이다.
따라서 우리는 이 Section에서 Packaging 파일을 동작하고 있는 Tomcat에서 실행시키도록 해주면 될 것이다.
이전 Section에서 우리는 hello-world.jar 파일로 Packaging 결과물이 만들어졌음을 알 수 있었다.
따라서 war 파일을 Tomcat에서 실행시키도록 설정해주면 된다.
*/.war는 Jenkins Item Directory의 war 파일을 사용한다는 의미를 가진다.
hello-world.war 파일을 실제로 동작시킬 Web Server나 WAS를 선택하는 과정이다.
우리는 컴퓨터에 따로 수행시켰던 Tomcat을 활용할 것이기 때문에 Tomcat을 선택해야 하며, 필자는 9.0 버전을 설치했으므로 9.x Remote를 선택하였다.
Tomcat이 동작하고 있는 URL을 입력해주면 된다. 필자는 localhost:8081을 통해 구동시킨 Tomcat 서버에 접근할 수 있으므로 http://localhost:8081/을 사용하였다.
이때 내가 localhost:8081을 통해 접속할 수 있는 이유는 Windows에 Jenkins를 설치했기 때문이다. 만약 Docker Desktop을 활용했다면 아마 에러가 발생할 것이다. 왜일까? 그리고 어떻게 설정해야 할까?
Docker Desktop은 Jenkins 서비스를 제공하는 Docker Container를 생성하고 이를 실행시킴으로써 Jenkins를 사용할 수 있게 도와준다.
즉, Docker Desktop은 내 컴퓨터에 설치되어 있지만 Docker Container 내부의 IP 주소와 내 컴퓨터의 IP 주소는 다른 것이다. 우리는 이런 문제를 해결하기 위해서 docker run의 -p Option을 통해 Port 번호를 연결해주기도 했었다.
localhost(127.0.0.1)이란 무엇일까? 바로 "실행하고 있는 환경"을 의미한다.
Jenkins는 현재 Docker Container 내부에서 실행되고 있다. 따라서 만약 localhost로 주소를 설정해버리면 "Docker Container 내부의 8081 Port"에 접속되게 될 것이다.
당연히 Tomcat은 내 컴퓨터에서 실행되고 있고, 이는 Docker Container 내부에 있는 Jenkins 측에서는 외부 IP 주소가 되는 것이다.
이런 점을 모두 고려하면 Jenkins 입장에서 외부 환경의 8081 Port에서 실행되고 있는 Tomcat 서버에 접속해야 하지만 localhost(127.0.0.1)을 활용하게 되면 Jenkins Container 내부의 8081 Port에 접속하게 되며, Container 내부에는 Tomcat을 구동시킨 상태가 아니기 때문에 아무런 일이 벌어지지 않을 것이다.
이런 문제를 해결하기 위해 localhost 대신 내 컴퓨터(Windows, MacOS 등)의 IP 주소를 찾고, [내 컴퓨터의 IP 주소]:8081로 입력해야지만 내가 실행시키고 있는 Tomcat 서버에서 war 파일을 실행시킬 수 있는 것이다.
Tomcat 입장에서도 Container라는 외부 IP 주소가 접근해야하기 때문에 이전에 했던 접근 IP 제한 설정을 주석 처리해준 것이다.
이 과정이 아마 핵심이 아닐까 싶다.
하지만 이 상태로 동작을 시키면 Build까지는 성공하지만 Tomcat에서 war파일을 실행시키지는 못할 것이다.
바로 권한 때문이다.
이전 Tomcat을 설정할 때 우리는 "manager-script"라는 권한을 공부한 적이 있었다.
manager-script 권한을 가진 User는 Plain text interface를 통해 Tomcat을 활용할 수 있었다.
Jenkins는 Script를 통해 필요한 Tomcat Web Server에 war파일을 배포해야 하기 때문에 Plain text interface 권한을 가져야 하며, 이를 위해 우리가 이전에 만들었던 "deployer" 계정에 대한 Credential을 추가할 필요가 있다.
먼저 Credentials > Add > Jenkins를 선택한다.
이후 Username에 "deployer", Password에 "deployer"를 입력해준다.
이는 이전 Tomcat 설정에서 username=deployer인 계정에 role=manager-script를 부여했으므로 이 계정을 통해 Tomcat에 대한 권한을 얻으려는 과정이다.
만약 이전에 Username이나 Password를 다르게 했다면 설정한 Username과 Password를 입력하자
이후 ID에는 Jenkins에서 권한들을 구별할 수 있도록 이름을 지어주고 Description에는 권한에 대한 설명을 적어주면 된다.
이후 Add 버튼을 클릭한다.
마지막으로 Credentials > 내가 추가했던 ID를 선택하면 된다.
모든 설정이 끝났으니 Apply & 저장을 클릭하고 지금 빌드를 시켜보자.
사진을 보면 /hello-word에 "Archetype Created Web Application"이라고 써져 있는 것을 볼 수 있다.
즉, Jenkins를 통해 실행시킨 war 어플리케이션을 /hello-world를 통해 접근할 수 있다는 것이다.
성공!