Docker 기반 CI 파이프라인 구축: Jenkins·GitLab·SonarQube·Nexus3 통합 가이드

DevOps 테스트 환경 구성 개요

컨테이너 기술을 활용하면 CI/CD 구성 요소를 신속하게 프로비저닝할 수 있습니다. 본 가이드에서는 Docker 컨테이너를 이용해 주요 DevOps 도구들을 구축하는 방법을 다룹니다. 운영 환경에서는 컨테이너 오케스트레이션(Kubernetes) 또는 바이너리 설치 방식을 권장하며, 데이터베이스는 컨테이너 외부로 분리하는 것이 바람직합니다.

테스트베드 스펙

# uname -a
Linux node100 5.14.0-427.31.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Aug 14 16:15:25 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/system-release
Rocky Linux release 9.4 (Blue Onyx)

# java --version
openjdk 17.0.12 2024-07-16 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.12.0.7-1) (build 17.0.12+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.12.0.7-1) (build 17.0.12+7-LTS, mixed mode, sharing)

# docker version
Client: Docker Engine - Community
 Version:           27.2.1
 API version:       1.47
 Go version:        go1.22.7
 Git commit:        9e34c9b
 Built:             Fri Sep  6 12:09:42 2024
 OS/Arch:           linux/amd64

Server: Docker Engine - Community
 Engine:
  Version:          27.2.1
  API version:      1.47 (minimum version 1.24)
  Go version:       go1.22.7
  Git commit:       8b539b8
  Built:            Fri Sep  6 12:07:57 2024
  OS/Arch:          linux/amd64
  Experimental:     false

Jenkins 자동화 서버 배포

JDK 17 기반 LTS 이미지를 활용하여 Jenkins 마스터 노드를 실행합니다. Docker 소켓 마운트를 통해 Jenkins 컨테이너 내부에서 호스트의 Docker 데몬을 제어할 수 있습니다.

# 이미지 풀링
docker pull docker.m.daocloud.io/jenkins/jenkins:lts-jdk17

# 볼륨 디렉터리 준비
mkdir -p /opt/jenkins-docker
chmod 777 /opt/jenkins-docker

# 컨테이너 실행
docker run -itd --name jenkins \
  -p 8080:8080 -p 50000:50000 \
  --restart always \
  -v /opt/jenkins-docker:/var/jenkins_home \
  -v /etc/localtime:/etc/localtime \
  -v /usr/bin/docker:/usr/bin/docker \
  -v /var/run/docker.sock:/var/run/docker.sock \
  docker.m.daocloud.io/jenkins/jenkins:lts-jdk17

# 초기 비밀번호 확인
docker logs -f jenkins

# 웹 접속: http://localhost:8080

# 컨테이너 상세 정보
docker inspect jenkins

GitLab 저장소 플랫폼 구축

SSH 포트를 2222로 매핑하여 호스트의 기본 SSH 서비스와 충을 방지합니다. 호스트명에는 실제 접속할 IP 주소를 지정합니다.

# 데이터 디렉터리 생성
mkdir -p /data/devops/gitlab/{config,logs,data}
chmod +x -R /data/devops/gitlab/

# GitLab CE 실행
docker run -itd --name gitlab \
  -p 443:443 -p 80:80 -p 2222:22 \
  --restart always \
  --hostname 192.168.16.200 \
  -v /data/devops/gitlab/config:/etc/gitlab \
  -v /data/devops/gitlab/logs:/var/log/gitlab \
  -v /data/devops/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce

# 로그 모니터링
docker logs -f gitlab

# 루트 계정 초기 비밀번호 조회
docker exec -i gitlab cat /etc/gitlab/initial_root_password

# 웹 접속: http://<호스트_IP>:80

# 컨테이너 상세 정보
docker inspect gitlab

SonarQube 정적 분석 도구 설치

코드 품질 분석을 위한 SonarQube 커뮤니티 에디션을 배포합니다. 권한 설정이 적절히 되어 있어야 정상적으로 기동됩니다.

