[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
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을 입력해준다.
Goals에 clean 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
https://examples.javacodegeeks.com/enterprise-java/jboss-wildfly/wildfly-maven-plugin-example/
'Server & Infra' 카테고리의 다른 글
[Linux / Windows] 특정포트를 사용하는 프로세스 강제종료 (0) | 2022.09.26 |
---|---|
[Linux] WSL2를 이용한 윈도우에 리눅스 설치 (0) | 2022.08.24 |
[Jenkins] Slack으로 Jenkins 알림받기 (0) | 2022.04.06 |
[Jenkins] Jenkins - SVN 연동 (0) | 2022.04.05 |
[Jenkins] Docker로 Jenkins 빌드 및 설치 (0) | 2022.04.04 |