zioinfo-mail/itsm/cicd/scripts/install/jenkins_install.sh
DESKTOP-TKLFCPR\ython e228faabf5 feat(itsm): G-1~G-12 확장 기능 + 하네스/봇/설치스크립트 구현
G-1: 메신저 Webhook Relay + _send_to_room 실제 httpx 호출 구현
G-2: POST /api/tasks/bulk SR 대량작업 엔드포인트 (최대 100건)
G-3: 라이선스 만료 알림 스케줄러 (매일 09:00 KST)
G-4: 체험판 upgrade_banner 필드 + license.py 배너 로직
G-5: core/auto_rca.py + incidents/problem auto-rca 엔드포인트
G-6: core/deploy_impact.py + vibe impact-analysis 엔드포인트
G-7: core/ticket_classifier.py + SR 생성 시 AI 분류 + ai-suggestion API
G-8: VulnPatchRecord 모델 + vuln_scan 패치추적 4개 엔드포인트
G-9: core/jira_sync.py + gateway Jira/Confluence 연동 엔드포인트
G-10: core/push_notify.py + routers/push.py + PushSubscription 모델
G-11: approvals 다중승인 (위임/서명/기한초과/마감연장)
G-12: alembic.ini + migrations/ + cicd/migrate_to_postgres.sh

하네스: guardia-orchestrator 확장기능 Phase 반영
봇명령어: /sr /status /license /bulk 슬래시 명령어 추가
설치스크립트: setup/ (Ubuntu, CentOS, RHEL, Windows) --test 옵션 포함

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:18:52 +09:00

186 lines
8.9 KiB
Bash

