Jenkins 이미지 배포 자동화

SangYeon Min·2023년 12월 1일
0

STUDY-DevOps

목록 보기
6/7
post-thumbnail

Host PC Deployment

Tomcat Server Docker 환경 구성

docker run -d -it -p 8888:8080 --name tomcat tomcat:9
docker exec -it tomcat bash

위 명령어로 tomcat 9 도커 이미지를 불러와 tomcat 컨테이너를 실행시키고

cp -R webapps.dist/* webapps

tomcat 도커 이미지의 경우 기본적으로 manager 등 웹 앱이 webapps.dist에 존재하기 때문에 위와 같이 bash로 실행중인 도커 컨테이너에 접속한 이후 cp를 통해 manager가 구동될 수 있게 한다.

apt-get update
apt-get install -y nano

추후 원활한 tomcat 서버 설정을 위해 nano 텍스트 에디터를 설치해준다.

cd /usr/local/tomcat/conf
rm tomcat-users.xml
echo -e '
<?xml version='1.0' encoding='cp949'?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">


<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>

<user username="admin" password="admin" roles="manager-gui, manager-script, manager-jmx, manager-status"/>
<user username="deployer" password="deployer" roles="manager-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>

</tomcat-users>
' >> tomcat-users.xml

이후 tomcat users 파일을 위와 같이 설정해 manger 웹 앱을 위한 role을 부여하고

cd /usr/local/tomcat/webapps/manager/META-INF
rm context.xml
echo -e '
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
  <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
                   sameSiteCookies="strict" />
<!--  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>  
</Context>
' >> context.xml

외부 브라우저로부터의 tomcat 서버 요청을 허용하기 위해 RemoteAddrValve를 주석처리한다.

cd /usr/local/tomcat/webapps/manager/WEB-INF
nano web.xml

만약 manager에 로그인이 정상적으로 이루어지지 않을 경우 위와 같이 manager webapp에 접근하여

  <!-- Define a Security Constraint on this Application -->
  <!-- NOTE:  None of these roles are present in the default users file -->
<!-- Delete Security Constraint -->
    <web-resource-collection>
      <web-resource-name>HTML Manager interface (for humans)</web-resource-name>
      <url-pattern>/html/*</url-pattern>
    </web-resource-collection>
<!-- Delete Security Constraint -->
    <web-resource-collection>
      <web-resource-name>Text Manager interface (for scripts)</web-resource-name>
      <url-pattern>/text/*</url-pattern>
    </web-resource-collection>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>JMX Proxy interface</web-resource-name>
      <url-pattern>/jmxproxy/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
       <role-name>manager-jmx</role-name>
    </auth-constraint>
  </security-constraint>
...

web.xml의 html, text manager interface의 securoty constraint를 제거하면 로그인 없이 접근할 수 있다.

Jenkins Tomcat CI 구축

docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-server --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk11

Jenkins 도커 이미지를 불러와 컨테이너를 위 명령어로 실행시켜준다.

$ docker ps
$ docker logs d221d94679ca
Running from: /usr/share/jenkins/jenkins.war
webroot: /var/jenkins_home/war
2023-11-30 07:06:23.898+0000 [id=1]     INFO    winstone.Logger#logInternal: Beginning extraction from war file
2023-11-30 07:06:24.919+0000 [id=1]     WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
...
*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

f43aecbb297447159e79d3c8700787f9

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************
...

최초 로그인시 docker logs로 initial Admin Password를 확인해 로그인 해준다.
maven 프로젝트의 빌드를 위해 Maven Integration 플러그인을 Jenkins에 설치하고
Jenkins Tools 설정에서 mvn의 버전을 지정하고 Install 설정을 넣어준다.
이후 Maven Project로 아이템을 생성한 이후 위와 같이 git repository를 넣어주고
Pre Steps에서 clean compile package goals를 주어 패키지를 컴파일하도록 한다.
또한 컴파일된 패키지를 컨테이너에 배포하기 위해 Deploy to container 플러그인을 추가하고
Tomcat manager 로그인을 위한 Auth 정보를 위와 같이 입력해준 다음
빌드 후 조치로 컴파일된 war 파일을 Target Tomcat URL로 보내주는 설정을 마치면

위와 같이 빌드가 완료되고 Tomcat 서버에 배포되어 localhost:8888로 접근할 수 있는 것을 볼 수 있다.


Public Cloud Deployment

EC2 인스턴스 Tomcat Docker 설치

기존에 생성한 EC2 인스턴스에 아래와 같은 명령어들로 tomcat 서버를 설치한다.

# stop nginx for port 80
sudo su
service nginx stop

sudo yum install docker -y
sudo service docker start

# Add sudo to Docker GRP
sudo usermod -aG docker ec2-user

docker run -d -it -p 80:8080 --name tomcat tomcat:9
docker exec -it tomcat bash

apt-get update
apt-get install -y nano

cp -R webapps.dist/* webapps

이때 webapps.dist 파일을 복사하고 난 후 Host PC의 Tomcat Manager 설정과 동일하게 설정한다.
인스턴스에 Tomcat이 설치된 것을 볼 수 있고 또한 ALB로도 정상적으로 접근이 가능한 것을 볼 수 있다.

AWS 3-Tier Jenkins 배포


이후 인스턴스의 Public IP 로 Jenkins의 Deploy 설정을 완료해주면

[DeployPublisher][INFO] Attempting to deploy 1 war file(s)
[DeployPublisher][INFO] Deploying /var/jenkins_home/workspace/MAVEN_GIT_PROJECT/target/hello-world.war to container Tomcat 9.x Remote with context null
  [/var/jenkins_home/workspace/MAVEN_GIT_PROJECT/target/hello-world.war] is not deployed. Doing a fresh deployment.
  Deploying [/var/jenkins_home/workspace/MAVEN_GIT_PROJECT/target/hello-world.war]
[DeployPublisher][INFO] Deploying /var/jenkins_home/workspace/MAVEN_GIT_PROJECT/target/hello-world.war to container Tomcat 9.x Remote with context null
  [/var/jenkins_home/workspace/MAVEN_GIT_PROJECT/target/hello-world.war] is not deployed. Doing a fresh deployment.
  Deploying [/var/jenkins_home/workspace/MAVEN_GIT_PROJECT/target/hello-world.war]
Finished: SUCCESS

위와 80번 포트는 0.0.0.0으로 열려있기 때문에 Jenkins에서 정상적으로 배포하는 것을 확인할 수 있다.

0개의 댓글