자동빌드 배포 오류 수정

This commit is contained in:
Macbook
2026-06-15 15:44:43 +09:00
parent 6720a5ed46
commit cab5365b19
14 changed files with 499 additions and 23 deletions
@@ -74,6 +74,13 @@ if (releaseDir && fs.existsSync(releaseDir)) {
const m = name.match(/GoldenChart[_-](\\d+\\.\\d+\\.\\d+)/i);
if (m) base = maxVer(base, m[1]);
}
const releaseBuildInfo = path.join(releaseDir, 'build-info.json');
if (fs.existsSync(releaseBuildInfo)) {
try {
const bi = JSON.parse(fs.readFileSync(releaseBuildInfo, 'utf8'));
if (bi.version) base = maxVer(base, bi.version);
} catch { /* ignore */ }
}
}
const parts = parse(base);
+3
View File
@@ -26,6 +26,9 @@ if [[ -d "$GIT_DIR" ]]; then
git --git-dir="$GIT_DIR" --work-tree="$WORK_TREE" checkout -f main 2>/dev/null || true
fi
chmod +x "$WORK_TREE/scripts/"*.sh 2>/dev/null || true
"$WORK_TREE/scripts/prepare-desktop-jenkins-build.sh"
# Jenkins SCM workspace 가 있으면 scripts 를 WORK_TREE 로 동기 (구 스크립트 방지)
if [[ -n "${WORKSPACE:-}" && -d "${WORKSPACE}/scripts" && "${WORKSPACE}" != "$WORK_TREE" ]]; then
log "Sync scripts: ${WORKSPACE}/scripts → ${WORK_TREE}/scripts"
+17 -3
View File
@@ -49,17 +49,31 @@ while read -r OLDREV NEWREV REFNAME; do
WORK_TREE="$WORK_TREE" "$RELOAD" >> "$DEPLOY_LOG" 2>&1 || true
fi
# Desktop(macOS·Windows) Jenkins 빌드 — git push 성공 후 자동 (웹 배포와 독립)
chmod +x "$WORK_TREE/scripts/update-desktop-source-state.sh" 2>/dev/null || true
if [[ -x "$WORK_TREE/scripts/update-desktop-source-state.sh" ]]; then
WORK_TREE="$WORK_TREE" "$WORK_TREE/scripts/update-desktop-source-state.sh" || true
fi
# Desktop(macOS·Windows) Jenkins 빌드 — 데스크톱 영향 변경 시에만 자동 트리거
WORK_TREE="${WORK_TREE:-/Users/aidev/apps/goldenChart}"
TRIGGER="${WORK_TREE}/scripts/trigger-desktop-jenkins-build.sh"
if [ -x "$TRIGGER" ]; then
DESKTOP_BUILD_NEEDED=1
if [[ -x "$WORK_TREE/scripts/desktop-version-scope.sh" ]]; then
# shellcheck disable=SC1091
source "$WORK_TREE/scripts/desktop-version-scope.sh"
if ! desktop_version_diff_affects_app "$OLDREV..$NEWREV"; then
DESKTOP_BUILD_NEEDED=0
echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG Desktop Jenkins 스kip — 데스크톱 영향 없는 변경"
fi
fi
if [ "$DESKTOP_BUILD_NEEDED" = "1" ] && [ -x "$TRIGGER" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG Desktop Jenkins 빌드 트리거"
if "$TRIGGER" >> "$DEPLOY_LOG" 2>&1; then
echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG Desktop 빌드 큐 등록 완료"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG [WARN] Desktop Jenkins 트리거 실패 (웹 배포는 성공)"
fi
else
elif [ "$DESKTOP_BUILD_NEEDED" = "1" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG [WARN] trigger-desktop-jenkins-build.sh 없음: $TRIGGER"
fi
+41
View File
@@ -0,0 +1,41 @@
#!/usr/bin/env bash
# Jenkins Desktop 빌드 시작 전 — git 동기화·deps·source-state (1회 성공률 향상)
set -euo pipefail
WORK_TREE="${WORK_TREE:-/Users/aidev/apps/goldenChart}"
ROOT="$WORK_TREE"
export WORK_TREE
export PATH="/opt/homebrew/opt/llvm/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:${PATH:-/usr/bin:/bin}"
for prefix in "$HOME/homebrew" /opt/homebrew; do
[[ -x "$prefix/bin/brew" ]] && eval "$("$prefix/bin/brew" shellenv)"
done
# shellcheck disable=SC1091
[[ -f "$HOME/.cargo/env" ]] && source "$HOME/.cargo/env"
log() { echo "[prepare-desktop $(date '+%H:%M:%S')] $*"; }
GIT_DIR="${GIT_DIR:-/Volumes/ADATA/git/goldenChart.git}"
if [[ -d "$GIT_DIR" ]]; then
log "git fetch + checkout main"
if git --git-dir="$GIT_DIR" remote get-url origin >/dev/null 2>&1; then
git --git-dir="$GIT_DIR" fetch origin main 2>/dev/null || true
fi
git --git-dir="$GIT_DIR" --work-tree="$WORK_TREE" checkout -f main 2>/dev/null || true
git --git-dir="$GIT_DIR" --work-tree="$WORK_TREE" reset --hard main 2>/dev/null || true
fi
chmod +x "$WORK_TREE/scripts/"*.sh 2>/dev/null || true
"$WORK_TREE/scripts/update-desktop-source-state.sh"
if ! command -v cargo-xwin >/dev/null 2>&1 || ! command -v rustc >/dev/null 2>&1; then
log "desktop build deps 설치"
"$WORK_TREE/scripts/install-desktop-build-deps.sh"
fi
if [[ -f "$WORK_TREE/desktop/updater.pub" ]]; then
"$WORK_TREE/scripts/patch-tauri-updater-pubkey.sh"
fi
log "HEAD $(git -C "$WORK_TREE" rev-parse --short HEAD 2>/dev/null || echo n/a)"
log "prepare OK"
+5
View File
@@ -180,4 +180,9 @@ log "Published v${VERSION}:"
ls -la "$PUBLISH_UPDATES"
log "nginx: /desktop/updates/ → frontend/public/desktop/updates (Docker rebuild 시 반영)"
if [[ -x "$WORK_TREE/scripts/update-desktop-source-state.sh" ]]; then
WORK_TREE="$WORK_TREE" "$WORK_TREE/scripts/update-desktop-source-state.sh" || true
fi
log "Done."
+10
View File
@@ -56,6 +56,16 @@ if curl_get "${JOB_API}/lastBuild/api/json?tree=building" 2>/dev/null | grep -q
exit 0
fi
if curl_get "${JENKINS_URL}/queue/api/json?tree=items[task[name]]" 2>/dev/null | grep -q "\"name\":\"${JENKINS_JOB}\""; then
log "[SKIP] Jenkins 큐에 동일 Job 대기 중"
exit 0
fi
WORK_TREE="${WORK_TREE:-/Users/aidev/apps/goldenChart}"
if [[ -x "$WORK_TREE/scripts/update-desktop-source-state.sh" ]]; then
WORK_TREE="$WORK_TREE" "$WORK_TREE/scripts/update-desktop-source-state.sh" || true
fi
parse_crumb_field() {
python3 -c "import sys,json; print(json.load(sys.stdin).get('crumbRequestField',''))" 2>/dev/null || true
}
+56
View File
@@ -0,0 +1,56 @@
#!/usr/bin/env bash
# main HEAD vs 마지막 성공 PC 빌드(build-info) 비교 → source-state.json (API·UI용)
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
WORK_TREE="${WORK_TREE:-$ROOT}"
RELEASE_DIR="${GC_DESKTOP_APP_RELEASE_DIR:-$WORK_TREE/data/desktop-releases}"
BUILD_INFO="$RELEASE_DIR/build-info.json"
OUT="$RELEASE_DIR/source-state.json"
mkdir -p "$RELEASE_DIR"
HEAD_SHA="$(git -C "$WORK_TREE" rev-parse HEAD 2>/dev/null || echo '')"
HEAD_SHORT="$(git -C "$WORK_TREE" rev-parse --short HEAD 2>/dev/null || echo '')"
LAST_SHA=""
PUBLISHED_VER=""
if [[ -f "$BUILD_INFO" ]]; then
read -r LAST_SHA PUBLISHED_VER < <(node -e "
const fs=require('fs');
try {
const j=JSON.parse(fs.readFileSync(process.argv[1],'utf8'));
console.log((j.gitSha||'')+' '+(j.version||''));
} catch { console.log(' '); }
" "$BUILD_INFO")
fi
PENDING=0
AFFECTS=0
if [[ -n "$HEAD_SHA" && -n "$LAST_SHA" && "$HEAD_SHA" != "$LAST_SHA" ]]; then
PENDING="$(git -C "$WORK_TREE" rev-list --count "${LAST_SHA}..${HEAD_SHA}" 2>/dev/null || echo 0)"
# shellcheck disable=SC1091
source "$ROOT/scripts/desktop-version-scope.sh"
if desktop_version_diff_affects_app "${LAST_SHA}..${HEAD_SHA}"; then
AFFECTS=1
fi
elif [[ -n "$HEAD_SHA" && -z "$LAST_SHA" ]]; then
PENDING=1
AFFECTS=1
fi
node -e "
const fs=require('fs');
const out=process.argv[1];
const data={
headSha: process.argv[2]||'',
headShort: process.argv[3]||'',
lastBuiltSha: process.argv[4]||'',
publishedVersion: process.argv[5]||'',
pendingCommitCount: parseInt(process.argv[6],10)||0,
affectsDesktop: process.argv[7]==='1',
updatedAt: new Date().toISOString(),
};
fs.writeFileSync(out, JSON.stringify(data,null,2)+'\n');
console.log('[source-state]', data.headShort||'?','pending',data.pendingCommitCount,'affects',data.affectsDesktop);
" "$OUT" "$HEAD_SHA" "$HEAD_SHORT" "$LAST_SHA" "$PUBLISHED_VER" "$PENDING" "$AFFECTS"