Selaa lähdekoodia

ci: Windows release 缓存跨 tag 复用 + 锁死 lancedb 默认特征 (#64)

* ci: 让 Windows release 缓存跨 tag 复用,并锁死 lancedb 默认特征

GitHub cache 按 ref 隔离,release workflow 只在 tag 上跑,Windows 每次都是
619 个 crate 冷编译(约 30 分钟)。用稳定 shared-key 在 main 上预热
target/release,失败也写 cache;tag 构建可以从 default branch 还原。

lancedb 0.27.2 的 default features 本就为空,显式 default-features = false
防止以后误开 aws/gcs/remote。DataFusion 是硬依赖,裁不掉。

Co-authored-by: darknessomi <darknessomi@users.noreply.github.com>

* ci: 拆开 Windows release-compile job,避开 matrix if 校验失败

Co-authored-by: darknessomi <darknessomi@users.noreply.github.com>

* ci: debug 检查只留 Ubuntu,Rust 变更才加 Windows

三平台 debug 编译没有测试、前端编三遍、merge 后再编一遍。
PR 默认只跑 Ubuntu;src-tauri 有改动才加 Windows cargo build。
push 到 main 不再跑 debug check,只保留 release 缓存预热。

Co-authored-by: darknessomi <darknessomi@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: darknessomi <darknessomi@users.noreply.github.com>
darknessomi 1 kuukausi sitten
vanhempi
sitoutus
27e26dda49
3 muutettua tiedostoa jossa 154 lisäystä ja 10 poistoa
  1. 3 0
      .github/workflows/build.yml
  2. 147 9
      .github/workflows/ci.yml
  3. 4 1
      src-tauri/Cargo.toml

+ 3 - 0
.github/workflows/build.yml

@@ -75,6 +75,9 @@ jobs:
         uses: Swatinem/rust-cache@v2
         with:
           workspaces: src-tauri
+          shared-key: qmai-release
+          add-job-id-key: false
+          cache-on-failure: true
 
       - name: Install macOS dependencies
         if: runner.os == 'macOS'

+ 147 - 9
.github/workflows/ci.yml

@@ -5,18 +5,114 @@ on:
     branches: [main]
   pull_request:
     branches: [main]
+  workflow_dispatch:
 
 jobs:
+  changes:
+    name: Detect changes
+    if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
+    runs-on: ubuntu-22.04
+    outputs:
+      rust: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.filter.outputs.rust }}
+    steps:
+      - name: Checkout
+        if: github.event_name == 'pull_request'
+        uses: actions/checkout@v5
+
+      - name: Filter paths
+        if: github.event_name == 'pull_request'
+        uses: dorny/paths-filter@v3
+        id: filter
+        with:
+          filters: |
+            rust:
+              - 'src-tauri/**'
+
+  # PR / manual only. Merge to main already passed this on the PR;
+  # do not compile the same debug tree again.
   check:
+    name: Check Ubuntu
+    needs: changes
+    runs-on: ubuntu-22.04
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v5
+
+      - name: Install Rust stable
+        uses: dtolnay/rust-toolchain@stable
+
+      - name: Install dependencies
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y curl libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf protobuf-compiler
+
+      - name: Rust cache
+        uses: Swatinem/rust-cache@v2
+        with:
+          workspaces: src-tauri
+          cache-on-failure: true
+
+      - name: Setup Node.js
+        uses: actions/setup-node@v5
+        with:
+          node-version: 24
+          cache: npm
+
+      - name: Install frontend dependencies
+        run: npm ci
+
+      - name: Check frontend build
+        run: npx vite build
+
+      - name: Check Rust build
+        working-directory: src-tauri
+        run: cargo build
+
+  check-windows:
+    name: Check Windows (Rust)
+    needs: changes
+    if: needs.changes.outputs.rust == 'true'
+    runs-on: windows-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v5
+
+      - name: Install Rust stable
+        uses: dtolnay/rust-toolchain@stable
+
+      - name: Install protoc
+        uses: arduino/setup-protoc@v3
+        with:
+          repo-token: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Rust cache
+        uses: Swatinem/rust-cache@v2
+        with:
+          workspaces: src-tauri
+          cache-on-failure: true
+
+      - name: Check Rust build
+        working-directory: src-tauri
+        run: cargo build
+
+  # Warm target/release on the default branch so tag builds can restore it.
+  # GitHub cache is ref-scoped: tags cannot see other tags, but they can see main.
+  release-compile:
+    name: Release compile ${{ matrix.display }}
+    if: github.event_name != 'pull_request'
+    runs-on: ${{ matrix.platform }}
+    env:
+      CARGO_PROFILE_RELEASE_LTO: "false"
+      CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "16"
+      CARGO_PROFILE_RELEASE_OPT_LEVEL: "1"
     strategy:
       fail-fast: false
       matrix:
         include:
