From 9d9d078346c660f0da60519a82d720bd64eb495e Mon Sep 17 00:00:00 2001 From: Tunglies Date: Mon, 2 Jun 2025 18:51:58 +0800 Subject: [PATCH] feat: enhance workflow configurations for alpha and autobuild processes --- .github/workflows/alpha.yml | 282 ++++++++++++++++---------------- .github/workflows/autobuild.yml | 23 +-- package.json | 2 +- 3 files changed, 152 insertions(+), 155 deletions(-) diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index 386cceae..086b1859 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -2,122 +2,132 @@ name: Alpha Build on: workflow_dispatch: - # schedule: - # UTC+8 0,6,12,18 - # - cron: "0 16,22,4,10 * * *" + push: + tags: + - "v*.*.*-alpha*" permissions: write-all env: + TAG_NAME: alpha + TAG_CHANNEL: Alpha CARGO_INCREMENTAL: 0 RUST_BACKTRACE: short concurrency: - # only allow per workflow per commit (and not pr) to run at a time group: "${{ github.workflow }} - ${{ github.head_ref || github.ref }}" - cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} jobs: - check_commit: - runs-on: ubuntu-latest - outputs: - should_run: ${{ steps.check.outputs.should_run }} - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - - name: Check if version changed or src changed - id: check - run: | - # For manual workflow_dispatch, always run - if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then - echo "should_run=true" >> $GITHUB_OUTPUT - exit 0 - fi - - # Store current version from package.json - CURRENT_VERSION=$(cat package.json | jq -r '.version') - echo "Current version: $CURRENT_VERSION" - - # Get the previous commit's package.json version - git checkout HEAD~1 package.json - PREVIOUS_VERSION=$(cat package.json | jq -r '.version') - echo "Previous version: $PREVIOUS_VERSION" - - # Reset back to current commit - git checkout HEAD package.json - - # Check if version changed - if [ "$CURRENT_VERSION" != "$PREVIOUS_VERSION" ]; then - echo "Version changed from $PREVIOUS_VERSION to $CURRENT_VERSION" - echo "should_run=true" >> $GITHUB_OUTPUT - exit 0 - fi - - # Check if src or src-tauri directories changed - CURRENT_SRC_HASH=$(git rev-parse HEAD:src) - PREVIOUS_SRC_HASH=$(git rev-parse HEAD~1:src 2>/dev/null || echo "") - CURRENT_TAURI_HASH=$(git rev-parse HEAD:src-tauri 2>/dev/null || echo "") - PREVIOUS_TAURI_HASH=$(git rev-parse HEAD~1:src-tauri 2>/dev/null || echo "") - - echo "Current src hash: $CURRENT_SRC_HASH" - echo "Previous src hash: $PREVIOUS_SRC_HASH" - echo "Current tauri hash: $CURRENT_TAURI_HASH" - echo "Previous tauri hash: $PREVIOUS_TAURI_HASH" - - if [ "$CURRENT_SRC_HASH" != "$PREVIOUS_SRC_HASH" ] || [ "$CURRENT_TAURI_HASH" != "$PREVIOUS_TAURI_HASH" ]; then - echo "Source directories changed" - echo "should_run=true" >> $GITHUB_OUTPUT - else - echo "Version and source directories unchanged" - echo "should_run=false" >> $GITHUB_OUTPUT - fi - delete_old_assets: - needs: check_commit - if: ${{ needs.check_commit.outputs.should_run == 'true' }} + name: Delete Old Alpha Release Assets and Tags runs-on: ubuntu-latest steps: - - name: Delete Old Alpha Release Assets + - name: Delete Old Alpha Tags Except Latest uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const releaseTag = 'alpha'; + const tagPattern = /-alpha.*/; // 匹配带有 -alpha 的 tag + const owner = context.repo.owner; + const repo = context.repo.repo; try { - // Get the release by tag name - const { data: release } = await github.rest.repos.getReleaseByTag({ - owner: context.repo.owner, - repo: context.repo.repo, - tag: releaseTag + // 获取所有 tag + const { data: tags } = await github.rest.repos.listTags({ + owner, + repo, + per_page: 100 // 调整 per_page 以获取更多 tag }); - console.log(`Found release with ID: ${release.id}`); + // 过滤出包含 -alpha 的 tag + const alphaTags = (await Promise.all( + tags + .filter(tag => tagPattern.test(tag.name)) + .map(async tag => { + // 获取每个 tag 的 commit 信息以获得日期 + const { data: commit } = await github.rest.repos.getCommit({ + owner, + repo, + ref: tag.commit.sha + }); + return { + ...tag, + commitDate: commit.committer && commit.committer.date ? commit.committer.date : commit.commit.author.date + }; + }) + )).sort((a, b) => { + // 按 commit 日期降序排序(最新的在前面) + return new Date(b.commitDate) - new Date(a.commitDate); + }); - // Delete each asset - if (release.assets && release.assets.length > 0) { - console.log(`Deleting ${release.assets.length} assets`); + console.log(`Found ${alphaTags.length} alpha tags`); - for (const asset of release.assets) { - console.log(`Deleting asset: ${asset.name} (${asset.id})`); - await github.rest.repos.deleteReleaseAsset({ - owner: context.repo.owner, - repo: context.repo.repo, - asset_id: asset.id + if (alphaTags.length === 0) { + console.log('No alpha tags found'); + return; + } + + // 保留最新的 tag + const latestTag = alphaTags[0]; + console.log(`Keeping latest alpha tag: ${latestTag.name}`); + + // 处理其他旧的 alpha tag + for (const tag of alphaTags.slice(1)) { + console.log(`Processing tag: ${tag.name}`); + + // 获取与 tag 关联的 release + try { + const { data: release } = await github.rest.repos.getReleaseByTag({ + owner, + repo, + tag: tag.name }); - } - console.log('All assets deleted successfully'); - } else { - console.log('No assets found to delete'); + // 删除 release 下的所有资产 + if (release.assets && release.assets.length > 0) { + console.log(`Deleting ${release.assets.length} assets for release ${tag.name}`); + for (const asset of release.assets) { + console.log(`Deleting asset: ${asset.name} (${asset.id})`); + await github.rest.repos.deleteReleaseAsset({ + owner, + repo, + asset_id: asset.id + }); + } + } + + // 删除 release + console.log(`Deleting release for tag: ${tag.name}`); + await github.rest.repos.deleteRelease({ + owner, + repo, + release_id: release.id + }); + + // 删除 tag + console.log(`Deleting tag: ${tag.name}`); + await github.rest.git.deleteRef({ + owner, + repo, + ref: `tags/${tag.name}` + }); + + } catch (error) { + if (error.status === 404) { + console.log(`No release found for tag ${tag.name}, deleting tag directly`); + await github.rest.git.deleteRef({ + owner, + repo, + ref: `tags/${tag.name}` + }); + } else { + console.error(`Error processing tag ${tag.name}:`, error); + throw error; + } + } } + + console.log('Old alpha tags and releases deleted successfully'); } catch (error) { - if (error.status === 404) { - console.log('Release not found, nothing to delete'); - } else { - console.error('Error:', error); - throw error; - } + console.error('Error:', error); + throw error; } update_tag: @@ -128,22 +138,18 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Fetch Alpha update logs - id: fetch_alpha_logs + - name: Fetch UPDATE logs + id: fetch_update_logs run: | - # Check if UPDATELOG.md exists if [ -f "UPDATELOG.md" ]; then - # Extract the section starting with ## and containing -alpha until the next ## or end of file - # ALPHA_LOGS=$(awk '/^## .*-alpha/{flag=1; print; next} /^## /{flag=0} flag' UPDATELOG.md) - ALPHA_LOGS=$(awk '/^## v/{if(flag) exit; flag=1} flag' UPDATELOG.md) - - if [ -n "$ALPHA_LOGS" ]; then - echo "Found alpha update logs" - echo "ALPHA_LOGS<> $GITHUB_ENV - echo "$ALPHA_LOGS" >> $GITHUB_ENV + UPDATE_LOGS=$(awk '/^## v/{if(flag) exit; flag=1} flag' UPDATELOG.md) + if [ -n "$UPDATE_LOGS" ]; then + echo "Found update logs" + echo "UPDATE_LOGS<> $GITHUB_ENV + echo "$UPDATE_LOGS" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV else - echo "No alpha sections found in UPDATELOG.md" + echo "No update sections found in UPDATELOG.md" fi else echo "UPDATELOG.md file not found" @@ -156,17 +162,15 @@ jobs: shell: bash - run: | - # 检查 ALPHA_LOGS 是否存在,如果不存在则使用默认消息 - if [ -z "$ALPHA_LOGS" ]; then - echo "No alpha logs found, using default message" - ALPHA_LOGS="More new features are now supported. Check for detailed changelog soon." + if [ -z "$UPDATE_LOGS" ]; then + echo "No update logs found, using default message" + UPDATE_LOGS="More new features are now supported. Check for detailed changelog soon." else - echo "Using found alpha logs" + echo "Using found update logs" fi - # 生成 release.txt 文件 cat > release.txt << EOF - $ALPHA_LOGS + $UPDATE_LOGS ## 我应该下载哪个版本? @@ -189,7 +193,6 @@ jobs: - arm64架构: arm64_fixed_webview2-setup.exe ### FAQ - - [常见问题](https://clash-verge-rev.github.io/faq/windows.html) ### 稳定机场VPN推荐 @@ -201,14 +204,15 @@ jobs: - name: Upload Release uses: softprops/action-gh-release@v2 with: - tag_name: alpha - name: "Clash Verge Rev Alpha" + tag_name: ${{ env.TAG_NAME }} + name: "Clash Verge Rev ${{ env.TAG_CHANNEL }}" body_path: release.txt prerelease: true token: ${{ secrets.GITHUB_TOKEN }} generate_release_notes: true - alpha: + alpha-x86-windows-macos-linux: + name: Alpha x86 Windows, MacOS and Linux needs: update_tag strategy: fail-fast: false @@ -224,7 +228,6 @@ jobs: target: x86_64-apple-darwin - os: ubuntu-22.04 target: x86_64-unknown-linux-gnu - runs-on: ${{ matrix.os }} steps: - name: Checkout Repository @@ -264,11 +267,8 @@ jobs: pnpm i pnpm check ${{ matrix.target }} - - name: Release Alpha Version - run: pnpm release-alpha-version - - - name: Patch Alpha Hash - run: pnpm fix-alpha-version + # - name: Release ${{ env.TAG_CHANNEL }} Version + # run: pnpm release-version ${{ env.TAG_NAME }} - name: Tauri build uses: tauri-apps/tauri-action@v0 @@ -284,15 +284,16 @@ jobs: APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: - tagName: alpha - releaseName: "Clash Verge Rev Alpha" + tagName: ${{ env.TAG_NAME }} + releaseName: "Clash Verge Rev ${{ env.TAG_CHANNEL }}" releaseBody: "More new features are now supported." releaseDraft: false prerelease: true tauriScript: pnpm args: --target ${{ matrix.target }} - alpha-for-linux-arm: + alpha-arm-linux: + name: Alpha ARM Linux needs: update_tag strategy: fail-fast: false @@ -336,14 +337,11 @@ jobs: pnpm i pnpm check ${{ matrix.target }} - - name: Release Alpha Version - run: pnpm release-alpha-version + # - name: Release ${{ env.TAG_CHANNEL }} Version + # run: pnpm release-version ${{ env.TAG_NAME }} - - name: Patch Alpha Hash - run: pnpm fix-alpha-version - - - name: "Setup for linux" - run: |- + - name: Setup for linux + run: | sudo ls -lR /etc/apt/ cat > /tmp/sources.list << EOF @@ -377,14 +375,14 @@ jobs: patchelf:${{ matrix.arch }} \ librsvg2-dev:${{ matrix.arch }} - - name: "Install aarch64 tools" + - 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" + - name: Install armv7 tools if: matrix.target == 'armv7-unknown-linux-gnueabihf' run: | sudo apt install -y \ @@ -417,15 +415,16 @@ jobs: - name: Upload Release uses: softprops/action-gh-release@v2 with: - tag_name: alpha - name: "Clash Verge Rev Alpha" + tag_name: ${{ env.TAG_NAME }} + name: "Clash Verge Rev ${{ env.TAG_CHANNEL }}" prerelease: true token: ${{ secrets.GITHUB_TOKEN }} files: | src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb src-tauri/target/${{ matrix.target }}/release/bundle/rpm/*.rpm - alpha-for-fixed-webview2: + alpha-x86-arm-windows_webview2: + name: Alpha x86 and ARM Windows with WebView2 needs: update_tag strategy: fail-fast: false @@ -467,11 +466,8 @@ jobs: pnpm i pnpm check ${{ matrix.target }} - - name: Release Alpha Version - run: pnpm release-alpha-version - - - name: Patch Alpha Hash - run: pnpm fix-alpha-version + # - name: Release ${{ env.TAG_CHANNEL }} Version + # run: pnpm release-version ${{ env.TAG_NAME }} - name: Download WebView2 Runtime run: | @@ -515,13 +511,13 @@ jobs: - name: Upload Release uses: softprops/action-gh-release@v2 with: - tag_name: alpha - name: "Clash Verge Rev Alpha" + tag_name: ${{ env.TAG_NAME }} + name: "Clash Verge Rev ${{ env.TAG_CHANNEL }}" prerelease: true token: ${{ secrets.GITHUB_TOKEN }} files: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*setup* - name: Portable Bundle - run: pnpm portable-fixed-webview2 ${{ matrix.target }} --alpha + run: pnpm portable-fixed-webview2 ${{ matrix.target }} --${{ env.TAG_NAME }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/autobuild.yml b/.github/workflows/autobuild.yml index f41c7f97..d77d7069 100644 --- a/.github/workflows/autobuild.yml +++ b/.github/workflows/autobuild.yml @@ -8,6 +8,7 @@ on: permissions: write-all env: TAG_NAME: autobuild + TAG_CHANNEL: AutoBuild CARGO_INCREMENTAL: 0 RUST_BACKTRACE: short concurrency: @@ -143,7 +144,7 @@ jobs: uses: softprops/action-gh-release@v2 with: tag_name: ${{ env.TAG_NAME }} - name: "Clash Verge Rev AutoBuild" + name: "Clash Verge Rev ${{ env.TAG_CHANNEL }}" body_path: release.txt prerelease: true token: ${{ secrets.GITHUB_TOKEN }} @@ -205,8 +206,8 @@ jobs: pnpm i pnpm check ${{ matrix.target }} - - name: Release Autobuild Version - run: pnpm release-version autobuild + - name: Release ${{ env.TAG_CHANNEL }} Version + run: pnpm release-version ${{ env.TAG_NAME }} - name: Tauri build uses: tauri-apps/tauri-action@v0 @@ -223,7 +224,7 @@ jobs: APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: tagName: ${{ env.TAG_NAME }} - releaseName: "Clash Verge Rev AutoBuild" + releaseName: "Clash Verge Rev ${{ env.TAG_CHANNEL }}" releaseBody: "More new features are now supported." releaseDraft: false prerelease: true @@ -275,8 +276,8 @@ jobs: pnpm i pnpm check ${{ matrix.target }} - - name: Release Autobuild Version - run: pnpm release-version autobuild + - name: Release ${{ env.TAG_CHANNEL }} Version + run: pnpm release-version ${{ env.TAG_NAME }} - name: Setup for linux run: | @@ -354,7 +355,7 @@ jobs: uses: softprops/action-gh-release@v2 with: tag_name: ${{ env.TAG_NAME }} - name: "Clash Verge Rev AutoBuild" + name: "Clash Verge Rev ${{ env.TAG_CHANNEL }}" prerelease: true token: ${{ secrets.GITHUB_TOKEN }} files: | @@ -404,8 +405,8 @@ jobs: pnpm i pnpm check ${{ matrix.target }} - - name: Release Autobuild Version - run: pnpm release-version autobuild + - name: Release ${{ env.TAG_CHANNEL }} Version + run: pnpm release-version ${{ env.TAG_NAME }} - name: Download WebView2 Runtime run: | @@ -450,12 +451,12 @@ jobs: uses: softprops/action-gh-release@v2 with: tag_name: ${{ env.TAG_NAME }} - name: "Clash Verge Rev AutoBuild" + name: "Clash Verge Rev ${{ env.TAG_CHANNEL }}" prerelease: true token: ${{ secrets.GITHUB_TOKEN }} files: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*setup* - name: Portable Bundle - run: pnpm portable-fixed-webview2 ${{ matrix.target }} --autobuild + run: pnpm portable-fixed-webview2 ${{ matrix.target }} --${{ env.TAG_NAME }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package.json b/package.json index 811349ed..37eabe1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "2.3.0", + "version": "2.3.0-alpha.0", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev -f verge-dev",