Files
momentry_core/docs/BUILD_VERSION_RECORD.md
accusys 383201cacd feat: Initial v0.9 release with API Key authentication
## v0.9.20260325_144654

### Features
- API Key Authentication System
- Job Worker System
- V2 Backup Versioning

### Bug Fixes
- get_processor_results_by_job column mapping

Co-authored-by: OpenCode
2026-03-25 14:53:41 +08:00

15 KiB

Momentry Core 版本紀錄

版本命名規則

Main Version (主版本)

v{major}.{minor}
例: v0.1, v0.2, v1.0

Build Version (建置版本)

v{major}.{minor}.{YYYYMMDD_HHMMSS}
例: v0.1.20260325_143000

版本紀錄存放位置

/Users/accusys/momentry/versions/
├── current/                    # 目前使用版本
│   ├── binary                 # 當前 binary
│   └── version.json           # 版本資訊
│
├── releases/                  # Release 版本存放
│   ├── v0.1/
│   │   ├── v0.1.20260325_143000/
│   │   │   ├── binary
│   │   │   └── version.json
│   │   ├── v0.1.20260324_100000/
│   │   │   └── ...
│   │   └── release.json      # v0.1 版本總覽
│   │
│   └── v0.2/
│       └── ...
│
└── changelog.json             # 全域版本變更記錄

version.json 格式

{
  "version": "v0.1.20260325_143000",
  "main_version": "v0.1",
  "build_timestamp": "2026-03-25T14:30:00+08:00",
  "git_commit": "83ae050",
  "git_branch": "main",
  "git_message": "fix: save probe.json to OUTPUT_DIR instead of current directory",
  "features": [
    "API Key Authentication",
    "Job Worker System"
  ],
  "fixes": [
    "get_processor_results_by_job column mapping"
  ],
  "deployed_at": "2026-03-25T15:00:00+08:00",
  "deployed_by": "opencode",
  "status": "production"
}

release.json 格式 (主版本總覽)

{
  "version": "v0.1",
  "status": "production",
  "created_at": "2026-03-14T10:00:00+08:00",
  "current_build": "v0.1.20260325_143000",
  "builds": [
    {
      "build": "v0.1.20260325_143000",
      "date": "2026-03-25",
      "commits": ["83ae050", "171c36a"],
      "summary": "fix: save probe.json, add v2 backup versioning"
    },
    {
      "build": "v0.1.20260324_100000",
      "date": "2026-03-24",
      "commits": ["89fbfd6", "3edaf01"],
      "summary": "feat: add POST /api/v1/probe endpoint"
    }
  ],
  "changelog": [
    "## v0.1.20260325_143000",
    "- 修復 processor_results 欄位映射錯誤",
    "- 添加 API Key 認證",
    "",
    "## v0.1.20260324_100000",
    "- 新增 Probe API"
  ]
}

changelog.json 格式 (全域變更記錄)

{
  "updated_at": "2026-03-25T14:30:00+08:00",
  "versions": {
    "v0.1": {
      "status": "production",
      "current_build": "v0.1.20260325_143000",
      "build_count": 12
    },
    "v0.0": {
      "status": "deprecated",
      "final_build": "v0.0.20260310_090000"
    }
  },
  "recent_changes": [
    {
      "version": "v0.1.20260325_143000",
      "date": "2026-03-25",
      "changes": [
        {"type": "fix", "description": "get_processor_results_by_job column mapping"},
        {"type": "feat", "description": "API Key Authentication"}
      ]
    }
  ]
}

Release Script

/Users/accusys/momentry/scripts/release.sh

#!/bin/bash
set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="/Users/accusys/momentry_core_0.1"
VERSIONS_DIR="/Users/accusys/momentry/versions"
BACKUP_DIR="/Users/accusys/momentry/backup/bin"
CURRENT_BIN="/Users/accusys/momentry/bin/momentry"

# 顏色輸出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# 解析命令列參數
MAIN_VERSION=""
while [[ $# -gt 0 ]]; do
  case $1 in
    -v|--version)
      MAIN_VERSION="$2"
      shift 2
      ;;
    *)
      log_error "Unknown option: $1"
      exit 1
      ;;
  esac
