-->

[Jenkins] Wildfly 배포 자동화

 

 

<실패 후>

Dood라는 개념이 있다. Docker Out Of Docker라는 개념인데 jenkins를 docker container로 띄우면 해당 container안에서 docker를 설치해 작업하는 Docker In Docker 방식이 있고 Docker Out Of Docker 방식이 있는데 DIND는 docker에서도 지양해야 하는 방법이라 Dood로 진행하려고 한다.

이를 위해 jenkins를 build할 때 host os의 docker.sock 소켓 파일을 jenkins container 내부와 volume 설정으로 연결해야 한다.

저번에 jenkins를 설치하면서 sock 연결은 했지만 jenkins container 내부에도 여러 파일들을 install 해야 한다.

따라서 Dockerfile을 다음과 같이 수정하여 작업하자.

 

이전 Dockerfile

FROM jenkins/jenkins:centos7
USER root

 

수정

FROM jenkins/jenkins:centos7

#metadata
LABEL name="minggu"
LABEL email="minha1002@gmail.com"
LABEL description="jenkins test"

USER root

# Install docker
RUN yum update -y && yum install -y docker wget

# Add deploy.sh
ADD /opt/docker/dockerfiles/jenkins/resouces/wildfly_deploy.sh ~/wildfly_deploy.sh

 

확인

$ docker exec jenkinsC docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                      NAMES
e68645cf1be6        docker_wildfly      "/bin/sh -c '/opt/..."   3 hours ago         Up 2 hours          0.0.0.0:1003->8080/tcp, :::1003->8080/tcp, 0.0.0.0:1004->9990/tcp, :::1004->9990/tcp       wildflyC
f1b4e6feb68b        docker_jenkins      "/sbin/tini -- /us..."   26 hours ago        Up 2 hours          0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:5080->8080/tcp, :::5080->8080/tcp   jenkinsC

이로써 jenkins container 안에서 wildfly container로 접근이 가능해졌다!

 

 

 

 

 

저번 시간에 Jenkins 안에 SVN repository와 연결된 item을 생성했다.

해당 프로젝트를 svn commit 이 이루어지면 자동으로 build 하여 배포할 수 있도록 자동화를 할 것이다.

item이 생성됐고 SVN이 연결되었다고 가정하고 진행해보자.

https://minggu92.tistory.com/85

 

[Jenkins] Jenkins - SVN 연동

[Jenkins] Jenkins - SVN 연동 보통 Git을 많이 연동하는데 사내 인프라에서는 SVN을 사용하므로 SVN 연동을 먼저 작업해보겠다. 1. SVN plugin 설치 'Jenkins 관리' -> '플러그인 관리' -> '설치 가능' 탭 ->..

minggu92.tistory.com

 

 

1. Plugin 설치

Deploy to container를 설치해주자. Subversion과 Slack Notification도 설치 안 했다면 고고

 

 

2. JDK 추가

Jenkins 관리 - Global Tool Configuration

 

에서 Add JDK을 클릭한다.

 

Install automatically 체크 버튼을 해제하여 JAVA_HOME을 수동으로 설정해 줄 수 있다. 

근데 일단 자동으로 한번 생성!

 

아 생각해보니 jenkins image에 이미 jdk가 포함되어 있었다.

$ docker inspect jenkinsC | grep 'JAVA*'
                "JAVA_HOME=/opt/java/openjdk"

ㅋㅎ 해당 경로로 잡아주자

 

 

 

3. MAVEN 설정

jdk를 추가하고 아래로 쭉 내려보면

이렇게 설정해 줄 수 있는데 pom.xml에 들어가 보면 메이븐 버전 확인을 할 수 있다.

마찬가지로 HOME PATH를 설정할 수 있으니 편한 대로 진행해보자.

 

4. 빌드 설정

 

 

자동화하려는 item의 구성으로 들어가면 build 관련 설정을 할 수 있다.

 

4.1) 빌드 유발

Build Trigger는 매 3분마다 Push 된 내역이 있으면 자동으로 빌드 진행할 수 있도록 스케줄링 해주자.

 

