본문 바로가기

프로그래밍/Spring

Jenkins를 통한 Wildfly Deploy 정리

전자정부 프레임워크를 이용하든, Spring 또는 Spring Boot를 이용하든 Maven 기반으로 war파일이 나오도록 했다면 Jenkins에 작업을 만들어서 이를 Maven을 통해 빌드한뒤 결과물인 war 파일을 Jenkins에 배포할 수 있다. 배포 방법 자체도 여러개가 있는데 여기서는 Jenkins가 배포용 pom.xml을 만들어서 Wildfly에 배포하는 방법을 이야기하도록 하겠다. 기본적인 내용은 여기에서 참조했다. 설명하는 내용은 내가 참조한 사이트에서 설명이 없어서 언급이 안되어 있는 부분에 대해 좀더 디테일하게 설명하도록 하려 한다.

 

내가 참조한 사이트에서 사용한 방법의 핵심은 Jenkins의 build step에서 배포용 pom.xml을 만드는 shell script를 실행한뒤 maven을 통해 이렇게 만든 배포용 pom.xml을 이용하여 배포하는 것이다. 먼저 그것을 일단 기억해두고 따라왔음 한다. Jenkins에서 작업을 만들때 Git이나 SVN 같은 저장소를 설정하는 부분은 이미 했을테니 이 부분은 따로 설명 하지 않고 빌드 작업에 대해서만 설명하도록 하겠다. 작업을 만들때 Build 항목으로 이동(화면 상단의 탭 메뉴에서 Build를 클릭하면 Build 항목으로 이동한다)한뒤 Add Build Step 콤보박스에서 Invoke top-level Maven targets을 선택하면 다음과 같이 나온다.

 

 

Maven Version 콤보박스에서 Jenkins에 등록한 Maven 설정 이름을 지정할 수 있다(Jenkins에서 Maven 등록은 Jenkins 메인 화면의 왼쪽 메뉴에서 Jenkins 관리 -> Global Tool Configuration 에 가서 Maven 항목에서 등록할 수 있다. Jenkins 에서 Maven 을 설치하거나 또는 기존에 Maven이 설치되어 있으면 그걸 이용할 수 있다) Goals로는 현재 저장소에 등록된 소스의 pom.xml을 이용해서 진행하게 될 Maven goal을 설정하는 것으로 기존 빌드한 것을 지우고 새로 빌드하기 위해 clean package를 설정했다. package 를 거치면 war 파일이 만들어지게 된다. 이와 같은 설정을 마치면 Add Build Step 콤보박스에서 Execute Shell을 선택한뒤 Command 항목에 다음과 같이 입력한다.

 

 

그림으로는 잘 안보이기 때문에 별도로 스크립트 소스를 옮겨 놓으면 다음과 같이 된다.

 

#!/bin/bash
wildfly_plugin_version=1.2.1.Final

# 서버 접속 정보 예시
wildfly_hostname=172.100.0.3
wildfly_port=9990
wildfly_username=admin
wildfly_password=admin

pushd target
shopt -s nullglob
for file in *.war; do
  war_filename="${file}"
  break
done
popd

cat << EOF > deploy.xml
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>example.com</groupId>
  <artifactId>wildfly-deploy</artifactId>
  <version>1</version>
  <build>
    <plugins>
      <plugin>
        <groupId>org.wildfly.plugins</groupId>
          <artifactId>wildfly-maven-plugin</artifactId>
          <version>${wildfly_plugin_version}</version>
          <configuration>
            <filename>target/${war_filename}</filename>
            <hostname>${wildfly_hostname}</hostname>
            <port>${wildfly_port}</port>
            <username>${wildfly_username}</username>
            <password>${wildfly_password}</password>
            <targetDir>.</targetDir>
            <force>true</force>
          </configuration>
        </plugin>
      </plugins>
  </build>
</project>
EOF

exec mvn -f deploy.xml wildfly:deploy-only

 

위의 Shell Script 소스를 보면 자신의 환경에 맞춰서 지정해야 할 변수가 몇개 있다. 그런것들을 포함해서 이 소스에서 사용되고 있는 변수에 대한 설명을 하도록 하겠다.

 

변수 wildfly_plugin_version 은 Wildfly 배포에 사용하기 위해 이용하는 Maven Plug-In인 wildfly-maven-plugin의 버전을 명시한다. 2018년 3월 9일자로 wildfly-maven-plugin 버전은 1.2.1.Final 이어서 1.2.1.Final로 지정했다.

 