done

if [ -z "$MAIN_VERSION" ]; then
  log_error "請指定主版本: ./release.sh -v v0.1"
  exit 1
fi

log_info "開始 Release ${MAIN_VERSION}..."

# 1. 取得 Git 資訊
GIT_COMMIT=$(git -C "$PROJECT_DIR" rev-parse --short HEAD)
GIT_BRANCH=$(git -C "$PROJECT_DIR" rev-parse --abbrev-ref HEAD)
GIT_MESSAGE=$(git -C "$PROJECT_DIR" log -1 --pretty=%s)
BUILD_TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BUILD_VERSION="${MAIN_VERSION}.${BUILD_TIMESTAMP}"

log_info "Build Version: ${BUILD_VERSION}"
log_info "Git Commit: ${GIT_COMMIT}"

# 2. 創建版本目錄
BUILD_DIR="${VERSIONS_DIR}/releases/${MAIN_VERSION}/${BUILD_VERSION}"
mkdir -p "$BUILD_DIR"
mkdir -p "${VERSIONS_DIR}/current"
mkdir -p "$BACKUP_DIR"

# 3. 停止 Production Service
log_info "停止 Production Service..."
sudo launchctl unload /Library/LaunchDaemons/com.momentry.api.plist 2>/dev/null || true

# 4. 備份當前 Binary
if [ -f "$CURRENT_BIN" ]; then
  OLD_VERSION=$(cat "${VERSIONS_DIR}/current/version.json" 2>/dev/null | jq -r '.version // "unknown"')
  log_info "備份當前版本: $OLD_VERSION"
  cp "$CURRENT_BIN" "${BACKUP_DIR}/momentry_${OLD_VERSION}_$(date +%Y%m%d_%H%M%S)"
fi

# 5. 編譯 Release 版本
log_info "編譯 Release 版本..."
cd "$PROJECT_DIR"
cargo build --release --bin momentry

# 6. 複製到版本目錄
log_info "複製到版本目錄..."
cp target/release/momentry "${BUILD_DIR}/binary"
cp target/release/momentry "$CURRENT_BIN"

# 7. 生成 version.json
cat > "${BUILD_DIR}/version.json" << EOF
{
  "version": "${BUILD_VERSION}",
  "main_version": "${MAIN_VERSION}",
  "build_timestamp": "$(date -Iseconds)",
  "git_commit": "${GIT_COMMIT}",
  "git_branch": "${GIT_BRANCH}",
  "git_message": "${GIT_MESSAGE}",
  "features": [],
  "fixes": [],
  "deployed_at": null,
  "deployed_by": null,
  "status": "built"
}
EOF

# 8. 更新 current
cp "${BUILD_DIR}/version.json" "${VERSIONS_DIR}/current/version.json"

# 9. 更新 changelog.json
UPDATE_CHANGELOG="
import json
from datetime import datetime

changelog_path = '${VERSIONS_DIR}/changelog.json'
build_info = {
    'version': '${BUILD_VERSION}',
    'date': datetime.now().strftime('%Y-%m-%d'),
    'commit': '${GIT_COMMIT}',
    'message': '${GIT_MESSAGE}'
}

try:
    with open(changelog_path, 'r') as f:
        changelog = json.load(f)
except FileNotFoundError:
    changelog = {'updated_at': '', 'versions': {}, 'recent_changes': []}

changelog['updated_at'] = datetime.now().isoformat()
if '${MAIN_VERSION}' not in changelog['versions']:
    changelog['versions']['${MAIN_VERSION}'] = {'status': 'building', 'build_count': 0}

changelog['versions']['${MAIN_VERSION}']['build_count'] += 1
changelog['versions']['${MAIN_VERSION}']['current_build'] = '${BUILD_VERSION}'
changelog['recent_changes'].insert(0, build_info)

with open(changelog_path, 'w') as f:
    json.dump(changelog, f, indent=2, ensure_ascii=False)
"
python3 -c "$UPDATE_CHANGELOG"

# 10. 啟動 Production Service
log_info "啟動 Production Service..."
sudo launchctl load /Library/LaunchDaemons/com.momentry.api.plist

