diff --git a/package.json b/package.json index f4c3a78..3ee4b95 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,9 @@ "build:desktop:win": "npm run build -w @goldenchart/desktop && npm run tauri:build:win -w @goldenchart/desktop", "install:desktop:deps": "./scripts/install-desktop-build-deps.sh", "setup:desktop:keys": "./scripts/setup-desktop-updater-keys.sh", + "bump:desktop": "./scripts/bump-desktop-version-for-push.sh", + "push:desktop": "./scripts/push-with-desktop-version.sh", + "hooks:desktop": "./scripts/install-desktop-git-hooks.sh", "publish:desktop": "./scripts/publish-desktop-update.sh", "smoke:desktop": "./scripts/smoke-test-desktop.sh", "dev:app": "npm run dev -w @goldenchart/app", diff --git a/scripts/bump-desktop-version-for-push.sh b/scripts/bump-desktop-version-for-push.sh new file mode 100755 index 0000000..50b90b5 --- /dev/null +++ b/scripts/bump-desktop-version-for-push.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# git push 전 desktop semver patch bump → tauri.conf.json + desktop/package.json +# (로컬 dist-desktop/build-info 는 무시 — stale 버전 방지) +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +WORK_TREE="${WORK_TREE:-$ROOT}" +CONF="${WORK_TREE}/desktop/src-tauri/tauri.conf.json" +PKG="${WORK_TREE}/desktop/package.json" +LATEST="${WORK_TREE}/frontend/public/desktop/updates/latest.json" +UPDATES_DIR="${WORK_TREE}/frontend/public/desktop/updates" +RELEASE_DIR="${GC_DESKTOP_APP_RELEASE_DIR:-$WORK_TREE/data/desktop-releases}" + +export DESKTOP_BUMP_IGNORE_BUILD_INFO=1 +export WORK_TREE + +NEW_VER="$("$ROOT/scripts/bump-desktop-version-from-release.sh")" +echo "$NEW_VER" diff --git a/scripts/bump-desktop-version-from-release.sh b/scripts/bump-desktop-version-from-release.sh index 8b14ae8..9b4f1a2 100755 --- a/scripts/bump-desktop-version-from-release.sh +++ b/scripts/bump-desktop-version-from-release.sh @@ -40,7 +40,8 @@ if (fs.existsSync(latestPath)) { if (pub.version) base = maxVer(base, pub.version); } catch { /* ignore */ } } -if (fs.existsSync(buildInfoPath)) { +const ignoreBuildInfo = process.env.DESKTOP_BUMP_IGNORE_BUILD_INFO === '1'; +if (!ignoreBuildInfo && fs.existsSync(buildInfoPath)) { try { const bi = JSON.parse(fs.readFileSync(buildInfoPath, 'utf8')); if (bi.version) base = maxVer(base, bi.version); diff --git a/scripts/hooks/pre-push b/scripts/hooks/pre-push new file mode 100755 index 0000000..324261a --- /dev/null +++ b/scripts/hooks/pre-push @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# Desktop/Frontend 변경 push 시 semver bump 필수 (plain git push 차단) +set -euo pipefail + +ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)" +cd "$ROOT" + +DESKTOP_PATHS='^(desktop/|frontend/|scripts/(build-desktop|jenkins-desktop|publish-desktop|bump-desktop))' + +read_local_version() { + "$ROOT/scripts/read-desktop-version.sh" 2>/dev/null || echo "0.0.0" +} + +read_remote_version() { + local remote_ref="$1" + git show "${remote_ref}:desktop/src-tauri/tauri.conf.json" 2>/dev/null \ + | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{console.log(JSON.parse(d).version||'0.0.0')}catch{console.log('0.0.0')}})" \ + || echo "0.0.0" +} + +version_gt() { + node -e " +const parse = v => String(v||'0').replace(/^v/i,'').split('.').map(n=>parseInt(n,10)||0); +const a=parse(process.argv[1]), b=parse(process.argv[2]); +for(let i=0;i<3;i++){const d=(a[i]||0)-(b[i]||0);if(d){process.exit(d>0?0:1)}} +process.exit(0); +" "$1" "$2" +} + +while read -r _local_ref local_sha _remote_ref remote_sha; do + [[ "$local_sha" == "0000000000000000000000000000000000000000" ]] && continue + + if [[ "$remote_sha" == "0000000000000000000000000000000000000000" ]]; then + range="$local_sha" + else + range="${remote_sha}..${local_sha}" + fi + + if ! git diff --name-only "$range" 2>/dev/null | grep -Eq "$DESKTOP_PATHS"; then + continue + fi + + local_ver="$(read_local_version)" + remote_ver="$(read_remote_version "$remote_sha")" + + if version_gt "$local_ver" "$remote_ver"; then + continue + fi + + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo " Desktop/Frontend 변경 push — semver bump 가 필요합니다." + echo " 로컬 v${local_ver} ≤ 원격 v${remote_ver}" + echo "" + echo " 다음 명령으로 bump + push + Jenkins 빌드:" + echo " ./scripts/push-with-desktop-version.sh" + echo "" + echo " bump 만:" + echo " ./scripts/bump-desktop-version-for-push.sh" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + exit 1 +done + +exit 0 diff --git a/scripts/install-desktop-git-hooks.sh b/scripts/install-desktop-git-hooks.sh new file mode 100755 index 0000000..7c392a7 --- /dev/null +++ b/scripts/install-desktop-git-hooks.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Desktop semver pre-push hook 설치 +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +HOOK_SRC="$ROOT/scripts/hooks/pre-push" +GIT_HOOK="$ROOT/.git/hooks/pre-push" + +if [[ ! -d "$ROOT/.git" ]]; then + echo "ERROR: git repo 가 아닙니다: $ROOT" >&2 + exit 1 +fi + +cp "$HOOK_SRC" "$GIT_HOOK" +chmod +x "$GIT_HOOK" +echo "[install-desktop-git-hooks] pre-push hook 설치됨" +echo " Desktop/Frontend 변경 시 ./scripts/push-with-desktop-version.sh 사용" diff --git a/scripts/jenkins-desktop-pipeline.sh b/scripts/jenkins-desktop-pipeline.sh index dca630f..f8c7eec 100755 --- a/scripts/jenkins-desktop-pipeline.sh +++ b/scripts/jenkins-desktop-pipeline.sh @@ -18,10 +18,7 @@ log "WORK_TREE=$WORK_TREE" cd "$WORK_TREE" -# CI 에서는 BUILD_NUMBER 유무와 관계없이 semver bump (로컬 수동 실행 포함) -export DESKTOP_AUTO_BUMP="${DESKTOP_AUTO_BUMP:-1}" - -# Git 동기화 (checkout 후 tauri.conf 가 git 버전으로 리셋됨 → bump 필수) +# Git 동기화 (checkout → git 에 기록된 semver 그대로 빌드) GIT_DIR="${GIT_DIR:-/Volumes/ADATA/git/goldenChart.git}" if [[ -d "$GIT_DIR" ]]; then if git --git-dir="$GIT_DIR" remote get-url origin >/dev/null 2>&1; then @@ -54,17 +51,21 @@ fi export WORK_TREE export BUILD_NUMBER="${BUILD_NUMBER:-}" -export DESKTOP_BUMP_ON_CI="${DESKTOP_BUMP_ON_CI:-1}" +# git push 시 bump-desktop-version-for-push.sh 로 올린 semver 를 그대로 빌드 +export DESKTOP_BUMP_ON_CI="${DESKTOP_BUMP_ON_CI:-0}" -# mobile pipeline 과 동일: git checkout 직후 semver bump (0.1.18 등 git 구버전 방지) -if [[ -z "${BUMP_VERSION:-}" ]] && [[ "${DESKTOP_BUMP_ON_CI:-1}" == "1" ]]; then - log "CI Desktop version bump..." +GIT_VER="$(node -p "require('$WORK_TREE/desktop/src-tauri/tauri.conf.json').version" 2>/dev/null || echo '?')" +log "Desktop build version (git): v${GIT_VER}" + +if [[ -z "${BUMP_VERSION:-}" ]] && [[ "${DESKTOP_BUMP_ON_CI:-0}" == "1" ]]; then + log "CI Desktop version bump (DESKTOP_BUMP_ON_CI=1)..." BUMPED="$("$WORK_TREE/scripts/bump-desktop-version-from-release.sh")" export DESKTOP_SKIP_VERSION_BUMP=1 log "Desktop version → $BUMPED (tauri.conf + package.json)" else - BUMPED="$(node -p "require('$WORK_TREE/desktop/src-tauri/tauri.conf.json').version" 2>/dev/null || echo '?')" - log "Desktop version bump skipped — using v$BUMPED" + export DESKTOP_SKIP_VERSION_BUMP=1 + BUMPED="$GIT_VER" + log "Desktop version bump skipped — git v${BUMPED}" fi "$WORK_TREE/scripts/build-desktop.sh" "${BUILD_ARGS[@]}" diff --git a/scripts/push-with-desktop-version.sh b/scripts/push-with-desktop-version.sh new file mode 100755 index 0000000..ec21762 --- /dev/null +++ b/scripts/push-with-desktop-version.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# git push + desktop semver 명시 bump (커밋 포함) +# +# Usage: +# ./scripts/push-with-desktop-version.sh [git push 인자...] +# ./scripts/push-with-desktop-version.sh origin main +# +# Env: +# TRIGGER_DESKTOP_BUILD=1 push 후 Jenkins Desktop 빌드 트리거 (기본 1) +# DESKTOP_SKIP_BUMP=1 버전 bump 생략 (이미 올린 경우) +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" + +log() { echo "[push-desktop] $*"; } + +if ! git diff-index --quiet HEAD --; then + log "ERROR: commit 되지 않은 변경이 있습니다." + log " 1) 코드 변경을 git commit" + log " 2) ./scripts/push-with-desktop-version.sh 실행" + exit 1 +fi + +REMOTE="${1:-origin}" +BRANCH="${2:-main}" +if [[ $# -ge 1 ]]; then + PUSH_ARGS=("$@") +else + PUSH_ARGS=(origin main) +fi + +if [[ "${DESKTOP_SKIP_BUMP:-}" != "1" ]]; then + BEFORE="$("$ROOT/scripts/read-desktop-version.sh")" + NEW_VER="$("$ROOT/scripts/bump-desktop-version-for-push.sh")" + log "Desktop version: v${BEFORE} → v${NEW_VER}" + + git add desktop/src-tauri/tauri.conf.json desktop/package.json + + if git diff --cached --quiet -- desktop/src-tauri/tauri.conf.json desktop/package.json; then + log "버전 파일 변경 없음 (v${NEW_VER})" + else + git commit -m "$(cat </dev/null || echo "0.0.0" diff --git a/scripts/server-install-desktop-jenkins.sh b/scripts/server-install-desktop-jenkins.sh index 02455a4..060eab2 100755 --- a/scripts/server-install-desktop-jenkins.sh +++ b/scripts/server-install-desktop-jenkins.sh @@ -55,8 +55,8 @@ export WORK_TREE="${WORK_TREE}" export GIT_DIR="${GIT_DIR}" export BUILD_NUMBER="\${BUILD_NUMBER}" export DESKTOP_AUTO_BUMP=1 +export DESKTOP_BUMP_ON_CI=0 export TAURI_SIGNER_KEY="\${TAURI_SIGNER_KEY:-\$HOME/.tauri/goldenchart.key}" -export DESKTOP_BUMP_ON_CI=1 export DESKTOP_DEPLOY_WEB=0 export DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}" "${WORK_TREE}/scripts/jenkins-desktop-pipeline.sh"