#!/usr/bin/env bash
# =============================================================================
# Jenkins 자동 설치 스크립트
# 대상: RHEL 8/9, Rocky Linux 8/9, Ubuntu 20.04/22.04
# 사용: sudo bash jenkins_install.sh
# =============================================================================
set -euo pipefail
JENKINS_PORT="${JENKINS_PORT:-8080}"
JAVA_VERSION="${JAVA_VERSION:-17}"
LOG_FILE="/var/log/jenkins_install.log"
# ── 색상 출력 ─────────────────────────────────────────────────────────────────
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
log() { echo -e "${GREEN}[$(date '+%H:%M:%S')]${NC} $*" | tee -a "${LOG_FILE}"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*" | tee -a "${LOG_FILE}"; }
die() { echo -e "${RED}[ERROR]${NC} $*" | tee -a "${LOG_FILE}"; exit 1; }
# ── 루트 권한 확인 ───────────────────────────────────────────────────────────
[[ $EUID -ne 0 ]] && die "root 권한으로 실행하세요: sudo bash $0"
# ── OS 감지 ──────────────────────────────────────────────────────────────────
detect_os() {
if [[ -f /etc/os-release ]]; then
source /etc/os-release
OS_ID="${ID}"
OS_VERSION_ID="${VERSION_ID%%.*}"
else
die "OS를 감지할 수 없습니다."
fi
log "OS 감지: ${ID} ${VERSION_ID}"
}
# ── Java 설치 ────────────────────────────────────────────────────────────────
install_java() {
log "Java ${JAVA_VERSION} 설치 중..."
case "${OS_ID}" in
rhel|rocky|centos|almalinux)
dnf install -y "java-${JAVA_VERSION}-openjdk-devel" || \
dnf install -y "java-${JAVA_VERSION}-amazon-corretto-devel" || \
die "Java ${JAVA_VERSION} 설치 실패"
;;
ubuntu|debian)
apt-get update -qq
apt-get install -y "openjdk-${JAVA_VERSION}-jdk" || \
die "Java ${JAVA_VERSION} 설치 실패"
;;
*) die "지원하지 않는 OS: ${OS_ID}" ;;
esac
java -version
log "Java 설치 완료"
}
# ── Jenkins 저장소 등록 ────────────────────────────────────────────────────────
add_jenkins_repo() {
log "Jenkins 저장소 등록 중..."
case "${OS_ID}" in
rhel|rocky|centos|almalinux)
wget -q -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-2023.key
dnf upgrade -y
;;
ubuntu|debian)
apt-get install -y curl gnupg
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | \
tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/" | \
tee /etc/apt/sources.list.d/jenkins.list > /dev/null
apt-get update -qq
;;
esac
log "저장소 등록 완료"
}
# ── Jenkins 설치 ─────────────────────────────────────────────────────────────
install_jenkins() {
log "Jenkins LTS 설치 중..."
case "${OS_ID}" in
rhel|rocky|centos|almalinux)
dnf install -y jenkins
;;
ubuntu|debian)
apt-get install -y jenkins
;;
esac
# 포트 변경 (기본값 8080이 아닌 경우)
if [[ "${JENKINS_PORT}" != "8080" ]]; then
log "Jenkins 포트 변경: 8080 → ${JENKINS_PORT}"
case "${OS_ID}" in
rhel|rocky|centos|almalinux)
sed -i "s/^HTTP_PORT=.*/HTTP_PORT=${JENKINS_PORT}/" \
/etc/sysconfig/jenkins 2>/dev/null || \
echo "HTTP_PORT=${JENKINS_PORT}" >> /etc/sysconfig/jenkins
;;
ubuntu|debian)
sed -i "s/^HTTP_PORT=.*/HTTP_PORT=${JENKINS_PORT}/" \
/etc/default/jenkins 2>/dev/null || \
echo "HTTP_PORT=${JENKINS_PORT}" >> /etc/default/jenkins
;;
esac
fi
systemctl enable jenkins
systemctl start jenkins
log "Jenkins 시작 완료"
}
# ── 방화벽 설정 ────────────────────────────────────────────────────────────────
configure_firewall() {
log "방화벽 포트 ${JENKINS_PORT} 개방..."
if command -v firewall-cmd &>/dev/null && systemctl is-active firewalld &>/dev/null; then
firewall-cmd --permanent --add-port="${JENKINS_PORT}/tcp"
firewall-cmd --reload
log "firewalld: 포트 ${JENKINS_PORT} 개방"
elif command -v ufw &>/dev/null; then
ufw allow "${JENKINS_PORT}/tcp"
log "ufw: 포트 ${JENKINS_PORT} 개방"
else
warn "방화벽 관리 도구를 찾을 수 없습니다. 수동으로 포트를 개방하세요."
fi
}
# ── SELinux 설정 (RHEL 계열) ──────────────────────────────────────────────────
configure_selinux() {
if command -v getenforce &>/dev/null && [[ "$(getenforce)" != "Disabled" ]]; then
log "SELinux 설정 중..."
setsebool -P httpd_can_network_connect 1 2>/dev/null || true
semanage port -a -t http_port_t -p tcp "${JENKINS_PORT}" 2>/dev/null || \
semanage port -m -t http_port_t -p tcp "${JENKINS_PORT}" 2>/dev/null || \
warn "SELinux 포트 설정 실패 — 수동 설정이 필요할 수 있습니다."
log "SELinux 설정 완료"
fi
}
# ── 초기 설정 디렉터리 준비 ────────────────────────────────────────────────────
prepare_directories() {
log "디렉터리 구조 준비..."
mkdir -p /var/lib/jenkins/casc_configs
mkdir -p /backup/jenkins
chown -R jenkins:jenkins /var/lib/jenkins/casc_configs
chown -R jenkins:jenkins /backup/jenkins 2>/dev/null || true
log "디렉터리 준비 완료"
}
# ── 완료 메시지 ───────────────────────────────────────────────────────────────
print_summary() {
local admin_pw
admin_pw=$(cat /var/lib/jenkins/secrets/initialAdminPassword 2>/dev/null || echo "N/A")
local server_ip
server_ip=$(hostname -I | awk '{print $1}')
echo ""
echo -e "${GREEN}╔══════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ Jenkins 설치 완료 ║${NC}"
echo -e "${GREEN}╠══════════════════════════════════════════════════╣${NC}"
echo -e "${GREEN}${NC} URL: http://${server_ip}:${JENKINS_PORT} "
echo -e "${GREEN}${NC} 초기 PW: ${admin_pw} "
echo -e "${GREEN}${NC} "
echo -e "${GREEN}${NC} 다음 단계: "
echo -e "${GREEN}${NC} 1. 브라우저에서 URL 접속 "
echo -e "${GREEN}${NC} 2. 초기 비밀번호 입력 "
echo -e "${GREEN}${NC} 3. 플러그인 설치: sudo bash jenkins_plugins.sh "
echo -e "${GREEN}╚══════════════════════════════════════════════════╝${NC}"
echo ""
log "설치 로그: ${LOG_FILE}"
}
# ── 메인 실행 ────────────────────────────────────────────────────────────────
main() {
log "=== Jenkins 설치 시작 ==="
detect_os
install_java
add_jenkins_repo
install_jenkins
configure_firewall
configure_selinux
prepare_directories
print_summary
log "=== Jenkins 설치 완료 ==="
}
main "$@"