Wildfly에 배포하는 방법으로 Wildfly의 Management 기능을 이용해서 하기 때문에 배포 대상이 되는 Wildfly의 정보를 저장해야 할 변수들이 필요하게 되는데 그 기능을 하는 변수들이 wildfly_hostname, 

wildfly_port, wildfly_username, wildfly_password 이 4개이다. wildfly_hostname 변수엔 Wildfly가 운영되는 서버의 도메인 또는 IP 주소가 설정되어 있어야 한다. wildfly_port는 Wildfly가 사용하는 Management Port 번호를 설정해야 한다. 일반적으로 Wildfly의 Management가 사용하는 Port는 9990이며 기본적으로 설정된 포트를 사용하고 있어서 9990을 썼다(만약 다른 Port를 사용하게 되면 다른 Port 번호를 써야 한다) wildfly_username은 Wildfly Management 기능을 이용하기 위한 관리자 ID를 설정해야 한다. wildfly_password는 방금 언급한 관리자 ID와 매핑되는 비밀번호를 설정한다. 이 Wildfly의 Management 관리자는 Wildfly 디렉토리/bin에 있는 add_user.sh(Windows일 경우 add_user.bat)을 이용해서 등록할 수 있다. 이렇게 등록할 때 사용된 관리자 ID와 비밀번호를 wildfly_username과 wildfly_password 에 설정한다

 

pushd target에서 target 부분은 jenkins가 maven 을 통해 빌드하면 만들어지는 결과물(war 파일, 컴파일된 class 파일등)이 들어 있는 디렉토리이다. 이 디렉토리의 기준은 Jenkins가 설치되어 있는 디렉토리/workspace/등록된 작업 이름 디렉토리이다.(구체적인 예를 들자면 Centos에서 yum으로 Jenkins를 설치할 경우 /var/lib/jenkins 에 설치된다. Jenkins에 samplesvn으로 작업을 등록했다면 이 작업의 기준 디렉토리는 /var/lib/jenkins/workspace/samplesvn 이 된다) 이 기준이 되는 디렉토리 안에 SVN 같은 Source 저장소에 저장되어 있는 source 들이 저장되며 이 상태에서 maven이 target 디렉토리를 만들어 빌드 중간 산출물과 결과물인 war 파일을 넣게 된다. target 디렉토리에 이러한 결과물들이 들어가기 때문에 target으로 설정하게 된다. 그리고 이 디렉토리 안의 파일들을 조사해서 war 파일을 발견하면 war_filename 이란 변수에 war 파일 이름을 설정하게 된다.

 

이렇게 빌드한 결과물인 war 파일 이름을 알게 되면 이 war 파일을 Wildfly에 배포하는 pom.xml을 deploy.xml 이란 파일 이름으로 저장하게 된다. groupId 와 artifactId 태그는 임의의 값으로 설정하고(아무 값이나 설정해도 된다는 뜻이다) build 태그의 하위 태그에서 shell script에서 우리가 값을 저장하기 위해 사용했던 변수들을 사용하게 된다. 여기서 filename 태그에서는 war 파일 이름을 war 파일이 있는 위치와 같이 지정해야 한다. 이렇게 만들어지는 deploy.xml은 위에서 언급한 기준이 되는 디렉토리에 만들어지기 때문에 war 파일은 target 디렉토리 안에 있게 되므로 target/${war_filename} 로 지정하게 된다. 상대경로로 지정하는 것이어서 target 앞에 /를 붙이지 않게 된다(/을 붙이면 /target이 되어 절대경로 개념이 된다)

 

이렇게 배포용 Maven 빌드 설정 파일인 deploy.xml 이 만들어진 뒤에 이 deploy.xml 을 Maven을 통해서 배포하게 되는데 이때 사용하는 것이 mvn 명령이 된다. 파일 이름이 pom.xml 이 아닌 다른 파일 이름을 사용할 땐 -f 옵션을 사용한뒤 파일명을 지정하고 작업하기 위한 goal로 wildfly:deploy-only 를 사용하는 것이다. 이렇게 빌드함으로써 Wildfly에 배포작업이 이루어진다. 그리고 Maven Plug-In 방식을 이용한 배포이기 때문에 deploy.xml 의 내용을 바꾸어서 Tomcat Maven Plug-In을 통한 배포 작업도 할 수 있다.