diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 31d4b6e..c4e4228 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,96 +1,381 @@ -# 可选,将显示在 GitHub 存储库的“操作”选项卡中的工作流名称 -name: Release CI - +name: Release Build + on: - push: - tags: - - "v*" workflow_dispatch: - -# 需要运行的作业组合 + push: + branches: + - main + tags: + - "v*.*.*" +permissions: write-all +env: + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: short +concurrency: + group: "${{ github.workflow }} - ${{ github.head_ref || github.ref }}" + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + jobs: - # 任务:创建 release 版本 - create-release: + check_tag_version: + name: Check Release Tag and package.json Version Consistency runs-on: ubuntu-latest - outputs: - RELEASE_UPLOAD_ID: ${{ steps.create_release.outputs.id }} - steps: - - uses: actions/checkout@v4 - # 查询版本号(tag) - - name: Query version number - id: get_version - shell: bash + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Check tag and package.json version run: | - echo "using version tag ${GITHUB_REF:10}" - echo ::set-output name=version::"${GITHUB_REF:10}" - - # 根据查询到的版本号创建 release - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: '${{ steps.get_version.outputs.VERSION }}' - release_name: 'app ${{ steps.get_version.outputs.VERSION }}' - body: 'See the assets to download this version and install.' - - # 编译 Tauri - build-tauri: - needs: create-release + TAG_REF="${GITHUB_REF##*/}" + echo "Current tag: $TAG_REF" + PKG_VERSION=$(jq -r .version package.json) + echo "package.json version: $PKG_VERSION" + if [[ "$TAG_REF" != "v$PKG_VERSION" ]]; then + echo "Tag ($TAG_REF) does not match package.json version (v$PKG_VERSION)." + exit 1 + fi + echo "Tag and package.json version are consistent." + + release: + name: Release Build + needs: check_tag_version strategy: fail-fast: false matrix: - platform: [macos-latest, ubuntu-latest, windows-latest] - - runs-on: ${{ matrix.platform }} + include: + - os: windows-latest + target: x86_64-pc-windows-msvc + - os: windows-latest + target: aarch64-pc-windows-msvc + - os: macos-latest + target: aarch64-apple-darwin + - os: macos-latest + target: x86_64-apple-darwin + - os: ubuntu-22.04 + target: x86_64-unknown-linux-gnu + + runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - - # 安装 Node.js - - name: Setup node - uses: actions/setup-node@v4 + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Install Rust Stable + uses: dtolnay/rust-toolchain@stable + + - name: Add Rust Target + run: rustup target add ${{ matrix.target }} + + - name: Rust Cache + uses: Swatinem/rust-cache@v2 with: - node-version: "22.x" - - # 安装 Rust - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - # 使用 Rust 缓存,加快安装速度 - - uses: Swatinem/rust-cache@v1 - - - name: install dependencies (ubuntu only) - if: matrix.platform == 'ubuntu-latest' + workspaces: src-tauri + cache-all-crates: true + cache-on-failure: true + + - name: Install dependencies (ubuntu only) + if: matrix.os == 'ubuntu-22.04' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf - - - # 获取 yarn 缓存路径 - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - # 使用 yarn 缓存 - - name: Yarn cache - uses: actions/cache@v2 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + sudo apt-get install -y libxslt1.1 libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf + + - name: Install Node + uses: actions/setup-node@v4 with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - # 安装依赖执行构建,以及推送 github release - - name: Install app dependencies and build it - # 这里的pubhome要修改为你package.json里面配置的编译命令 - run: yarn && yarn pubhome - - uses: tauri-apps/tauri-action@v0 + node-version: "22" + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: false + + - name: Pnpm install and check + run: | + pnpm i + pnpm prepare ${{ matrix.target }} + + - name: Tauri build + uses: tauri-apps/tauri-action@v0 + env: + NODE_OPTIONS: "--max_old_space_size=4096" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + with: + tagName: v__VERSION__ + releaseName: "Clash Verge Rev v__VERSION__" + releaseBody: "More new features are now supported." + tauriScript: pnpm + args: --target ${{ matrix.target }} + + release-for-linux-arm: + name: Release Build for Linux ARM + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-22.04 + target: aarch64-unknown-linux-gnu + arch: arm64 + - os: ubuntu-22.04 + target: armv7-unknown-linux-gnueabihf + arch: armhf + runs-on: ${{ matrix.os }} + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Install Rust Stable + uses: dtolnay/rust-toolchain@stable + + - name: Add Rust Target + run: rustup target add ${{ matrix.target }} + + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + cache-all-crates: true + + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Pnpm install and check + run: | + pnpm i + pnpm prepare ${{ matrix.target }} + + - name: "Setup for linux" + run: |- + sudo ls -lR /etc/apt/ + + cat > /tmp/sources.list << EOF + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy main multiverse universe restricted + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-security main multiverse universe restricted + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-updates main multiverse universe restricted + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-backports main multiverse universe restricted + + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy main multiverse universe restricted + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main multiverse universe restricted + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main multiverse universe restricted + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-backports main multiverse universe restricted + EOF + + sudo mv /etc/apt/sources.list /etc/apt/sources.list.default + sudo mv /tmp/sources.list /etc/apt/sources.list + + sudo dpkg --add-architecture ${{ matrix.arch }} + sudo apt update + + sudo apt install -y \ + libxslt1.1:${{ matrix.arch }} \ + libwebkit2gtk-4.1-dev:${{ matrix.arch }} \ + libayatana-appindicator3-dev:${{ matrix.arch }} \ + libssl-dev:${{ matrix.arch }} \ + patchelf:${{ matrix.arch }} \ + librsvg2-dev:${{ matrix.arch }} + + - name: "Install aarch64 tools" + if: matrix.target == 'aarch64-unknown-linux-gnu' + run: | + sudo apt install -y \ + gcc-aarch64-linux-gnu \ + g++-aarch64-linux-gnu + + - name: "Install armv7 tools" + if: matrix.target == 'armv7-unknown-linux-gnueabihf' + run: | + sudo apt install -y \ + gcc-arm-linux-gnueabihf \ + g++-arm-linux-gnueabihf + + - name: Build for Linux + run: | + export PKG_CONFIG_ALLOW_CROSS=1 + if [ "${{ matrix.target }}" == "aarch64-unknown-linux-gnu" ]; then + export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH + export PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu/ + elif [ "${{ matrix.target }}" == "armv7-unknown-linux-gnueabihf" ]; then + export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig/:$PKG_CONFIG_PATH + export PKG_CONFIG_SYSROOT_DIR=/usr/arm-linux-gnueabihf/ + fi + pnpm build --target ${{ matrix.target }} + env: + NODE_OPTIONS: "--max_old_space_size=4096" + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + + - name: Get Version + run: | + sudo apt-get update + sudo apt-get install jq + echo "VERSION=$(cat package.json | jq '.version' | tr -d '"')" >> $GITHUB_ENV + echo "BUILDTIME=$(TZ=Asia/Shanghai date)" >> $GITHUB_ENV + + - name: Upload Release + uses: softprops/action-gh-release@v2 + with: + tag_name: v${{env.VERSION}} + name: "Clash Verge Rev v${{env.VERSION}}" + body: "More new features are now supported." + token: ${{ secrets.GITHUB_TOKEN }} + files: | + src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb + src-tauri/target/${{ matrix.target }}/release/bundle/rpm/*.rpm + + release-for-fixed-webview2: + name: Release Build for Fixed WebView2 + strategy: + fail-fast: false + matrix: + include: + - os: windows-latest + target: x86_64-pc-windows-msvc + arch: x64 + - os: windows-latest + target: aarch64-pc-windows-msvc + arch: arm64 + runs-on: ${{ matrix.os }} + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Add Rust Target + run: rustup target add ${{ matrix.target }} + + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + cache-all-crates: true + cache-on-failure: true + + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: "22" + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: false + + - name: Pnpm install and check + run: | + pnpm i + pnpm prepare ${{ matrix.target }} + + - name: Download WebView2 Runtime + run: | + invoke-webrequest -uri https://github.com/westinyang/WebView2RuntimeArchive/releases/download/109.0.1518.78/Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab -outfile Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab + Expand .\Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab -F:* ./src-tauri + Remove-Item .\src-tauri\tauri.windows.conf.json + Rename-Item .\src-tauri\webview2.${{ matrix.arch }}.json tauri.windows.conf.json + + - name: Tauri build + id: build + uses: tauri-apps/tauri-action@v0 + env: + NODE_OPTIONS: "--max_old_space_size=4096" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + with: + tauriScript: pnpm + args: --target ${{ matrix.target }} + + - name: Rename + run: | + $files = Get-ChildItem ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*-setup.exe" + foreach ($file in $files) { + $newName = $file.Name -replace "-setup\.exe$", "_fixed_webview2-setup.exe" + Rename-Item $file.FullName $newName + } + + $files = Get-ChildItem ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*.nsis.zip" + foreach ($file in $files) { + $newName = $file.Name -replace "-setup\.nsis\.zip$", "_fixed_webview2-setup.nsis.zip" + Rename-Item $file.FullName $newName + } + + $files = Get-ChildItem ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*-setup.exe.sig" + foreach ($file in $files) { + $newName = $file.Name -replace "-setup\.exe\.sig$", "_fixed_webview2-setup.exe.sig" + Rename-Item $file.FullName $newName + } + + - name: Upload Release + uses: softprops/action-gh-release@v2 + with: + tag_name: v${{steps.build.outputs.appVersion}} + name: "Clash Verge Rev v${{steps.build.outputs.appVersion}}" + body: "More new features are now supported." + token: ${{ secrets.GITHUB_TOKEN }} + files: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*setup* + + - name: Portable Bundle + run: pnpm portable-fixed-webview2 ${{ matrix.target }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + release-update: + name: Release Update + runs-on: ubuntu-latest + needs: [release, release-for-linux-arm] + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Node + uses: actions/setup-node@v4 with: - releaseId: ${{ needs.create-release.outputs.RELEASE_UPLOAD_ID }} \ No newline at end of file + node-version: "22" + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: false + + - name: Pnpm install + run: pnpm i + + - name: Release updater file + run: pnpm updater + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + release-update-for-fixed-webview2: + runs-on: ubuntu-latest + needs: [release-for-fixed-webview2] + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: "22" + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: false + + - name: Pnpm install + run: pnpm i + + - name: Release updater file + run: pnpm updater-fixed-webview2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}