diff --git a/desktop/package.json b/desktop/package.json index 4d61ad5..ba37311 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@goldenchart/desktop", - "version": "0.1.18", + "version": "0.1.22", "private": true, "type": "module", "scripts": { diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index 3314619..ddc071f 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "GoldenChart", - "version": "0.1.18", + "version": "0.1.22", "identifier": "com.goldenchart.desktop", "build": { "beforeDevCommand": "npm run dev", diff --git a/scripts/bump-desktop-version-from-release.sh b/scripts/bump-desktop-version-from-release.sh index 4c0ecd0..8b14ae8 100755 --- a/scripts/bump-desktop-version-from-release.sh +++ b/scripts/bump-desktop-version-from-release.sh @@ -8,7 +8,7 @@ CONF="${WORK_TREE}/desktop/src-tauri/tauri.conf.json" LATEST="${WORK_TREE}/frontend/public/desktop/updates/latest.json" UPDATES_DIR="${WORK_TREE}/frontend/public/desktop/updates" BUILD_INFO="${WORK_TREE}/dist-desktop/build-info.json" -RELEASE_DIR="${WORK_TREE}/data/desktop-releases" +RELEASE_DIR="${GC_DESKTOP_APP_RELEASE_DIR:-$WORK_TREE/data/desktop-releases}" node -e " const fs = require('fs'); diff --git a/scripts/jenkins-desktop-pipeline.sh b/scripts/jenkins-desktop-pipeline.sh index e35c14c..dca630f 100755 --- a/scripts/jenkins-desktop-pipeline.sh +++ b/scripts/jenkins-desktop-pipeline.sh @@ -18,10 +18,16 @@ 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 필수) -if [[ -d "${GIT_DIR:-/Volumes/ADATA/git/goldenChart.git}" ]]; then - git --git-dir="${GIT_DIR:-/Volumes/ADATA/git/goldenChart.git}" \ - --work-tree="$WORK_TREE" checkout -f main 2>/dev/null || true +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 + 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 fi chmod +x "$WORK_TREE/scripts/"*.sh 2>/dev/null || true @@ -50,12 +56,15 @@ export WORK_TREE export BUILD_NUMBER="${BUILD_NUMBER:-}" export DESKTOP_BUMP_ON_CI="${DESKTOP_BUMP_ON_CI:-1}" -# mobile pipeline 과 동일: git checkout 직후 semver bump (0.1.4 고정 tauri.conf 방지) -if [[ -z "${BUMP_VERSION:-}" ]] && [[ -n "${BUILD_NUMBER:-}" ]] && [[ "${DESKTOP_BUMP_ON_CI:-1}" == "1" ]]; then +# 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..." BUMPED="$("$WORK_TREE/scripts/bump-desktop-version-from-release.sh")" export DESKTOP_SKIP_VERSION_BUMP=1 - log "Desktop version → $BUMPED" + 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" fi "$WORK_TREE/scripts/build-desktop.sh" "${BUILD_ARGS[@]}" diff --git a/scripts/reconcile-desktop-latest-json.sh b/scripts/reconcile-desktop-latest-json.sh index 7b401a4..23a04a5 100755 --- a/scripts/reconcile-desktop-latest-json.sh +++ b/scripts/reconcile-desktop-latest-json.sh @@ -5,7 +5,6 @@ set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" export PATH="/opt/homebrew/bin:/usr/local/bin:${PATH:-/usr/bin:/bin}" UPDATES_DIR="${UPDATES_DIR:-${WORK_TREE:-$ROOT}/frontend/public/desktop/updates}" -CONF="$ROOT/desktop/src-tauri/tauri.conf.json" BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}" BASE_URL="${BASE_URL/http:\/\//https:\/\/}" @@ -14,16 +13,47 @@ if [[ ! -d "$UPDATES_DIR" ]]; then exit 0 fi -VERSION="$(node -p "require('$CONF').version" 2>/dev/null || echo '0.1.0')" -BUILD_INFO="$UPDATES_DIR/build-info.json" -if [[ -f "$BUILD_INFO" ]]; then - BI_VER="$(node -e "try{console.log(JSON.parse(require('fs').readFileSync(process.argv[1],'utf8')).version||'')}catch{}" "$BUILD_INFO" 2>/dev/null || true)" - if [[ -n "$BI_VER" ]]; then - VERSION="$BI_VER" - fi -fi -# dmg/exe 설치 파일명 버전은 manifest에 반영하지 않음 (updater tar.gz/exe와 불일치 시 루프 유발) +# tauri.conf(git) 는 구버전일 수 있음 — build-info·latest.json·설치 파일명 우선 +VERSION="$(node -e " +const fs = require('fs'); +const path = require('path'); +const dir = process.argv[1]; +const parse = v => String(v || '0.0.0').trim().replace(/^v/i, '').split('.').map(n => parseInt(n, 10) || 0); +const cmp = (a, b) => { + const pa = parse(a), pb = parse(b); + for (let i = 0; i < 3; i++) { + const d = (pa[i] || 0) - (pb[i] || 0); + if (d) return d; + } + return 0; +}; +const maxVer = (cur, next) => (next && cmp(next, cur) > 0 ? next : cur); +let base = '0.0.0'; +const bi = path.join(dir, 'build-info.json'); +if (fs.existsSync(bi)) { + try { base = maxVer(base, JSON.parse(fs.readFileSync(bi, 'utf8')).version); } catch {} +} +const latest = path.join(dir, 'latest.json'); +if (fs.existsSync(latest)) { + try { base = maxVer(base, JSON.parse(fs.readFileSync(latest, 'utf8')).version); } catch {} +} +if (fs.existsSync(dir)) { + for (const name of fs.readdirSync(dir)) { + const m = name.match(/GoldenChart[_-](\\d+\\.\\d+\\.\\d+)/i); + if (m) base = maxVer(base, m[1]); + } +} +if (base === '0.0.0') { + try { + const conf = JSON.parse(fs.readFileSync(process.argv[2], 'utf8')); + if (conf.version) base = conf.version; + } catch {} +} +console.log(base); +" "$UPDATES_DIR" "$ROOT/desktop/src-tauri/tauri.conf.json")" + NOTES="${DESKTOP_RELEASE_NOTES:-GoldenChart Desktop $VERSION}" +echo "[reconcile-latest] version source → v${VERSION}" set +e node "$ROOT/scripts/generate-desktop-latest-json.mjs" \ @@ -37,7 +67,7 @@ set -e if [[ "$RC" -eq 0 ]]; then echo "[reconcile-latest] updated $UPDATES_DIR/latest.json" elif [[ "$RC" -eq 2 ]]; then - echo "[reconcile-latest] no signed bundles — keeping existing latest.json" + echo "[reconcile-latest] no signed bundles — keeping existing latest.json (v${VERSION})" else exit "$RC" fi diff --git a/scripts/server-install-desktop-jenkins.sh b/scripts/server-install-desktop-jenkins.sh index c414901..02455a4 100755 --- a/scripts/server-install-desktop-jenkins.sh +++ b/scripts/server-install-desktop-jenkins.sh @@ -54,6 +54,7 @@ export PATH="/opt/homebrew/opt/llvm/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/us export WORK_TREE="${WORK_TREE}" export GIT_DIR="${GIT_DIR}" export BUILD_NUMBER="\${BUILD_NUMBER}" +export DESKTOP_AUTO_BUMP=1 export TAURI_SIGNER_KEY="\${TAURI_SIGNER_KEY:-\$HOME/.tauri/goldenchart.key}" export DESKTOP_BUMP_ON_CI=1 export DESKTOP_DEPLOY_WEB=0