# 11. 驗證
sleep 3
if curl -s http://localhost:3002/health > /dev/null; then
  log_info "✓ Release 成功!"
  log_info "版本: ${BUILD_VERSION}"
  log_info "目錄: ${BUILD_DIR}"
else
  log_error "✗ Release 失敗!請檢查服務狀態。"
  exit 1
fi

查詢版本指令

查詢目前版本

cat /Users/accusys/momentry/versions/current/version.json

查詢所有 Release

ls -la /Users/accusys/momentry/versions/releases/

查詢版本歷史

cat /Users/accusys/momentry/versions/changelog.json | python3 -m json.tool

查詢特定主版本

ls /Users/accusys/momentry/versions/releases/v0.1/

版本狀態

狀態 說明
building 建置中
built 已建置,未部署
testing 測試中
production 正式環境使用中
deprecated 已棄用
archived 已封存

版本流程圖

develop (git branch)
    │
    ▼
feature/bugfix commit
    │
    ▼
develop ──────────────────┐
    │                    │
    │ (merge to main)   │
    ▼                    │
main (git)               │
    │                    │
    ▼                    │
Build v0.1.20260325_143000
    │                    │
    ├──► testing (3003) │
    │                    │
    │ (approve)          │
    ▼                    ▼
v0.1 ───────────────────┘
    │
    ├──► releases/v0.1/v0.1.20260325_143000/
    │
    ├──► current/ (production)
    │
    ▼
changelog.json (update)

Release Note (版本發布說明)

Release Note 存放位置

/Users/accusys/momentry/versions/releases/{主版本}/{建置版本}/
├── binary
├── version.json
└── RELEASE_NOTE.md    # 發布說明 (Markdown)

Release Note 範本

# Momentry Core v0.1.20260325_143000 Release Note

## 版本資訊
- **Build Version**: v0.1.20260325_143000
- **Main Version**: v0.1
- **Build Date**: 2026-03-25 14:30:00
- **Git Commit**: 83ae050

## 新功能 (Features)

### API Key 認證系統
- 添加 API Key 認證中介層
- 所有 `/api/v1/*` 端點需要 `X-API-Key` header
- 支援 API Key 使用追蹤和審計日誌

### Job Worker 系統
- 新增 Job Worker 二進位檔
- 支援最多 2 個並發處理器
- 新增 `/api/v1/jobs/:uuid` 端點查詢任務詳情

## 錯誤修復 (Bug Fixes)

| Issue | 描述 |
|-------|------|
| #001 | 修復 `get_processor_results_by_job` 欄位映射錯誤 |
| #002 | 修復 API Key 驗證時區處理問題 |

## API 變更 (API Changes)

### 新增端點
| Method | Endpoint | 說明 |
|--------|----------|------|
| GET | `/api/v1/jobs` | 取得所有任務列表 |
| GET | `/api/v1/jobs/:uuid` | 取得特定任務詳情 |

### 認證變更
| 端點 | 舊版 | 新版 |
|------|------|------|
| `/api/v1/*` | 公開 | 需要 API Key |

## 升級指南

### 從舊版升級
1. 備份當前版本
2. 停止服務
3. 替換 binary
4. 重啟服務
5. 更新 API Key 配置

