사내에 젠킨스 구축하기

JaruKim·2021년 7월 28일
1

배경

큰 규모의 프로젝트를 진행하면서 빌드와 배포를 하는 일이 잦아졌습니다.

적어도 하루에 한 번, 많게는 다섯 번이 넘도록 빌드하고 배포를 해야 했습니다.

혼자 운영만 한다면 크게 문제 되지는 않지만 개발도 병행해야 했기에, 젠킨스 도입을 결정했습니다.

구성도

젠킨스는 도커 컨테이너 안에서 동작합니다. 그리고 항상 최신 깃 데이터를 가져와서 빌드하고 배포를 합니다.

배포하는 웹어플리케이션은 독립적인 환경 구성을 위해 각각 별도의 웹서버를 가집니다.

문제는 도커 컨테이너 안에서 배포를 한다고 해도 외부에서 접근할 수 없습니다.

각 웹어플리케이션을 독립적인 웹서버에 올라가기 때문에 서비스가 늘어나면 젠킨스 컨테이너에 포트를 추가해야 합니다. 하지만 한번 생성된 컨테이너에는 포트를 추가할 수 없습니다. 포트를 추가하려면 컨테이너를 지우고 다시 컨테이너를 구동해야 합니다.

그래서 도커의 DOOD 기법을 활용해서 젠킨스 컨테이너의 호스트 도커에 컨테이너를 생성하는 방식으로 WAS를 구성합니다.

DooD

도커 DooD는 도커 바깥의 도커(Docker out of Docker)를 의미합니다. 다르게 말하면 도커 컨테이너에서 컨테이너 외부 호스트의 도커를 사용하는 것입니다.

이와 다르게 DinD(Docker in Docker)가 있는데, 여러 도커 커뮤니티에서는 보안 상의 이유로 DooD를 추천하고 있습니다.

아래와 같이 호스트의 docker.socket을 컨테이너와 볼륨으로 공유하여 컨테이너에서 호스트의 도커를 사용할 수 있습니다. 컨테이너에도 도커가 설치되어 있어야 합니다.

# 볼륨으로 docker.socket 연결
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -d -p 8080:8080 \
--name=docker-test docker-image /sbin/init

# 도커 컨테이너 진입 후, 호스트의 도커 실행 확인
$ docker exec -it docker-test /bin/bash
$ docker ps

도커 컨테이너 준비

centos 7를 준비합니다.

$ docker run -p 8080:8080 -h jenkins --name=jenkins -d centos:7 /sbin/init

생성한 컨테이너에 접속하여 도커와 wget을 설치합니다.

# 컨테이너 진입
$ docker exec -it jenkins /bin/bash

# 도커, wget 설치
$ yum install -y docker
$ yum install -y wget

젠킨스를 설치하고 실행합니다.

$ wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
$ rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
$ yum upgrade
$ yum install jenkins java-1.8.0-openjdk-devel
$ service jenkins start

젠킨스 설정 및 프로젝트 등록

구성하려는 프로젝트가 Maven을 사용하고 있기 때문에 관련 플러그인을 설치해줍니다.

배포는 빌드가 완료된 다음, 쉘 스크립트로 배포합니다.

쉘 스크립트는 빌드가 정상적으로 성공하면 동작합니다.

빌드가 성공하면 다음과 같은 순서로 명령이 실행됩니다.

웹서버 컨테이너에 웹서버를 중지하는 명령 전달.
젠킨스 컨테이너에서 빌드된 파일을 웹서버 컨테이너로 전달.
웹서버 컨테이너에 웹서버를 시작하는 명령 전달.
볼륨으로 젠킨스 컨테이너와 호스트의 도커 소켓을 공유하고 있기 때문에 젠킨스 컨테이너에서 호스트의 다른 컨테이너로 명령을 전달할 수 있습니다.

아래는 쉘 파일의 내용입니다.

주의할 점은 첫째 줄과 마지막 줄의 내용을 반드시 입력해야 합니다.

exit 0를 반환하지 않으면 젠킨스에서는 배포 과정이 실패한 것으로 판단합니다.

#!/bin/sh

### Stop web server container.
docker exec tomcat sh -c "service tomcat stop;"

### Copy war file and transfer to web server container
docker cp /var/lib/jenkins/workspace/web_application/target/web_application-1.0.0.war \
tomcat:/usr/share/tomcat/webapps

### Start web server
docker exec tomcat sh -c "service tomcat start"

exit 0

0개의 댓글