개발/Spring
Spring Boot + GitLab CI/CD 배포 방법
hanks
2025. 6. 1. 14:53
GitLab 설치 및 Spring Boot 배포 방법 정리
개발 환경
- 운영체제: Ubuntu 20.04 LTS (Server Edition)
- GitLab 버전: gitlab-ce
- Java: OpenJDK 17 (temurin17)
- 빌드 도구: Gradle (Toolchain 지원)
- Spring Boot: 2.x 이상 (Jar 배포 기반)
- GitLab Runner: Docker 또는 Shell executor 사용
- 배포 방식: Systemd 서비스 및 쉘 스크립트 기반 무중단 배포
- CI/CD: .gitlab-ci.yml 기반 자동화
- 방화벽 관리: ufw
- 포트 확인: lsof, pkill, netstat
- 로그 관리: nohup, logs 디렉토리 내 파일 저장
1. GitLab Community Edition 설치
# 시스템 업데이트
sudo apt update && sudo apt upgrade -y
# 의존성 설치
sudo apt install -y ca-certificates curl openssh-server
# GitLab 설치
sudo apt install -y gitlab-ce
# GitLab 접속 설정 변경
sudo vi /etc/gitlab/gitlab.rb
# => external_url 'http://<IP>:<PORT>'
# 설정 적용
sudo gitlab-ctl reconfigure
# 초기 root 비밀번호 확인
sudo cat /etc/gitlab/initial_root_password
2. GitLab 버전 체크 비활성화
GitLab Admin Area > Settings > Metrics and profiling > Usage statistics > "Enable version check" 비활성화
3. Spring Boot 배포 방식
3-1. GitLab CI 파이프라인 .gitlab-ci.yml 작성
- 프로젝트 루트에 .gitlab-ci.yml 작성
- 필요한 stage, script, artifacts 지정
3-2. 배포 스크립트 (deploy.sh) 작성
- jar 백업 및 교체, 애플리케이션 종료 및 재시작 포함
- 로그 디렉토리, PID 파일 등 설정 포함
예시:
#!/bin/bash
MODULE_NAME="bizcof-mes-app"
APP_DIR="/app/$MODULE_NAME"
JAR_NAME="$MODULE_NAME-0.0.1-SNAPSHOT.jar"
BACKUP_DIR="$APP_DIR/backups"
LOG_DIR="$APP_DIR/logs"
DATE=$(date +"%Y-%m-%d")
BACKUP_PATH="$BACKUP_DIR/$JAR_NAME-$DATE"
PID_FILE="$APP_DIR/$MODULE_NAME.pid"
mkdir -p $BACKUP_DIR $LOG_DIR
if [ -f "$APP_DIR/$JAR_NAME" ]; then
cp "$APP_DIR/$JAR_NAME" "$BACKUP_PATH"
fi
pkill -f "java -jar $APP_DIR/$JAR_NAME"
sleep 5
lsof -Pi :20011 -sTCP:LISTEN -t && pkill -9 -f "java -jar $APP_DIR/$JAR_NAME"
nohup java -Dspring.profiles.active=develop -Dspring.pid.file=$PID_FILE -jar "$APP_DIR/$JAR_NAME" >> "$LOG_DIR/$MODULE_NAME.log" 2>&1 &
echo $! > $PID_FILE
3-3. systemd 서비스 등록
서비스 유닛 파일 예시:
[Unit]
Description=BIZCOF-MES Application
After=network.target
[Service]
Type=forking
WorkingDirectory=/app/servers/bizcof-mes-app/
ExecStart=/app/servers/bizcof-mes-app/deploy.sh daemon
User=gitlab-runner
Group=gitlab-runner
PIDFile=/app/servers/bizcof-mes-app/bizcof-mes-app.pid
Restart=on-failure
TimeoutSec=60
[Install]
WantedBy=multi-user.target
등록:
sudo ln -s /app/servers/bizcof-mes-app/bizcof-mes-app.service /etc/systemd/system/bizcof-mes-app.service
sudo systemctl daemon-reload
4. 이슈 해결
4-1. JAVA_COMPILER toolchain 오류
sudo mkdir -p /opt/temurin17 && cd /opt/temurin17
sudo wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz
sudo tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz
sudo mv jdk-17.0.10+7 jdk-17
4-2. bootJar 에러: settings.gradle 중복
- 하위 모듈에 불필요한 settings.gradle 파일이 존재하면 삭제 필요
5. 점검 항목
- GitLab runner online 상태 확인
- systemd 등록 여부 확인
- 권한 문제 확인 (스크립트, 실행 경로, jar 접근권한 등)
- 로그 확인 및 GPT로 이슈 파악