4.2) Build

Invoke top-level Maven targets을 선택해 아까 설정한 Maven version을 입력해준다.

Goalsclean package를 입력해준다.  -DskipTests=true는 테스트를 스킵하겠다는 명령어이다.

maven clean package는 maven clean install과 비슷한 개념이다. 

 

다음으로 Add build step 버튼을 클릭해 Excute Shell을 추가해준다.

해당 설정에서 Wildfly에 Deploiy 하기 위한 쉘을 미리 Dockerfile로 ADD해 줬다.

#deploy wildfly war by minggu 20220407

JENKINS_HOME=/var/jenkins_home
WILDFLY_HOME=/opt/jboss/wildfly
DATE=`date +%Y%m%d`
APPLICATION_NAME=minggu-test
WAR_FILE=`find $JENKINS_HOME/workspace/$APPLICATION_NAME/target -name '*.war' -exec basename {} \;`

# Move war to backup folder
docker exec wildflyC mkdir -p $WILDFLY_HOME/deployments_backup/$DATE \
			&& mv $WILDFLY_HOME/standalone/deployments/$WAR_FILE $WILDFLY_HOME/deployments_backup/$DATE

# Copy war file to wildfly container
docker cp $JENKINS_HOME/workspace/$APPLICATION_NAME/target/$WAR_FILE \
                        wildflyC:$WILDFLY_HOME/standalone/deployments/

# Restart wildfly Web Server container
docker exec wildflyC bash $WILDFLY_HOME/bin/jboss-cli.sh --connect :reload

후.. 쉘짜는거 어렵다 나중에 최적화해야지

 

 

 

4.3) 빌드 후 조치

빌드가 되면 war파일을 컨테이너로 배포할 수 있도록 세팅해보자.

 

테스트로 돌렸을 때 war가 생성되는 경로를 파악해두긴 했다.

 

WAR/EAR files는 war파일 경로를, Context path는 "/" 혹은 root경로를 입력하면 된다.

 

Add Container를 눌러 wildfly admin 계정 정보와 URL을 입력하도록 하자.

 

 

 

5. Test

그리고 빌드를 해보니

 

후 일단 실패...

 

build단계에서 쉘로 직접 docker에 배포를 했다.

....
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  02:17 min
[INFO] Finished at: 2022-04-07T18:08:14+09:00
[INFO] ------------------------------------------------------------------------
[minggu-test] $ /bin/sh -xe /tmp/jenkins15976245722877408796.sh
+ /root/wildfly_deploy.sh
{
    "outcome" => "success",
    "result" => undefined
}
[Slack Notifications] found #32 as previous completed, non-aborted build
[Slack Notifications] will send OnBackToNormalNotification because build matches and user preferences allow it
Finished: SUCCESS

ㅠㅠㅠ

 

 

 

<참고>

https://waspro.tistory.com/552

 

[Jenkins] Jenkins를 활용한 WildFly CI/CD 환경 구성

본 포스팅에서는 Jenkins를 활용한 WildFly CI/CD 환경 구성 방법에 대해 살펴보겠습니다. Jenkins 설치 과정은 아래 포스팅을 참고하세요. [Jenkins] Jenkins 설치 가이드 전형적인 Legacy 환경의 Web Ap..

waspro.tistory.com

https://kimeck.tistory.com/31

 

[Docker] Jenkins&Tomcat 자동화 배포(SVN) -3

 | 젠킨스란? 젠킨스는 소프트웨어 개발 시 지속적으로 통합 서비스를 제공하는 툴이다. CI(Continuous Integration) 툴 이라고 표현한다. 다수의 개발자들이 하나의 프로그램을 개발할 때 버전 충돌을

kimeck.tistory.com

https://examples.javacodegeeks.com/enterprise-java/jboss-wildfly/wildfly-maven-plugin-example/

 

Wildfly Maven Plugin Example

This is an article about using the Wildfly Maven Plugin, a plugin developed by Red Hat that allows you to deploy, undeploy, and manage applications on a

examples.javacodegeeks.com

 

+ Recent posts