# 디렉터리 구성
mkdir -p /data/devops/sonarqube/{sonarqube_conf,sonarqube_extensions}
mkdir -p /data/devops/sonarqube/{sonarqube_logs,sonarqube_data}
chmod 777 -R /data/devops/sonarqube/

# 컨테이너 기동
docker run -itd --name sonarqube \
  -p 9000:9000 \
  --restart always \
  -v /data/devops/sonarqube/sonarqube_conf:/opt/sonarqube/conf \
  -v /data/devops/sonarqube/sonarqube_extensions:/opt/sonarqube/extensions \
  -v /data/devops/sonarqube/sonarqube_logs:/opt/sonarqube/logs \
  -v /data/devops/sonarqube/sonarqube_data:/opt/sonarqube/data \
  sonarqube:lts-community

# 웹 접속: http://<호스트_IP>:9000
# 기본 계정: admin / admin

# 컨테이너 상세 정보
docker inspect sonarqube

Nexus3 아티팩트 저장소 구축

Maven, npm, Docker 등 다양한 패키지 형식을 호스팅할 수 있는 Nexus Repository Manager를 설치합니다.

# 데이터 볼륨 준비
mkdir -p /data/devops/nexus3/data
chmod 777 -R /data/devops/nexus3/

# Nexus3 실행
docker run -itd --name nexus3 \
  -p 8081:8081 \
  --restart always \
  -v /data/devops/nexus3/data:/nexus-data \
  sonatype/nexus3

# 상태 확인
docker logs -f nexus3

# 관리자 초기 비밀번호 획득
docker exec -i nexus3 cat /nexus-data/admin.password

# 웹 접속: http://<호스트_IP>:8081

# 컨테이너 상세 정보
docker inspect nexus3

빌드 도구체인 설치

Apache Maven 설정

# 압축 해제 및 심볼릭 링크 생성
tar -xzvf apache-maven-3.9.9-bin.tar.gz -C /opt
ln -s /opt/apache-maven-3.9.9 /opt/maven

# 환경변수 등록
cat >> /etc/profile << 'EOF'
export M2_HOME=/opt/maven
export MAVEN_HOME=/opt/maven
export PATH=${M2_HOME}/bin:${PATH}
EOF
source /etc/profile

# 설치 검증
mvn --version
mvn --help

Gradle 빌드 도구 설정

# 배포 및 링크
unzip -d /opt gradle-8.10.1-bin.zip
ln -s /opt/gradle-8.10.1 /opt/gradle

# 환경변수 구성
cat >> /etc/profile << 'EOF'
export GRADLE_HOME=/opt/gradle
export PATH=${PATH}:${GRADLE_HOME}/bin
EOF
source /etc/profile

# 검증
gradle --version
gradle --help

Node.js/npm 생태계 준비

# 바이너리 설치
tar -Jxvf node-v20.17.0-linux-x64.tar.xz -C /opt
ln -s /opt/node-v20.17.0-linux-x64 /opt/node

# 환경변수
echo 'export NODE_HOME=/opt/node' >> /etc/profile
echo 'export PATH=${NODE_HOME}/bin:${PATH}' >> /etc/profile
source /etc/profile

# 버전 확인
node --version
npm --version

# 레지스트리 미러 설정 (필요시 선택적 사용)
npm config set registry https://registry.npmmirror.com/
# npm config set registry http://mirrors.cloud.tencent.com/npm/
# npm config set registry https://mirrors.huaweicloud.com/repository/npm/
npm config get registry

# 프레임워크 글로벌 설치 예시
npm install -g @vue/cli
vue --version
npm install -g @angular/cli
ng version

보충 사항

  • Rocky Linux 환경에서 환경변수는 /etc/profile~/.bash_profile을 통해 관리됩니다.
  • Harbor 이미지 레지스트리 구축은 별도 문서를 참고하세요.

태그: Jenkins GitLab SonarQube Nexus3 docker

6월 19일 23:30에 게시됨