Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions .github/workflows/desktop-windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Desktop Windows

on:
workflow_dispatch:
inputs:
bundle_release_tag:
description: GitHub Release tag from YukeonWayne/pg_pgvector_binary
required: false
default: v18.4-pgvector0.8.3-win32-x64

permissions:
contents: read

jobs:
build-windows:
name: Build Windows desktop installer
runs-on: windows-latest
timeout-minutes: 60

env:
VIFORGE_POSTGRES_PLATFORM_ARCH: win32-x64
VIFORGE_REQUIRE_PGVECTOR: '1'
VIFORGE_POSTGRES_BUNDLE_RELEASE_REPO: YukeonWayne/pg_pgvector_binary
VIFORGE_POSTGRES_BUNDLE_RELEASE_TAG: ${{ inputs.bundle_release_tag || 'v18.4-pgvector0.8.3-win32-x64' }}
VIFORGE_POSTGRES_BUNDLE_ASSET_NAME: postgres-18.4-pgvector-0.8.3-win32-x64.zip

steps:
- name: Checkout source
uses: actions/checkout@v7

- name: Setup pnpm
uses: pnpm/action-setup@v6
with:
version: 11.3.0

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Verify or download PostgreSQL bundle
run: pnpm --filter @viforge/desktop prepare:postgres

- name: Typecheck API
run: pnpm --filter @viforge/api typecheck

- name: Typecheck web
run: pnpm --filter @viforge/web typecheck

- name: Build Windows installer
run: pnpm desktop:dist