### API Key 配置
```bash
# 請求範例
curl -H "X-API-Key: your_api_key" \
  "http://localhost:3002/api/v1/videos"

已知問題 (Known Issues)

  • 暫無

相關文檔


Release Note 自動生成 Script

/Users/accusys/momentry/scripts/generate_release_note.sh

#!/bin/bash
set -e

BUILD_VERSION=$1
MAIN_VERSION=$2
BUILD_DIR="/Users/accusys/momentry/versions/releases/${MAIN_VERSION}/${BUILD_VERSION}"

# 取得 Git 資訊
GIT_COMMITS=$(git log --oneline -10)
GIT_CHANGES=$(git diff --stat HEAD~5..HEAD)

cat > "${BUILD_DIR}/RELEASE_NOTE.md" << EOF
# Momentry Core ${BUILD_VERSION} Release Note

## 版本資訊
- **Build Version**: ${BUILD_VERSION}
- **Main Version**: ${MAIN_VERSION}
- **Build Date**: $(date '+%Y-%m-%d %H:%M:%S')
- **Git Commit**: $(git rev-parse --short HEAD)

## 變更內容

### Commit 記錄
\`\`\`
${GIT_COMMITS}
\`\`\`

### 變更統計
\`\`\`
${GIT_CHANGES}
\`\`\`

## 新功能

## 錯誤修復

## API 變更

## 升級指南

## 已知問題

EOF

echo "Release Note 生成完成: ${BUILD_DIR}/RELEASE_NOTE.md"

Release Note 查詢

查詢所有 Release Note

find /Users/accusys/momentry/versions/releases -name "RELEASE_NOTE.md"

查看特定版本 Release Note

cat /Users/accusys/momentry/versions/releases/v0.1/v0.1.20260325_143000/RELEASE_NOTE.md

查詢最新版本 Release Note

cat /Users/accusys/momentry/versions/current/RELEASE_NOTE.md

Release Note 範例

完整 Release Note 範例

```markdown

Momentry Core v0.1.20260325_143000 Release Note

版本資訊

項目 內容
Build Version v0.1.20260325_143000
Main Version v0.1
Build Date 2026-03-25 14:30:00
Git Commit 83ae050
Status Production

新功能 (Features)

1. API Key 認證系統

添加完整的 API Key 認證系統,保護所有 API 端點。

功能:

  • SHA256 key hash 驗證
  • 使用統計追蹤
  • 審計日誌記錄
  • 異常檢測

API 使用方式: ```bash curl -H "X-API-Key: your_key" \ "http://localhost:3002/api/v1/videos" ```

2. Job Worker 系統

新增獨立的 Job Worker 處理影片處理任務。

特性:

  • 最多 2 個並發處理器
  • Polling-based 任務獲取
  • 自動進度追蹤

錯誤修復 (Bug Fixes)

Issue 描述 嚴重性
#001 修復 get_processor_results_by_job TIMESTAMP 欄位映射 🔴
#002 修復 3002 port 衝突問題 🟡

API 變更

新增端點

Method Endpoint 說明
GET /api/v1/jobs 取得任務列表
GET /api/v1/jobs/:uuid 取得任務詳情

端點認證狀態

端點 認證需求
/health 不需要
/api/v1/* 需要 X-API-Key

升級指南

前置需求

  • PostgreSQL 資料庫
  • Redis 伺服器
  • MongoDB 快取

升級步驟

  1. 備份當前版本 ```bash cp /Users/accusys/momentry/bin/momentry \ /Users/accusys/momentry/backup/bin/momentry_$(date +%Y%m%d) ```

  2. 停止服務 ```bash sudo launchctl unload /Library/LaunchDaemons/com.momentry.api.plist ```

  3. 替換 Binary ```bash cp v0.1.20260325_143000/binary /Users/accusys/momentry/bin/momentry ```

  4. 重啟服務 ```bash sudo launchctl load /Library/LaunchDaemons/com.momentry.api.plist ```

  5. 驗證 ```bash curl http://localhost:3002/health ```

已知問題 (Known Issues)

  • 暫無

技術細節

認證流程

``` Client Request │ ▼ [X-API-Key Header] ──► Middleware │ │ │ ▼ │ Hash Key (SHA256) │ │ │ ▼ │ DB Lookup │ │ │ ▼ │ Validate Status │ │ ▼ ▼ Handler ◄────────────────────┘ ```

資料庫變更

```sql -- 新增 duration_secs 欄位 ALTER TABLE processor_results ADD COLUMN IF NOT EXISTS duration_secs DOUBLE PRECISION; ```

回滾指南

如需回滾到上一版本: ```bash

1. 停止服務

sudo launchctl unload /Library/LaunchDaemons/com.momentry.api.plist

2. 恢復舊版

cp /Users/accusys/momentry/backup/bin/momentry_v0.1.20260324_100000 \ /Users/accusys/momentry/bin/momentry

3. 重啟服務

sudo launchctl load /Library/LaunchDaemons/com.momentry.api.plist ```

聯繫與支援


Generated: $(date '+%Y-%m-%d %H:%M:%S') ```