Sangil's blog

https://github.com/ChoiSangIl Admin

Jenkins, Docker, Github를 이용하여 WAR 자동 배포하기 DEV

2019-12-10 posted by sang12


Jekins와 Docker, Github를 이용하여 웹서비스를 배포해보도록 하겠습니다.
(계획 : Jenkins와 Docker를 활용하여 자동배포(CD) 환경 만들기)

환경 : CentOS7

1_1) Jenkins 설치

(참고 : https://pkg.jenkins.io/redhatstablehttps://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions)
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins

1_2) PORT 변경(default port:8080 변경이 필요없으면 skip)


설정파일 경로 /etc/sysconfig/jenkins
방화벽 포트 열기

$firewall-cmd --zone=public --add-port=9999/tcp --permanent
$firewall-cmd --zone=public --add-service=http --permanent
$sysconfig]# firewall-cmd --reload

1_3) Service 시작 및 계정 생성

$ systemctl enable jenkins 
$ systemctl start jenkins

http://localhost:9999/ 접속! Jenkins의 초기 암호는 /var/lib/jenkins/secrets/initialAdminPassword에 들어가면 나와 있습니다.  나와 있는 암호로 로그인하고 Select plugins를 누르고 원하는 플러그인들을 선택해줬습니다. 일단 저는 제가 모르는것들은 다 체크를 해제하고 진행하였습니다. (추후에도 추가로 설치 가능함)

그리고 어드민 계정을 만들어주면 젠킨스아저씨의 얼굴을 볼 수 있습니다 ^^


2_1) Jenkins 설정

Jenkins 관리 플러그인 관리에서 Git Plugin을 다운 받아줍니다. 

 그리고 새 작업을 선택후 Freestyle project로 생성해줍니다. 아이템명은 원하시는걸로 설정해주세요.

그리고 소스코드 관리에서 Git을 클릭하고 Repository URL에 Github 주소를 넣어줍니다. 그러면 Jenkins는 /var/lib/jenkins/workspace/blog(아이템명) 해당 경로 아래서 소스를 clone 해옵니다. (사실 plugin을 굳이 설치하지 않아도, 쉘 명령어만으로도 가능합니다 Jenkins는 리눅스에서 할 수 있는 작업들을 자동화 해주는 툴이므로.. ) 이제. 소스를 가져 왔으니 War파일을 만들고 dockerfile과 docker-compose를 이용하여 도커 컨테이너를 생성하도록 하겠습니다.

2_2) 컨테이너 배포

# 설정파일 복사
cp ./config/application-dev.properties ./sangilBlog/src/main/resources/

# 그래들 권한부여 및 소스
cd ./sangilBlog
chmod +x ./gradlew
./gradlew --info build

# WAR 파일 이동 후 docker 배포
cp ./build/libs/ROOT-0.0.1-SNAPSHOT.war ../docker/war/ROOT.war
/usr/local/bin/docker-compose -f ../docker/docker-compose.yml build --no-cache
/usr/local/bin/docker-compose -f ../docker/docker-compose.yml up -d

Execute Shell을 이용하여 직접 명령어를 넣었습니다. 참고로 작업하면서 힘들었던 부분이 CP를 쓸때 권한 문제라던지.... docker-compose명령어를 사용 했을때 docker-compose: command not found 란 오류가 난다던지...하는 오류들을... 권한 문제는 chmod 777권한으로.. command not found는 docker compose를 다시 설치하고 docker도 다시 설치해보고.. 권한 ( usermode -aG docker 'jenkins' ) 도 줘보고.. jenkins를 내렸다올리니 해결 되었습니다. 
-> 추가로 권한 문제가 나오시는 분들은 아래 Dockerfile 설정부분을 참고바랍니다. 호스트 리눅스와 도커 계정간의 권한문제 때문에 젠킨스로 배포할 때 permission denied 가 발생 할 수 있습니다.

-docker-compose.yml, Dockerfile
#docker-compose.yml
version: '3.7'
services:
    tomcat:
     build:
      context: .
      args:
       warpath: ./war/ROOT.war
       dockerfile: ./Dockerfile
     ports:
      - '8080:8080'
     volumes:
      - ./tomcatVol/logs/:/usr/local/tomcat/logs/
#Dockerfile
FROM tomcat:8.5.46-jdk8-openjdk

ARG warpath
#젠킨스의 uid gid로 설정.
ARG UNAME=jenkins
ARG UID=988
ARG GID=981

RUN groupadd -g $GID $UNAME
RUN useradd -m -u $UID -g $GID -s /bin/bash $UNAME
RUN chown -R $UNAME:$UNAME /usr/local/tomcat
USER $UNAME

RUN rm -Rf /usr/local/tomcat/webapps/ROOT ## tomcat root 경로 삭제
COPY $warpath  /usr/local/tomcat/webapps/ROOT.war

여기까지 Jenkins를 활용하여 Github에서 가져온 소스를 Docker 컨테이너로 배포해 보았습니다. 이제 블로그를 배포할때 버튼만 한번 누르면 되겠군요 ^^; 

#Jenkins #Docker #Github #배포 #Docker를 이용한 배포
REPLY