- name: Upload Windows artifacts
uses: actions/upload-artifact@v7
with:
name: viforge-windows-desktop
path: |
release/desktop/*.exe
release/desktop/*.blockmap
release/desktop/latest*.yml
if-no-files-found: error
2 changes: 1 addition & 1 deletion apps/desktop/scripts/prepare-icons.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import sharp from 'sharp';
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
const desktopRoot = path.resolve(scriptDir, '..');
const repoRoot = path.resolve(desktopRoot, '..', '..');
const sourceSvg = path.join(repoRoot, 'apps', 'web', 'public', 'viforge-logo.svg');
const sourceSvg = path.join(repoRoot, 'apps', 'web', 'public', 'viforge-logo-full.svg');
const buildRoot = path.join(desktopRoot, 'build');

await mkdir(buildRoot, { recursive: true });
Expand Down
216 changes: 107 additions & 109 deletions docs/current/20-private-binary-bundle-github-actions.md
Original file line number Diff line number Diff line change
@@ -1,184 +1,182 @@
# 私有 GitHub 仓库存放桌面二进制资源的打包方案

如果不想先搭 OSS,可以用一个私有 GitHub 仓库存放 PostgreSQL + pgvector bundle,再让主仓库的 GitHub Actions 在构建时拉取。这个方案适合早期内部发布,配置少,权限清晰。
当前 PostgreSQL + pgvector bundle 存放在独立 GitHub 仓库,再由主仓库的 GitHub Actions 在构建时下载。这个方案适合早期内部发布,配置少,权限清晰。

## 1. 推荐仓库结构
## 1. 当前二进制仓库

新建一个私有仓库,例如
当前使用的 public 仓库

```text
YukeonWayne/viforge-desktop-binaries
YukeonWayne/pg_pgvector_binary
```

目录结构建议
当前 Windows x64 bundle 通过 GitHub Release 发布

```text
postgres/
win32-x64/
bin/
initdb.exe
pg_ctl.exe
postgres.exe
createdb.exe
psql.exe
pg_config.exe
lib/
vector.dll
...
share/
extension/
vector.control
vector--0.8.0.sql
...
linux-x64/
bin/
lib/
share/
darwin-arm64/
bin/
lib/
share/
release tag: v18.4-pgvector0.8.3-win32-x64
asset: postgres-18.4-pgvector-0.8.3-win32-x64.zip
```

把每个平台的 PostgreSQL 根目录完整放进去。pgvector 不需要单独目录,只要已经安装进对应平台的 PostgreSQL bundle 即可。
zip 解压后应能找到 PostgreSQL 根目录,目录里至少包含:

```text
bin/
initdb.exe
pg_ctl.exe
postgres.exe
createdb.exe
psql.exe
pg_config.exe
lib/
vector.dll
...
share/
extension/
vector.control
vector--0.8.0.sql
...
```

pgvector 不需要单独目录,只要已经安装进对应平台的 PostgreSQL bundle 即可。

## 2. 为什么不放主仓库

PostgreSQL bundle 会很大,而且是平台相关二进制。放主仓库会让代码 clone 变慢,也容易把构建产物和源码混在一起。单独私有仓库更适合
PostgreSQL bundle 会很大,而且是平台相关二进制。放主仓库会让代码 clone 变慢,也容易把构建产物和源码混在一起。单独仓库更适合

- 单独控制访问权限。
- 单独更新二进制版本。
- GitHub Actions 构建时按需 checkout
- GitHub Actions 构建时按需下载
- 主仓库保持干净。

## 3. GitHub Actions 权限

如果主仓库和二进制仓库都在同一个 GitHub 账号或组织下,推荐创建一个 Fine-grained Personal Access Token:
当前 `YukeonWayne/pg_pgvector_binary` 是 public 仓库,GitHub Actions 不需要额外 token。

如果后续把二进制仓库改回 private,再创建一个 Fine-grained Personal Access Token:

1. 进入 GitHub `Settings -> Developer settings -> Personal access tokens -> Fine-grained tokens`。
2. 选择只允许访问 `YukeonWayne/viforge-desktop-binaries`。
2. 选择只允许访问 `YukeonWayne/pg_pgvector_binary`。
3. 权限只给 `Contents: Read-only`。
4. 在主仓库 `YukeonWayne/viforge` 的 `Settings -> Secrets and variables -> Actions` 新增 secret:
4. 在当前主仓库 `tech4idea/viforge` 的 `Settings -> Secrets and variables -> Actions` 新增 secret:

```text
DESKTOP_BINARIES_TOKEN=<你的 token>
```

## 4. Actions 拉取二进制资源
private 仓库场景还需要在 workflow 的下载逻辑里把 token 传给 `VIFORGE_POSTGRES_BUNDLE_GITHUB_TOKEN`。public 仓库场景不需要配置这个 secret,也不要把 token 写入仓库。

主仓库 workflow 中增加一个 checkout step,把私有二进制仓库拉到临时目录,再复制对应平台资源:
## 4. 已配置的 Windows Actions

```yaml
- name: Checkout desktop binaries
uses: actions/checkout@v4
with:
repository: YukeonWayne/viforge-desktop-binaries
token: ${{ secrets.DESKTOP_BINARIES_TOKEN }}
path: desktop-binaries

- name: Install PostgreSQL bundle
shell: bash
run: |
PLATFORM_ARCH="${{ matrix.platform_arch }}"
rm -rf "apps/desktop/resources/postgres/${PLATFORM_ARCH}"
mkdir -p apps/desktop/resources/postgres
cp -R "desktop-binaries/postgres/${PLATFORM_ARCH}" "apps/desktop/resources/postgres/${PLATFORM_ARCH}"
主仓库已提供 Windows 桌面打包 workflow:

```text
.github/workflows/desktop-windows.yml
```

然后执行:
workflow 只支持 `workflow_dispatch` 手动打包,不在 `pull_request` 或 `push` 时自动执行。手动触发时可以提供 `bundle_release_tag` 输入,默认下载 `YukeonWayne/pg_pgvector_binary` 的 `v18.4-pgvector0.8.3-win32-x64` release。

```yaml
- name: Verify PostgreSQL bundle
run: pnpm --filter @viforge/desktop prepare:postgres
env:
VIFORGE_POSTGRES_PLATFORM_ARCH: ${{ matrix.platform_arch }}
VIFORGE_REQUIRE_PGVECTOR: '1'

- name: Build desktop installer
run: pnpm desktop:dist
env:
VIFORGE_POSTGRES_PLATFORM_ARCH: ${{ matrix.platform_arch }}
```
核心流程:

1. 在 GitHub Actions 页面手动触发打包。
2. checkout 主仓库代码。
3. 安装 pnpm 11.3.0 和 Node.js 22。
4. 运行 `pnpm install --frozen-lockfile`。
5. 设置 `VIFORGE_POSTGRES_BUNDLE_RELEASE_REPO`、`VIFORGE_POSTGRES_BUNDLE_RELEASE_TAG` 和 `VIFORGE_POSTGRES_BUNDLE_ASSET_NAME`,运行 `prepare:postgres` 自动下载并校验 PostgreSQL + pgvector bundle。
6. 运行 API 和 Web typecheck。
7. 运行 `pnpm desktop:dist` 生成 Windows NSIS 安装包。
8. 上传 `release/desktop/*.exe`、`*.blockmap` 和 `latest*.yml` 为 Actions artifact。

## 5. Windows job 示例
workflow 使用 `actions/checkout@v7`、`actions/setup-node@v6`、`pnpm/action-setup@v6` 和 `actions/upload-artifact@v7`,避免 GitHub Actions 对 Node 20 action runtime 的 deprecation warning。

## 5. Windows job 配置

当前 workflow 内容等价于:

```yaml
name: Desktop Release
name: Desktop Windows

on:
workflow_dispatch:
inputs:
bundle_release_tag:
description: GitHub Release tag from YukeonWayne/pg_pgvector_binary
required: false
default: v18.4-pgvector0.8.3-win32-x64

permissions:
contents: read

jobs:
windows:
build-windows:
name: Build Windows desktop installer
runs-on: windows-latest
strategy:
matrix:
include:
- platform_arch: win32-x64
timeout-minutes: 60

env:
VIFORGE_POSTGRES_PLATFORM_ARCH: win32-x64
VIFORGE_REQUIRE_PGVECTOR: '1'
VIFORGE_POSTGRES_BUNDLE_RELEASE_REPO: YukeonWayne/pg_pgvector_binary
VIFORGE_POSTGRES_BUNDLE_RELEASE_TAG: ${{ inputs.bundle_release_tag || 'v18.4-pgvector0.8.3-win32-x64' }}
VIFORGE_POSTGRES_BUNDLE_ASSET_NAME: postgres-18.4-pgvector-0.8.3-win32-x64.zip

steps:
- uses: actions/checkout@v4
- name: Checkout source
uses: actions/checkout@v7

- uses: pnpm/action-setup@v4
- name: Setup pnpm
uses: pnpm/action-setup@v6
with:
version: 11.3.0

- uses: actions/setup-node@v4
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm

- name: Checkout desktop binaries
uses: actions/checkout@v4
with:
repository: YukeonWayne/viforge-desktop-binaries
token: ${{ secrets.DESKTOP_BINARIES_TOKEN }}
path: desktop-binaries

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Install PostgreSQL bundle
shell: pwsh
run: |
$platform = "${{ matrix.platform_arch }}"
Remove-Item -Recurse -Force "apps/desktop/resources/postgres/$platform" -ErrorAction SilentlyContinue
New-Item -ItemType Directory -Force "apps/desktop/resources/postgres" | Out-Null
Copy-Item -Recurse "desktop-binaries/postgres/$platform" "apps/desktop/resources/postgres/$platform"

- name: Verify PostgreSQL bundle
- name: Verify or download PostgreSQL bundle
run: pnpm --filter @viforge/desktop prepare:postgres
env:
VIFORGE_POSTGRES_PLATFORM_ARCH: ${{ matrix.platform_arch }}
VIFORGE_REQUIRE_PGVECTOR: '1'

- name: Build installer
- name: Typecheck API
run: pnpm --filter @viforge/api typecheck

- name: Typecheck web
run: pnpm --filter @viforge/web typecheck

- name: Build Windows installer
run: pnpm desktop:dist
env:
VIFORGE_POSTGRES_PLATFORM_ARCH: ${{ matrix.platform_arch }}

- uses: actions/upload-artifact@v4
- name: Upload Windows artifacts
uses: actions/upload-artifact@v7
with:
name: viforge-windows
path: release/desktop/*
name: viforge-windows-desktop
path: |
release/desktop/*.exe
release/desktop/*.blockmap
release/desktop/latest*.yml
if-no-files-found: error
```

## 6. 本地使用同一个二进制仓库

本地 Windows 验证时也可以 clone 这个二进制仓库
本地 Windows 验证时也可以让 `prepare:postgres` 从 release 自动下载

```powershell
git clone https://github.com/YukeonWayne/viforge-desktop-binaries.git D:\deps\viforge-desktop-binaries
Remove-Item -Recurse -Force apps\desktop\resources\postgres\win32-x64 -ErrorAction SilentlyContinue
Copy-Item -Recurse D:\deps\viforge-desktop-binaries\postgres\win32-x64 apps\desktop\resources\postgres\win32-x64
$env:VIFORGE_POSTGRES_PLATFORM_ARCH="win32-x64"
$env:VIFORGE_REQUIRE_PGVECTOR="1"
$env:VIFORGE_POSTGRES_BUNDLE_RELEASE_REPO="YukeonWayne/pg_pgvector_binary"
$env:VIFORGE_POSTGRES_BUNDLE_RELEASE_TAG="v18.4-pgvector0.8.3-win32-x64"
$env:VIFORGE_POSTGRES_BUNDLE_ASSET_NAME="postgres-18.4-pgvector-0.8.3-win32-x64.zip"
pnpm --filter @viforge/desktop prepare:postgres
pnpm desktop:pack
```

## 7. 注意事项

- 私有二进制仓库不要放数据库运行数据,只放 PostgreSQL 程序文件和 pgvector 扩展文件。
- 不要把 GitHub token 写进仓库,只放到 GitHub Actions secrets。
- 二进制仓库建议用 release tag 标记版本,例如 `postgres-16.10-pgvector-0.8.0`。
- 主仓库 workflow 后续可以固定 checkout 某个 tag,避免二进制资源变化导致同一份代码构建结果不一致。
- 二进制仓库不要放数据库运行数据,只放 PostgreSQL 程序文件和 pgvector 扩展文件。
- public 仓库不需要 GitHub token;private 仓库才需要 token,并且只能放到 GitHub Actions secrets。
- 二进制仓库建议用 GitHub Release tag 标记版本,例如 `v18.4-pgvector0.8.3-win32-x64`。
- 主仓库 workflow 触发时可以把 `bundle_release_tag` 固定为某个 release tag,避免二进制资源变化导致同一份代码构建结果不一致。