feat: no cpu defense #10
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build VPM Repository Listing | |
| on: | |
| push: | |
| branches: [master] | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| pages: write | |
| id-token: write | |
| concurrency: | |
| group: 'pages' | |
| cancel-in-progress: false | |
| env: | |
| GITHUB_OWNER: ${{ github.repository_owner }} | |
| GITHUB_REPO: ${{ github.event.repository.name }} | |
| jobs: | |
| build-listing: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 1 | |
| - name: Build VPM Listing | |
| run: | | |
| set -e | |
| # GitHub Pages URL 全部小写 | |
| OWNER_LOWER=$(echo "${GITHUB_OWNER}" | tr '[:upper:]' '[:lower:]') | |
| REPO_URL="https://${OWNER_LOWER}.github.io/${GITHUB_REPO}" | |
| # 定义所有包的目录(相对于仓库根) | |
| PACKAGE_DIRS=( | |
| "Assets/UnityBox/AdvancedCostumeController" | |
| "Assets/UnityBox/BlendshapeControllerGenerator" | |
| "Assets/UnityBox/AvatarColliderMonitor" | |
| "Assets/UnityBox/BuildPipelineLogger" | |
| "Assets/UnityBox/AvatarSecuritySystem" | |
| ) | |
| mkdir -p _site | |
| # 获取当前 tag(如有),否则使用 package.json 中的 version | |
| GIT_TAG="${GITHUB_REF_NAME}" | |
| # 构建每个包的 zip | |
| PACKAGES_JSON="{" | |
| FIRST_PKG=true | |
| for pkg_dir in "${PACKAGE_DIRS[@]}"; do | |
| if [ ! -f "${pkg_dir}/package.json" ]; then | |
| echo "跳过 ${pkg_dir}:未找到 package.json" | |
| continue | |
| fi | |
| PKG_NAME=$(jq -r '.name' "${pkg_dir}/package.json") | |
| PKG_VERSION=$(jq -r '.version' "${pkg_dir}/package.json") | |
| PKG_DISPLAY_NAME=$(jq -r '.displayName' "${pkg_dir}/package.json") | |
| # 如果是 tag 推送,用 tag 作为版本号(去掉前缀 v) | |
| if [[ "${GITHUB_REF}" == refs/tags/* ]]; then | |
| TAG_VERSION="${GIT_TAG#v}" | |
| # 更新 package.json 中的版本号 | |
| jq --arg v "$TAG_VERSION" '.version = $v' "${pkg_dir}/package.json" > "${pkg_dir}/package.json.tmp" | |
| mv "${pkg_dir}/package.json.tmp" "${pkg_dir}/package.json" | |
| PKG_VERSION="$TAG_VERSION" | |
| fi | |
| echo "打包: ${PKG_NAME} v${PKG_VERSION}" | |
| # 创建 zip 包 | |
| ZIP_NAME="${PKG_NAME}-${PKG_VERSION}.zip" | |
| (cd "${pkg_dir}" && zip -r "../../../_site/${ZIP_NAME}" . -x "*.meta" -x "*/Generated/*") | |
| ZIP_URL="${REPO_URL}/${ZIP_NAME}" | |
| ZIP_SHA256=$(sha256sum "_site/${ZIP_NAME}" | cut -d' ' -f1) | |
| # 读取完整的 package.json 并添加 zipSHA256 和 url | |
| PKG_JSON=$(jq --arg url "$ZIP_URL" --arg sha "$ZIP_SHA256" \ | |
| '. + {"zipSHA256": $sha, "url": $url}' "${pkg_dir}/package.json") | |
| # 构建 packages 对象 | |
| if [ "$FIRST_PKG" = true ]; then | |
| FIRST_PKG=false | |
| else | |
| PACKAGES_JSON="${PACKAGES_JSON}," | |
| fi | |
| PACKAGES_JSON="${PACKAGES_JSON}\"${PKG_NAME}\":{\"versions\":{\"${PKG_VERSION}\":${PKG_JSON}}}" | |
| done | |
| PACKAGES_JSON="${PACKAGES_JSON}}" | |
| # 构建最终的 VPM listing vpm.json | |
| printf '{\n "name": "UnityBox",\n "id": "top.sealoong.unitybox.listing",\n "url": "%s/vpm.json",\n "author": "SeaLoong",\n "packages": %s\n}' "${REPO_URL}" "${PACKAGES_JSON}" > _site/vpm.json | |
| # 使用 jq 格式化 | |
| jq '.' _site/vpm.json > _site/vpm.json.tmp && mv _site/vpm.json.tmp _site/vpm.json | |
| echo "VPM listing 已构建完成" | |
| cat _site/vpm.json | |
| # 生成 index.html 跳转页面,用于绕过 GitHub Markdown 对自定义协议的过滤 | |
| VCC_URL="vcc://vpm/addRepo?url=${REPO_URL}/vpm.json" | |
| cat > _site/index.html << 'PAGE_EOF' | |
| <!DOCTYPE html> | |
| <html lang="zh"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>UnityBox VPM Repository</title> | |
| <style> | |
| body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: #f6f8fa; } | |
| .card { background: white; border-radius: 12px; padding: 40px; box-shadow: 0 2px 12px rgba(0,0,0,0.1); text-align: center; max-width: 480px; } | |
| h1 { margin: 0 0 16px; font-size: 24px; color: #24292f; } | |
| p { color: #57606a; margin: 0 0 24px; line-height: 1.6; } | |
| .btn { display: inline-block; padding: 12px 32px; background: #2ea44f; color: white; text-decoration: none; border-radius: 8px; font-size: 16px; font-weight: 600; transition: background 0.2s; } | |
| .btn:hover { background: #2c974b; } | |
| .manual { margin-top: 24px; padding-top: 20px; border-top: 1px solid #d0d7de; } | |
| code { background: #f6f8fa; padding: 4px 8px; border-radius: 4px; font-size: 14px; color: #0969da; word-break: break-all; } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="card"> | |
| <h1>UnityBox VPM Repository</h1> | |
| <p>点击下方按钮将 UnityBox 仓库添加到 VCC / ALCOM</p> | |
| PAGE_EOF | |
| # 动态插入带有实际 URL 的按钮和手动添加部分 | |
| cat >> _site/index.html << PAGE_EOF | |
| <a class="btn" href="${VCC_URL}">添加到 VCC</a> | |
| <div class="manual"> | |
| <p>或手动添加 VPM 源地址:</p> | |
| <code>${REPO_URL}/vpm.json</code> | |
| </div> | |
| </div> | |
| </body> | |
| </html> | |
| PAGE_EOF | |
| echo "index.html 跳转页面已生成" | |
| - name: Upload Pages artifact | |
| uses: actions/upload-pages-artifact@v3 | |
| with: | |
| path: _site | |
| deploy: | |
| needs: build-listing | |
| runs-on: ubuntu-latest | |
| environment: | |
| name: github-pages | |
| url: ${{ steps.deployment.outputs.page_url }} | |
| steps: | |
| - name: Deploy to GitHub Pages | |
| id: deployment | |
| uses: actions/deploy-pages@v4 |