공지사항 메뉴 수정
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
#!/usr/bin/env bash
|
||||
# ==============================================================================
|
||||
# Jenkins Job 설치/갱신 — BizCare-Pipeline (Track B)
|
||||
# 서버에서 실행: bash scripts/install-jenkins-bizcare-job.sh
|
||||
# ==============================================================================
|
||||
set -euo pipefail
|
||||
|
||||
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:${PATH:-/usr/bin:/bin}"
|
||||
|
||||
JENKINS_HOME="${JENKINS_HOME:-/Users/aidev/.jenkins}"
|
||||
JENKINS_URL="${JENKINS_URL:-http://127.0.0.1:8090}"
|
||||
JOB_NEW="BizCare-Pipeline"
|
||||
JOB_OLD="BillCare-Pipeline"
|
||||
BARE_REPO="file:///Volumes/ADATA/git/BizCare.git"
|
||||
DEPLOY_SCRIPT="/Volumes/ADATA/git/deploy-bizcare.sh"
|
||||
|
||||
write_job() {
|
||||
local job="$1" desc="$2"
|
||||
local dir="${JENKINS_HOME}/jobs/${job}"
|
||||
mkdir -p "$dir"
|
||||
cat > "${dir}/config.xml" <<EOF
|
||||
<?xml version='1.1' encoding='UTF-8'?>
|
||||
<project>
|
||||
<description>${desc}</description>
|
||||
<keepDependencies>false</keepDependencies>
|
||||
<properties/>
|
||||
<scm class="hudson.plugins.git.GitSCM" plugin="git@5.0.0">
|
||||
<configVersion>2</configVersion>
|
||||
<userRemoteConfigs>
|
||||
<hudson.plugins.git.UserRemoteConfig>
|
||||
<url>${BARE_REPO}</url>
|
||||
</hudson.plugins.git.UserRemoteConfig>
|
||||
</userRemoteConfigs>
|
||||
<branches>
|
||||
<hudson.plugins.git.BranchSpec>
|
||||
<name>*/main</name>
|
||||
</hudson.plugins.git.BranchSpec>
|
||||
</branches>
|
||||
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
|
||||
<submoduleCfg class="empty-list"/>
|
||||
<extensions/>
|
||||
</scm>
|
||||
<canRoam>true</canRoam>
|
||||
<disabled>false</disabled>
|
||||
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
|
||||
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
|
||||
<triggers/>
|
||||
<concurrentBuild>false</concurrentBuild>
|
||||
<builders>
|
||||
<hudson.tasks.Shell>
|
||||
<command>#!/bin/bash
|
||||
set -euo pipefail
|
||||
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:\$PATH"
|
||||
export GIT_DIR="/Volumes/ADATA/git/BizCare.git"
|
||||
export WORK_TREE="/Users/aidev/apps/BizCare"
|
||||
echo "=== BizCare Jenkins Build #\${BUILD_NUMBER} ==="
|
||||
echo "시각: \$(date)"
|
||||
echo "GIT_DIR=\$GIT_DIR"
|
||||
echo "WORK_TREE=\$WORK_TREE"
|
||||
SERVICE_NAME="\${SERVICE_NAME:-all}" ${DEPLOY_SCRIPT}
|
||||
</command>
|
||||
</hudson.tasks.Shell>
|
||||
</builders>
|
||||
<publishers/>
|
||||
<buildWrappers/>
|
||||
</project>
|
||||
EOF
|
||||
echo "[OK] wrote ${dir}/config.xml"
|
||||
}
|
||||
|
||||
echo "======================================================"
|
||||
echo " Jenkins BizCare job 설치 $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
echo "======================================================"
|
||||
|
||||
[ -d "$JENKINS_HOME" ] || { echo "ERROR: JENKINS_HOME 없음: $JENKINS_HOME"; exit 1; }
|
||||
[ -x "$DEPLOY_SCRIPT" ] || { echo "ERROR: deploy 스크립트 없음: $DEPLOY_SCRIPT"; exit 1; }
|
||||
[ -d /Volumes/ADATA/git/BizCare.git ] || { echo "ERROR: BizCare.git 없음"; exit 1; }
|
||||
|
||||
write_job "$JOB_NEW" "BizCare — Track B (deploy-bizcare.sh, file:// BizCare.git)"
|
||||
write_job "$JOB_OLD" "BillCare → BizCare 위임 — Track B (deploy-bizcare.sh, file:// BizCare.git)"
|
||||
|
||||
# Jenkins에 설정 리로드
|
||||
if curl -sf -o /dev/null "${JENKINS_URL}/login" 2>/dev/null; then
|
||||
echo "[INFO] Jenkins reloadConfiguration 시도: $JENKINS_URL"
|
||||
# crumb (보안 켜져 있으면)
|
||||
CRUMB_JSON="$(curl -sf "${JENKINS_URL}/crumbIssuer/api/json" 2>/dev/null || true)"
|
||||
HDR=()
|
||||
if [ -n "$CRUMB_JSON" ]; then
|
||||
FIELD="$(printf '%s' "$CRUMB_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin).get('crumbRequestField',''))" 2>/dev/null || true)"
|
||||
VAL="$(printf '%s' "$CRUMB_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin).get('crumb',''))" 2>/dev/null || true)"
|
||||
if [ -n "$FIELD" ] && [ -n "$VAL" ]; then
|
||||
HDR=(-H "${FIELD}:${VAL}")
|
||||
fi
|
||||
fi
|
||||
if curl -sf "${HDR[@]}" -X POST "${JENKINS_URL}/reload" >/dev/null 2>&1 \
|
||||
|| curl -sf "${HDR[@]}" -X POST "${JENKINS_URL}/reloadConfiguration" >/dev/null 2>&1; then
|
||||
echo "[OK] Jenkins reload 요청 성공"
|
||||
else
|
||||
echo "[WARN] HTTP reload 실패 — Jenkins 재시작 또는 UI에서 'Reload Configuration from Disk' 실행"
|
||||
echo " 또는: launchctl kickstart -k gui/\$(id -u)/homebrew.mxcl.jenkins-lts"
|
||||
fi
|
||||
else
|
||||
echo "[WARN] Jenkins 미기동 ($JENKINS_URL) — job 파일은 기록됨. Jenkins 기동 후 자동 로드됨"
|
||||
fi
|
||||
|
||||
echo "======================================================"
|
||||
echo " Job: $JOB_NEW (정본)"
|
||||
echo " Job: $JOB_OLD (구 이름 호환 → 동일 BizCare 배포)"
|
||||
echo " SCM: $BARE_REPO"
|
||||
echo " Deploy: $DEPLOY_SCRIPT"
|
||||
echo "======================================================"
|
||||
@@ -0,0 +1,160 @@
|
||||
#!/usr/bin/env bash
|
||||
# ==============================================================================
|
||||
# 서버 일회성: BillCare → BizCare git/배포 경로 전환
|
||||
# 실행 위치: stock 서버 (aidev)
|
||||
# ==============================================================================
|
||||
set -euo pipefail
|
||||
|
||||
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:${PATH:-/usr/bin:/bin}"
|
||||
|
||||
OLD_BARE="/Volumes/ADATA/git/BillCare.git"
|
||||
NEW_BARE="/Volumes/ADATA/git/BizCare.git"
|
||||
OLD_WT="/Users/aidev/apps/BillCare"
|
||||
NEW_WT="/Users/aidev/apps/BizCare"
|
||||
DEPLOY_SRC_CANDIDATES=(
|
||||
"${NEW_WT}/scripts/deploy.sh"
|
||||
"${OLD_WT}/scripts/deploy.sh"
|
||||
)
|
||||
HOOK_SRC_CANDIDATES=(
|
||||
"${NEW_WT}/scripts/post-receive"
|
||||
"${OLD_WT}/scripts/post-receive"
|
||||
)
|
||||
DEPLOY_DST="/Volumes/ADATA/git/deploy-bizcare.sh"
|
||||
HOOK_DST="${NEW_BARE}/hooks/post-receive"
|
||||
OLD_HOOK="${OLD_BARE}/hooks/post-receive"
|
||||
LOG="/Volumes/ADATA/logs/deploy/bizcare-migrate.log"
|
||||
|
||||
mkdir -p "$(dirname "$LOG")" "$NEW_WT"
|
||||
exec > >(tee -a "$LOG") 2>&1
|
||||
|
||||
echo "======================================================"
|
||||
echo " BillCare → BizCare 마이그레이션 $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
echo "======================================================"
|
||||
|
||||
[ -d "$OLD_BARE" ] || { echo "ERROR: $OLD_BARE 없음"; exit 1; }
|
||||
|
||||
# 1) BizCare.git bare 생성 (없으면 BillCare 미러)
|
||||
if [ ! -d "$NEW_BARE" ]; then
|
||||
echo "[1] BizCare.git 미러 생성"
|
||||
git clone --mirror "$OLD_BARE" "$NEW_BARE"
|
||||
else
|
||||
echo "[1] BizCare.git 존재 — BillCare 내용 fetch"
|
||||
git --git-dir="$NEW_BARE" fetch --all --prune || true
|
||||
# BillCare 최신 main 반영
|
||||
git --git-dir="$NEW_BARE" fetch "$OLD_BARE" '+refs/heads/*:refs/heads/*' || true
|
||||
fi
|
||||
|
||||
# 2) work-tree 동기화
|
||||
echo "[2] work-tree 체크아웃 → $NEW_WT"
|
||||
git --git-dir="$NEW_BARE" --work-tree="$NEW_WT" checkout -f main
|
||||
|
||||
# 3) deploy-bizcare.sh 설치
|
||||
DEPLOY_SRC=""
|
||||
for c in "${DEPLOY_SRC_CANDIDATES[@]}"; do
|
||||
if [ -f "$c" ]; then DEPLOY_SRC="$c"; break; fi
|
||||
done
|
||||
[ -n "$DEPLOY_SRC" ] || { echo "ERROR: deploy.sh 소스 없음"; exit 1; }
|
||||
cp "$DEPLOY_SRC" "$DEPLOY_DST"
|
||||
chmod +x "$DEPLOY_DST"
|
||||
# BillCare 이름 스크립트도 동일 내용으로 맞춤 (구 훅 호환)
|
||||
cp "$DEPLOY_DST" /Volumes/ADATA/git/deploy-billcare.sh
|
||||
chmod +x /Volumes/ADATA/git/deploy-billcare.sh
|
||||
echo "[3] deploy-bizcare.sh 설치: $DEPLOY_DST"
|
||||
|
||||
# 4) BizCare post-receive 설치
|
||||
HOOK_SRC=""
|
||||
for c in "${HOOK_SRC_CANDIDATES[@]}"; do
|
||||
if [ -f "$c" ]; then HOOK_SRC="$c"; break; fi
|
||||
done
|
||||
[ -n "$HOOK_SRC" ] || { echo "ERROR: post-receive 소스 없음"; exit 1; }
|
||||
mkdir -p "$(dirname "$HOOK_DST")"
|
||||
cp "$HOOK_SRC" "$HOOK_DST"
|
||||
chmod +x "$HOOK_DST"
|
||||
echo "[4] BizCare post-receive 설치"
|
||||
|
||||
# 5) BillCare.git 훅 → BizCare work-tree/배포로 리다이렉트 (구 remote 호환)
|
||||
cat > "$OLD_HOOK" <<'EOF'
|
||||
#!/usr/bin/env bash
|
||||
# BillCare.git 수신 → BizCare work-tree / deploy-bizcare.sh 로 위임
|
||||
set -euo pipefail
|
||||
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:${PATH:-/usr/bin:/bin}"
|
||||
|
||||
# 수신은 BillCare.git 이지만 배포 정본은 BizCare
|
||||
export GIT_DIR="/Volumes/ADATA/git/BillCare.git"
|
||||
export WORK_TREE="/Users/aidev/apps/BizCare"
|
||||
DEPLOY_SCRIPT="/Volumes/ADATA/git/deploy-bizcare.sh"
|
||||
DEPLOY_LOG="/Volumes/ADATA/logs/deploy/bizcare-deploy.log"
|
||||
HOOK_TAG="[billcare→bizcare-post-receive]"
|
||||
|
||||
mkdir -p "$(dirname "$DEPLOY_LOG")" "$WORK_TREE"
|
||||
|
||||
echo ""
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG BillCare.git 수신 → BizCare 배포로 위임"
|
||||
|
||||
while read -r OLDREV NEWREV REFNAME; do
|
||||
BRANCH_NAME="${REFNAME#refs/heads/}"
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG 브랜치: $BRANCH_NAME"
|
||||
|
||||
# BizCare.git 에도 동일 커밋 반영 (정본 bare 동기화)
|
||||
if [ -d /Volumes/ADATA/git/BizCare.git ]; then
|
||||
git --git-dir=/Volumes/ADATA/git/BizCare.git fetch "$GIT_DIR" "+${REFNAME}:${REFNAME}" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ "$BRANCH_NAME" = "main" ]; then
|
||||
export SERVICE_NAME="${SERVICE_NAME:-all}"
|
||||
# deploy 스크립트가 BizCare.git 을 기본으로 쓰므로 정본으로 전환
|
||||
export GIT_DIR="/Volumes/ADATA/git/BizCare.git"
|
||||
if [ ! -x "$DEPLOY_SCRIPT" ]; then
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG [ERROR] $DEPLOY_SCRIPT 없음"
|
||||
exit 1
|
||||
fi
|
||||
"$DEPLOY_SCRIPT" 2>&1 | tee -a "$DEPLOY_LOG"
|
||||
EXIT_CODE=${PIPESTATUS[0]}
|
||||
[ "$EXIT_CODE" -eq 0 ] || exit "$EXIT_CODE"
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG 배포 완료 → https://bizcare.exdev.co.kr"
|
||||
fi
|
||||
done
|
||||
EOF
|
||||
chmod +x "$OLD_HOOK"
|
||||
echo "[5] BillCare.git 훅을 BizCare 배포 위임으로 교체"
|
||||
|
||||
# 6) 구 billcare 컨테이너 정리 (포트 83/18082/3308 확보)
|
||||
echo "[6] 구 billcare 컨테이너 중지 + DB 볼륨 보존"
|
||||
if [ -f "$OLD_WT/docker-compose.yml" ]; then
|
||||
(cd "$OLD_WT" && docker compose down --remove-orphans) || true
|
||||
fi
|
||||
docker rm -f billcare-frontend billcare-backend billcare-mysql 2>/dev/null || true
|
||||
docker rm -f bizcare-frontend bizcare-backend bizcare-mysql 2>/dev/null || true
|
||||
|
||||
# 라이브 데이터가 billcare_billcare_mysql 에 있으면 bizcare 프로젝트 볼륨으로 복사
|
||||
LIVE_DB="billcare_billcare_mysql"
|
||||
LIVE_UP="billcare_billcare_uploads"
|
||||
NEW_DB="bizcare_bizcare_mysql"
|
||||
NEW_UP="bizcare_bizcare_uploads"
|
||||
if docker volume inspect "$LIVE_DB" >/dev/null 2>&1; then
|
||||
echo "[6b] MySQL 볼륨 복사: $LIVE_DB → $NEW_DB"
|
||||
docker volume create "$NEW_DB" >/dev/null
|
||||
docker run --rm -v "$LIVE_DB":/from:ro -v "$NEW_DB":/to alpine:3.20 \
|
||||
sh -c 'if [ ! -f /to/ibdata1 ]; then cp -a /from/. /to/; echo copied-db; else echo target-db-exists-skip; fi'
|
||||
fi
|
||||
if docker volume inspect "$LIVE_UP" >/dev/null 2>&1; then
|
||||
echo "[6c] uploads 볼륨 복사: $LIVE_UP → $NEW_UP"
|
||||
docker volume create "$NEW_UP" >/dev/null
|
||||
docker run --rm -v "$LIVE_UP":/from:ro -v "$NEW_UP":/to alpine:3.20 \
|
||||
sh -c 'mkdir -p /to; cp -a /from/. /to/; echo copied-uploads'
|
||||
fi
|
||||
|
||||
# 7) BizCare 배포 실행
|
||||
echo "[7] BizCare 배포 실행"
|
||||
export GIT_DIR="$NEW_BARE"
|
||||
export WORK_TREE="$NEW_WT"
|
||||
export SERVICE_NAME=all
|
||||
"$DEPLOY_DST"
|
||||
|
||||
echo "======================================================"
|
||||
echo " 마이그레이션 완료"
|
||||
echo " bare : $NEW_BARE"
|
||||
echo " wt : $NEW_WT"
|
||||
echo " URL : https://bizcare.exdev.co.kr"
|
||||
echo " 로컬: git remote set-url origin ssh://aidev@stock.exdev.co.kr/Volumes/ADATA/git/BizCare.git"
|
||||
echo "======================================================"
|
||||
Reference in New Issue
Block a user