-          - platform: macos-latest
           - platform: ubuntu-22.04
-          - platform: windows-latest
-
-    runs-on: ${{ matrix.platform }}
+            display: Linux x64
+          - platform: macos-latest
+            display: macOS
 
     steps:
       - name: Checkout
@@ -37,8 +133,46 @@ jobs:
           sudo apt-get update
           sudo apt-get install -y curl libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf protobuf-compiler
 
+      - name: Rust cache
+        uses: Swatinem/rust-cache@v2
+        with:
+          workspaces: src-tauri
+          shared-key: qmai-release
+          add-job-id-key: false
+          cache-on-failure: true
+
+      - name: Setup Node.js
+        uses: actions/setup-node@v5
+        with:
+          node-version: 24
+          cache: npm
+
+      - name: Install frontend dependencies
+        run: npm ci
+
+      - name: Build frontend
+        run: npx vite build
+
+      - name: Cargo release build
+        working-directory: src-tauri
+        run: cargo build --release
+
+  release-compile-windows:
+    name: Release compile Windows x64
+    if: github.event_name != 'pull_request'
+    runs-on: windows-latest
+    env:
+      CARGO_PROFILE_RELEASE_LTO: "false"
+      CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "16"
+      CARGO_PROFILE_RELEASE_OPT_LEVEL: "1"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v5
+
+      - name: Install Rust stable
+        uses: dtolnay/rust-toolchain@stable
+
       - name: Install protoc (Windows)
-        if: matrix.platform == 'windows-latest'
         uses: arduino/setup-protoc@v3
         with:
           repo-token: ${{ secrets.GITHUB_TOKEN }}
@@ -47,18 +181,22 @@ jobs:
         uses: Swatinem/rust-cache@v2
         with:
           workspaces: src-tauri
+          shared-key: qmai-release
+          add-job-id-key: false
+          cache-on-failure: true
 
       - name: Setup Node.js
         uses: actions/setup-node@v5
         with:
           node-version: 24
+          cache: npm
 
       - name: Install frontend dependencies
-        run: npm install
+        run: npm ci
 
-      - name: Check frontend build
+      - name: Build frontend
         run: npx vite build
 
-      - name: Check Rust build
+      - name: Cargo release build
         working-directory: src-tauri
-        run: cargo build
+        run: cargo build --release

+ 4 - 1
src-tauri/Cargo.toml

@@ -30,7 +30,10 @@ calamine = "0.34.0"
 docx-rs = "0.4.22"
 cfb = "0.7.3"
 encoding_rs = "0.8.35"
-lancedb = "0.27.2"
+# Local vector store only. lancedb 0.27.2 already has empty default features;
+# keep them off so aws/gcs/azure/remote/openai never sneak in. DataFusion is a
+# hard dependency of this crate and cannot be feature-gated away.
+lancedb = { version = "0.27.2", default-features = false }
 # tokio provided by tauri runtime for async commands
 arrow-array = "57"
 arrow-schema = "57"