name: Release on: push: tags: - 'v*' jobs: release: runs-on: windows-latest permissions: contents: write steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 with: version: 9 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'pnpm' - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Rust cache uses: swatinem/rust-cache@v2 with: workspaces: './src-tauri -> target' - run: pnpm install --frozen-lockfile # 构建 Tauri 应用,tauri-action 自动签名并创建 GitHub Release - name: Build & Release uses: tauri-apps/tauri-action@v0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} with: tagName: ${{ github.ref_name }} releaseName: Dev Manager ${{ github.ref_name }} releaseBody: | ## 更新内容 请查看提交记录了解详情。 releaseDraft: false prerelease: false # 找到生成的安装包和签名文件 - name: Collect artifacts id: artifacts shell: pwsh run: | $tag = "${{ github.ref_name }}" $version = $tag.TrimStart('v') $nsisDir = "src-tauri/target/release/bundle/nsis" # 安装包(用于首次下载) $installer = Get-ChildItem $nsisDir -Filter "*_x64-setup.exe" | Select-Object -First 1 # 更新包(updater 用) $updateZip = Get-ChildItem $nsisDir -Filter "*.nsis.zip" | Select-Object -First 1 $sigFile = Get-ChildItem $nsisDir -Filter "*.nsis.zip.sig" | Select-Object -First 1 echo "INSTALLER=$($installer.FullName)" >> $env:GITHUB_OUTPUT echo "UPDATE_ZIP=$($updateZip.FullName)" >> $env:GITHUB_OUTPUT echo "SIG_FILE=$($sigFile.FullName)" >> $env:GITHUB_OUTPUT echo "VERSION=$version" >> $env:GITHUB_OUTPUT echo "INSTALLER_NAME=$($installer.Name)" >> $env:GITHUB_OUTPUT echo "UPDATE_ZIP_NAME=$($updateZip.Name)" >> $env:GITHUB_OUTPUT # 上传到阿里云 OSS - name: Install ossutil shell: pwsh run: | Invoke-WebRequest -Uri "https://gosspublic.alicdn.com/ossutil/1.7.17/ossutil64.zip" -OutFile ossutil.zip Expand-Archive ossutil.zip -DestinationPath ossutil echo "$PWD/ossutil" >> $env:GITHUB_PATH - name: Upload to OSS shell: pwsh env: OSS_KEY_ID: ${{ secrets.OSS_KEY_ID }} OSS_KEY_SECRET: ${{ secrets.OSS_KEY_SECRET }} OSS_BUCKET: ${{ secrets.OSS_BUCKET }} OSS_ENDPOINT: ${{ secrets.OSS_ENDPOINT }} run: | $tag = "${{ github.ref_name }}" $bucket = "oss://$env:OSS_BUCKET" $endpoint = "https://$env:OSS_ENDPOINT" # 配置 ossutil ossutil64/ossutil64.exe config -e $endpoint -i $env:OSS_KEY_ID -k $env:OSS_KEY_SECRET # 上传安装包和更新包 ossutil64/ossutil64.exe cp "${{ steps.artifacts.outputs.INSTALLER }}" "$bucket/releases/$tag/${{ steps.artifacts.outputs.INSTALLER_NAME }}" -f ossutil64/ossutil64.exe cp "${{ steps.artifacts.outputs.UPDATE_ZIP }}" "$bucket/releases/$tag/${{ steps.artifacts.outputs.UPDATE_ZIP_NAME }}" -f ossutil64/ossutil64.exe cp "${{ steps.artifacts.outputs.SIG_FILE }}" "$bucket/releases/$tag/${{ steps.artifacts.outputs.UPDATE_ZIP_NAME }}.sig" -f # 生成并上传 latest.json(国内客户端更新检测入口) - name: Generate latest.json shell: pwsh env: OSS_KEY_ID: ${{ secrets.OSS_KEY_ID }} OSS_KEY_SECRET: ${{ secrets.OSS_KEY_SECRET }} OSS_BUCKET: ${{ secrets.OSS_BUCKET }} OSS_ENDPOINT: ${{ secrets.OSS_ENDPOINT }} run: | $tag = "${{ github.ref_name }}" $version = "${{ steps.artifacts.outputs.VERSION }}" $date = (Get-Date -Format 'yyyy-MM-ddTHH:mm:ssZ') $baseUrl = "https://$env:OSS_BUCKET.$env:OSS_ENDPOINT/releases/$tag" $zipName = "${{ steps.artifacts.outputs.UPDATE_ZIP_NAME }}" $sig = (Get-Content "${{ steps.artifacts.outputs.SIG_FILE }}" -Raw).Trim() $json = [ordered]@{ version = $version pub_date = $date notes = "版本 $tag 已发布" platforms = [ordered]@{ 'windows-x86_64' = [ordered]@{ signature = $sig url = "$baseUrl/$zipName" } } } | ConvertTo-Json -Depth 5 $json | Out-File -FilePath latest.json -Encoding utf8NoBOM ossutil64/ossutil64.exe cp latest.json "oss://$env:OSS_BUCKET/latest.json" -f