diff --git a/.github/actions/publish-github-release/action.yml b/.github/actions/publish-github-release/action.yml index 943cc53c2..daa6223cd 100644 --- a/.github/actions/publish-github-release/action.yml +++ b/.github/actions/publish-github-release/action.yml @@ -68,7 +68,7 @@ runs: trap 'rm -f "$NOTES_FILE"' EXIT bash scripts/release/generate-release-notes.sh "$TAG" "$GH_REPO" docs/zh-CN/CHANGELOG.md > "$NOTES_FILE" mapfile -t FILES < <(find "$ASSETS_DIR" -type f \( \ - -name '*.exe' -o -name '*.zip' -o -name '*.dmg' -o -name '*.AppImage' -o -name '*.deb' \ + -name '*.exe' -o -name '*.zip' -o -name '*.dmg' -o -name '*.AppImage' -o -name '*.AppImage.zsync' -o -name '*.deb' \ \) | sort) if [ "${#FILES[@]}" -eq 0 ]; then echo "No release assets found." diff --git a/.github/workflows/release-all.yml b/.github/workflows/release-all.yml index b409ce3e2..e743271a2 100644 --- a/.github/workflows/release-all.yml +++ b/.github/workflows/release-all.yml @@ -209,12 +209,16 @@ jobs: matrix: include: - arch: x86_64 + appimage_arch: amd64 rust_target: x86_64-unknown-linux-gnu runner: ubuntu-22.04 - arch: arm64 + appimage_arch: aarch64 rust_target: aarch64-unknown-linux-gnu runner: ubuntu-22.04-arm runs-on: ${{ matrix.runner }} + env: + LDAI_UPDATE_INFORMATION: gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|CodexManager_*_${{ matrix.appimage_arch }}.AppImage.zsync steps: - name: Checkout @@ -233,7 +237,7 @@ jobs: - name: Install Linux dependencies run: | sudo apt-get update - sudo apt-get install -y --no-install-recommends libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev patchelf libsoup-3.0-dev squashfs-tools zip + sudo apt-get install -y --no-install-recommends libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev patchelf libsoup-3.0-dev squashfs-tools zip zsync - name: Test AppImage icon portability repair run: bash scripts/release/tests/ensure-appimage-diricon.test.sh @@ -254,6 +258,24 @@ jobs: shell: bash run: bash scripts/release/ensure-appimage-diricon.sh "${{ env.CARGO_TARGET_DIR }}/${{ matrix.rust_target }}/release/bundle/appimage/"*.AppImage + # Icon/permission repairs can rewrite the image, invalidating the + # bundler's zsync checksums. Always regenerate from the final bytes. + - name: Generate final AppImage update metadata + shell: bash + env: + APPIMAGE_DIR: ${{ env.CARGO_TARGET_DIR }}/${{ matrix.rust_target }}/release/bundle/appimage + run: | + set -euo pipefail + for image in "$APPIMAGE_DIR/"*.AppImage; do + # A sidecar alone cannot tell update clients where to find releases. + embedded="$("$image" --appimage-updateinformation)" + if [[ "$embedded" != "$LDAI_UPDATE_INFORMATION" ]]; then + echo "Missing or unexpected embedded update information in $image" >&2 + exit 1 + fi + zsyncmake -u "$(basename -- "$image")" -o "$image.zsync" "$image" + done + - name: Stage portable package shell: bash run: bash scripts/release/stage-linux-portable.sh "${{ env.CARGO_TARGET_DIR }}/${{ matrix.rust_target }}/release" "${{ matrix.arch }}" @@ -264,6 +286,7 @@ jobs: name: codexmanager-linux-${{ matrix.arch }} path: | ${{ env.CARGO_TARGET_DIR }}/${{ matrix.rust_target }}/release/bundle/**/*.AppImage + ${{ env.CARGO_TARGET_DIR }}/${{ matrix.rust_target }}/release/bundle/**/*.AppImage.zsync ${{ env.CARGO_TARGET_DIR }}/${{ matrix.rust_target }}/release/bundle/**/*.deb ${{ env.CARGO_TARGET_DIR }}/${{ matrix.rust_target }}/release/portable/*.zip if-no-files-found: error diff --git a/docs/en/release/build-release-and-scripts.md b/docs/en/release/build-release-and-scripts.md index 8fd4e7c4f..178f2c159 100644 --- a/docs/en/release/build-release-and-scripts.md +++ b/docs/en/release/build-release-and-scripts.md @@ -38,6 +38,8 @@ pwsh -NoLogo -NoProfile -File scripts/rebuild.ps1 -Bundle nsis -CleanDist -Porta Linux packaging requires `squashfs-tools`. The release workflow pins Tauri CLI 2.11.4 and checks that each AppImage's root `.DirIcon` resolves entirely inside the bundle, repairing missing, dangling, or build-machine links. Bundle permissions are also normalized so ordinary users can traverse directories, execute launchers, and read resources. Verify the launcher as an unprivileged user; access by the build account or root is insufficient. Repacking after repairs uses runtime-compatible gzip compression and verifies a fresh extraction. Before publishing, also check the artifact's own `--appimage-extract` on its native architecture. Successful `unsquashfs` extraction or files remaining on the build machine do not prove runtime compatibility. Run the regression suite with `bash scripts/release/tests/ensure-appimage-diricon.test.sh`. +Linux releases include architecture-specific update information and matching `.AppImage.zsync` files for Gear Lever/AppImageUpdate, targeting the current repository’s latest stable release. Sidecars are regenerated after icon/permission repairs. Older AppImages without update information need a one-time manual replacement. + The interface language defaults to **Auto-detect**, following the system language in the desktop app or the browser language in Web mode. Chinese, English, Russian, and Korean are supported; other languages fall back to English. Choose Auto-detect or a fixed language in Settings or the header; the choice applies immediately and remains saved. ## GitHub Actions diff --git "a/docs/zh-CN/release/\346\236\204\345\273\272\345\217\221\345\270\203\344\270\216\350\204\232\346\234\254\350\257\264\346\230\216.md" "b/docs/zh-CN/release/\346\236\204\345\273\272\345\217\221\345\270\203\344\270\216\350\204\232\346\234\254\350\257\264\346\230\216.md" index 602ab801d..29aee9a7b 100644 --- "a/docs/zh-CN/release/\346\236\204\345\273\272\345\217\221\345\270\203\344\270\216\350\204\232\346\234\254\350\257\264\346\230\216.md" +++ "b/docs/zh-CN/release/\346\236\204\345\273\272\345\217\221\345\270\203\344\270\216\350\204\232\346\234\254\350\257\264\346\230\216.md" @@ -41,6 +41,8 @@ pwsh -NoLogo -NoProfile -File scripts/rebuild.ps1 -Bundle nsis -CleanDist -Porta Linux 打包需要 `squashfs-tools`。发布流程固定使用 Tauri CLI 2.11.4,并检查每个 AppImage 根目录的 `.DirIcon` 是否能在包内独立解析;缺失、悬空或指向构建机的链接会被修复。包内权限也会统一规范,确保普通用户可遍历目录、执行启动器并读取资源;验证需以普通用户检查启动器,不能只依赖构建账号或 root 的访问结果。修复后重新打包使用运行时兼容的 gzip 压缩,并再次提取到独立目录验证。发布前还需在产物对应的原生架构环境中,通过产物自身的 `--appimage-extract` 验证运行时能成功解包;不能仅以 `unsquashfs` 成功或构建机上文件存在作为兼容性依据。回归测试可运行 `bash scripts/release/tests/ensure-appimage-diricon.test.sh`。 +Linux 发布会嵌入按架构区分的更新地址,并上传配套 `.AppImage.zsync`,供 Gear Lever/AppImageUpdate 检查当前仓库的最新稳定版。侧车文件在图标和权限修复后重新生成。缺少更新信息的旧 AppImage 需要手动替换为新版本一次。 + 界面语言默认选择“自动检测”,桌面端跟随系统语言,Web 端跟随浏览器语言;支持中文、英文、俄文和韩文,其他语言回退英文。可以在设置或顶部栏选择“自动检测”或固定语言,立即生效并持久化保存。 ## GitHub Actions