Files
WeKnora/.github/workflows/release-lite.yml
wizardchen a655a25cf8 fix: revert to neo4j v6 and workaround Go 1.24 Windows compiler bug with -p=1
Go 1.24 has an internal compiler race condition on Windows that causes
'package without types' errors during parallel compilation. Setting
GOFLAGS="-p=1" serializes the build and avoids triggering the bug.
2026-04-11 22:08:02 +08:00

442 lines
14 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Release Lite Binaries
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
tag:
description: "Release tag (e.g. v0.2.0)"
required: true
concurrency:
group: release-lite-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: write
env:
GO_VERSION: "1.24"
NODE_VERSION: "22"
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
jobs:
# ── 1. Build frontend once, share as artifact (for Web CLI) ──
build-frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
cache-dependency-path: frontend/package-lock.json
- name: Build frontend
working-directory: frontend
run: |
npm ci
npm run build
- uses: actions/upload-artifact@v4
with:
name: frontend-dist
path: frontend/dist/
retention-days: 1
# ── 2a. Build Web CLI binary per platform (native CGO) ──
build-binary:
needs: build-frontend
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
goos: linux
goarch: amd64
- os: ubuntu-24.04-arm
goos: linux
goarch: arm64
- os: macos-14
goos: darwin
goarch: amd64
- os: macos-14
goos: darwin
goarch: arm64
runs-on: ${{ matrix.os }}
env:
CGO_ENABLED: 1
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
cache: true
- uses: actions/download-artifact@v4
with:
name: frontend-dist
path: web/
- name: Resolve version
id: ver
run: |
if [ -n "${{ inputs.tag }}" ]; then
VERSION="${{ inputs.tag }}"
else
VERSION="${GITHUB_REF#refs/tags/}"
fi
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
echo "Building ${VERSION} for ${{ matrix.goos }}/${{ matrix.goarch }}"
- name: Build
run: |
export EDITION=lite
eval "$(./scripts/get_version.sh env)"
LDFLAGS="-w -s $(./scripts/get_version.sh ldflags)"
export CGO_CFLAGS="-Wno-deprecated-declarations"
if [ "${{ matrix.goos }}" = "darwin" ]; then
export CGO_LDFLAGS="-Wl,-no_warn_duplicate_libraries"
fi
go build -tags "sqlite_fts5" -ldflags="${LDFLAGS}" \
-o WeKnora-lite ./cmd/server
- name: Package tarball
run: |
ARCHIVE="WeKnora-lite_${{ steps.ver.outputs.version }}_${{ matrix.goos }}_${{ matrix.goarch }}"
mkdir -p "${ARCHIVE}/web"
cp WeKnora-lite "${ARCHIVE}/"
cp -r web/* "${ARCHIVE}/web/"
cp .env.lite.example "${ARCHIVE}/"
cp docs/LITE.md "${ARCHIVE}/README.md"
if [ -d config ]; then
cp -r config "${ARCHIVE}/config"
fi
if [ -d migrations/sqlite ]; then
mkdir -p "${ARCHIVE}/migrations/sqlite"
cp -r migrations/sqlite/* "${ARCHIVE}/migrations/sqlite/"
fi
if [ -f deploy/weknora-lite.service ]; then
cp deploy/weknora-lite.service "${ARCHIVE}/"
fi
tar czf "${ARCHIVE}.tar.gz" "${ARCHIVE}"
shasum -a 256 "${ARCHIVE}.tar.gz" > "${ARCHIVE}.tar.gz.sha256"
- uses: actions/upload-artifact@v4
with:
name: release-${{ matrix.goos }}-${{ matrix.goarch }}
path: |
WeKnora-lite_*.tar.gz
WeKnora-lite_*.tar.gz.sha256
retention-days: 3
# ── 2b. Build Desktop APP per platform (Wails) ──
build-desktop-app:
strategy:
fail-fast: false
matrix:
include:
- os: macos-14
platform: darwin/universal
arch_label: macOS_universal
artifact_name: desktop-macos-universal
- os: macos-14
platform: darwin/amd64
arch_label: macOS_amd64
artifact_name: desktop-macos-amd64
- os: macos-14
platform: darwin/arm64
arch_label: macOS_arm64
artifact_name: desktop-macos-arm64
- os: ubuntu-latest
platform: linux/amd64
arch_label: linux_amd64
artifact_name: desktop-linux-amd64
- os: windows-latest
platform: windows/amd64
arch_label: windows_amd64
artifact_name: desktop-windows-amd64
runs-on: ${{ matrix.os }}
env:
CGO_ENABLED: 1
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
cache: true
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
cache-dependency-path: frontend/package-lock.json
- name: Install Wails CLI
run: go install github.com/wailsapp/wails/v2/cmd/wails@latest
- name: Install Linux dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev
- name: Install NSIS (Windows)
if: runner.os == 'Windows'
run: choco install nsis -y
- name: Resolve version
id: ver
shell: bash
run: |
if [ -n "${{ inputs.tag }}" ]; then
VERSION="${{ inputs.tag }}"
else
VERSION="${GITHUB_REF#refs/tags/}"
fi
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
- name: Build desktop app
shell: bash
run: |
export EDITION=lite
eval "$(./scripts/get_version.sh env)"
LDFLAGS="$(./scripts/get_version.sh ldflags) -X 'google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn'"
export CGO_CFLAGS="-Wno-deprecated-declarations"
BUILD_TAGS="sqlite_fts5"
NSIS_FLAG=""
if [ "${{ runner.os }}" = "Linux" ]; then
BUILD_TAGS="sqlite_fts5 webkit2_41"
fi
if [ "${{ runner.os }}" = "macOS" ]; then
export CGO_LDFLAGS="-Wl,-no_warn_duplicate_libraries"
fi
if [ "${{ runner.os }}" = "Windows" ]; then
NSIS_FLAG="-nsis"
export GOFLAGS="-p=1"
fi
cd cmd/desktop
wails build -skipbindings -clean \
-tags "${BUILD_TAGS}" \
-platform "${{ matrix.platform }}" \
${NSIS_FLAG} \
-ldflags="${LDFLAGS}" \
-o "WeKnora Lite"
# ── macOS: bundle .app with resources, then create DMG ──
- name: Package macOS app
if: runner.os == 'macOS'
run: |
APP_BUNDLE="WeKnora Lite.app"
SRC="cmd/desktop/build/bin/${APP_BUNDLE}"
RESOURCES="${SRC}/Contents/Resources"
mkdir -p "${RESOURCES}/config"
mkdir -p "${RESOURCES}/migrations/sqlite"
if [ -f .env.lite.example ]; then
cp .env.lite.example "${RESOURCES}/.env"
fi
if [ -d migrations/sqlite ]; then
cp -r migrations/sqlite/* "${RESOURCES}/migrations/sqlite/"
fi
if [ -d config ]; then
cp -r config/* "${RESOURCES}/config/"
fi
DMG_NAME="WeKnora-Lite-App_${{ steps.ver.outputs.version }}_${{ matrix.arch_label }}"
DMG_SRC="dmg_staging"
mkdir -p "${DMG_SRC}"
cp -R "cmd/desktop/build/bin/${APP_BUNDLE}" "${DMG_SRC}/"
ln -s /Applications "${DMG_SRC}/Applications"
hdiutil create -volname "WeKnora Lite" \
-srcfolder "${DMG_SRC}" \
-ov -format UDZO \
"${DMG_NAME}.dmg"
shasum -a 256 "${DMG_NAME}.dmg" > "${DMG_NAME}.dmg.sha256"
# ── Linux: package tarball ──
- name: Package Linux app
if: runner.os == 'Linux'
run: |
ARCHIVE="WeKnora-Lite-App_${{ steps.ver.outputs.version }}_${{ matrix.arch_label }}"
mkdir -p "${ARCHIVE}"
cp "cmd/desktop/build/bin/WeKnora Lite" "${ARCHIVE}/"
if [ -f .env.lite.example ]; then
cp .env.lite.example "${ARCHIVE}/"
fi
cp docs/LITE.md "${ARCHIVE}/README.md"
if [ -d config ]; then
cp -r config "${ARCHIVE}/config"
fi
if [ -d migrations/sqlite ]; then
mkdir -p "${ARCHIVE}/migrations/sqlite"
cp -r migrations/sqlite/* "${ARCHIVE}/migrations/sqlite/"
fi
tar czf "${ARCHIVE}.tar.gz" "${ARCHIVE}"
shasum -a 256 "${ARCHIVE}.tar.gz" > "${ARCHIVE}.tar.gz.sha256"
# ── Windows: package NSIS installer or plain exe ──
- name: Package Windows app
if: runner.os == 'Windows'
shell: bash
run: |
ARCHIVE="WeKnora-Lite-App_${{ steps.ver.outputs.version }}_${{ matrix.arch_label }}"
# Wails -nsis generates an installer named {app}-amd64-installer.exe
INSTALLER="cmd/desktop/build/bin/WeKnora Lite-amd64-installer.exe"
if [ -f "$INSTALLER" ]; then
cp "$INSTALLER" "${ARCHIVE}_setup.exe"
sha256sum "${ARCHIVE}_setup.exe" > "${ARCHIVE}_setup.exe.sha256"
else
cp "cmd/desktop/build/bin/WeKnora Lite.exe" "${ARCHIVE}.exe"
sha256sum "${ARCHIVE}.exe" > "${ARCHIVE}.exe.sha256"
fi
- uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact_name }}
path: |
WeKnora-Lite-App_*
retention-days: 3
# ── 3. Create GitHub Release ──
release:
needs: [build-binary, build-desktop-app]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
pattern: release-*
merge-multiple: true
- uses: actions/download-artifact@v4
with:
pattern: desktop-*
merge-multiple: true
- name: Resolve version
id: ver
run: |
if [ -n "${{ inputs.tag }}" ]; then
VERSION="${{ inputs.tag }}"
else
VERSION="${GITHUB_REF#refs/tags/}"
fi
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
- name: Generate release notes
id: notes
run: |
cat > notes.md << 'NOTES'
## WeKnora Lite ${{ steps.ver.outputs.version }}
### Web CLI 版(命令行 / 服务器部署)
单二进制部署,零外部依赖(无需 Docker / PostgreSQL / Redis
```bash
# 1. 解压
tar xzf WeKnora-lite_${{ steps.ver.outputs.version }}_<os>_<arch>.tar.gz
cd WeKnora-lite_${{ steps.ver.outputs.version }}_<os>_<arch>
# 2. 配置
cp .env.lite.example .env.lite
# 编辑 .env.lite至少确认 OLLAMA_BASE_URL 正确
# 3. 启动 Ollama如尚未运行
ollama serve &
ollama pull qwen2.5:7b
ollama pull nomic-embed-text
# 4. 运行
set -a && source .env.lite && set +a
./WeKnora-lite
# 访问 http://localhost:8080
```
| 文件 | 平台 |
|------|------|
| `WeKnora-lite_*_linux_amd64.tar.gz` | Linux x86_64 |
| `WeKnora-lite_*_linux_arm64.tar.gz` | Linux ARM64 |
| `WeKnora-lite_*_darwin_amd64.tar.gz` | macOS Intel |
| `WeKnora-lite_*_darwin_arm64.tar.gz` | macOS Apple Silicon |
---
### 桌面 APP 版(开箱即用,无需命令行)
原生桌面应用,内置 Web 服务,双击即可运行。
| 文件 | 平台 |
|------|------|
| `WeKnora-Lite-App_*_macOS_universal.dmg` | macOS (Intel + Apple Silicon) |
| `WeKnora-Lite-App_*_macOS_amd64.dmg` | macOS Intel |
| `WeKnora-Lite-App_*_macOS_arm64.dmg` | macOS Apple Silicon |
| `WeKnora-Lite-App_*_linux_amd64.tar.gz` | Linux x86_64 |
| `WeKnora-Lite-App_*_windows_amd64_setup.exe` | Windows x86_64 (安装包) |
详细文档见 [LITE.md](docs/LITE.md)。
NOTES
- name: Create release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "${{ steps.ver.outputs.version }}" \
--title "WeKnora Lite ${{ steps.ver.outputs.version }}" \
--notes-file notes.md \
WeKnora-lite_*.tar.gz \
WeKnora-lite_*.tar.gz.sha256 \
WeKnora-Lite-App_* || true
# ── 4. Update Homebrew Formula ──
update-homebrew:
needs: release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: main
token: ${{ secrets.GITHUB_TOKEN }}
- name: Resolve version
id: ver
run: |
if [ -n "${{ inputs.tag }}" ]; then
VERSION="${{ inputs.tag }}"
else
VERSION="${GITHUB_REF#refs/tags/}"
fi
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
- name: Wait for release assets to be available
run: sleep 15
- name: Update Formula
run: ./scripts/update-homebrew-formula.sh "${{ steps.ver.outputs.version }}"
- name: Commit and push
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add Formula/weknora-lite.rb
if git diff --cached --quiet; then
echo "No changes to Formula"
else
git commit -m "formula: update weknora-lite to ${{ steps.ver.outputs.version }}"
git push origin main
fi