name: Release to Main on: push: tags: - 'v*.*.*' - '*.*.*' - 'v*.*.*-stable' - '*.*.*-stable' # 排除预发布标签,否则 v*.*.* 会同时命中 beta/alpha/rc, # 导致预发布被当成正式版发布并与 beta-release.yml 竞争同一 tag - '!v*.*.*-beta*' - '!*.*.*-beta*' - '!v*.*.*-alpha*' - '!*.*.*-alpha*' - '!v*.*.*-rc*' - '!*.*.*-rc*' permissions: contents: write jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # 获取所有历史以生成changelog - name: Get version from tag id: get_version run: | TAG=${GITHUB_REF#refs/tags/} VERSION=${TAG#v} echo "TAG=$TAG" >> $GITHUB_OUTPUT echo "VERSION=$VERSION" >> $GITHUB_OUTPUT - name: Build single script from modules run: bash build.sh - name: Validate build output before release run: | # 发版前置校验:打 tag 直发不再绕过 PR 的质量闸门 bash -n dist/PVE-Tools.sh shellcheck --severity=error -f gcc dist/PVE-Tools.sh # 函数集合一致性(源码 vs 产物 双向) diff <(grep -rhoE '^[a-zA-Z_][a-zA-Z0-9_]*\(\)' lib src/modules --include='*.sh' | sort -u) \ <(grep -hoE '^[a-zA-Z_][a-zA-Z0-9_]*\(\)' dist/PVE-Tools.sh | sort -u) \ || { echo "构建产物与源码函数集合不一致,中止发布"; exit 1; } # 版本三方一致:tag == lib/config.sh == VERSION,防止打错标签发出版本混乱的 Release SCRIPT_VERSION=$(grep "CURRENT_VERSION=" lib/config.sh | cut -d'"' -f2) VERSION_FILE_VERSION=$(cat VERSION) TAG_VERSION="${{ steps.get_version.outputs.VERSION }}" TAG_VERSION="${TAG_VERSION%-stable}" if [ "$SCRIPT_VERSION" != "$VERSION_FILE_VERSION" ]; then echo "版本不一致: config($SCRIPT_VERSION) != VERSION($VERSION_FILE_VERSION),中止发布" exit 1 fi if [ "$TAG_VERSION" != "$SCRIPT_VERSION" ]; then echo "标签版本($TAG_VERSION)与脚本版本($SCRIPT_VERSION)不一致,中止发布" exit 1 fi - name: Generate checksums run: | cd dist && sha256sum PVE-Tools.sh > SHA256SUMS.txt && cat SHA256SUMS.txt - name: Generate release notes id: release_notes run: | # 生成基于提交历史的发布说明 LATEST_TAG=${{ steps.get_version.outputs.TAG }} # 尝试获取前一个 tag,如果没有则为空 PREVIOUS_TAG=$(git describe --tags --abbrev=0 $(git rev-list --tags --skip=1 --max-count=1) 2>/dev/null || echo "") if [ -z "$PREVIOUS_TAG" ]; then CHANGELOG=$(git log --pretty=format:"- %s (%an)" $LATEST_TAG) else CHANGELOG=$(git log --pretty=format:"- %s (%an)" $PREVIOUS_TAG..$LATEST_TAG) fi echo "CHANGELOG<> $GITHUB_OUTPUT echo "$CHANGELOG" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.get_version.outputs.TAG }} name: Release ${{ steps.get_version.outputs.TAG }} body: | ## 版本 ${{ steps.get_version.outputs.VERSION }} ### 更新日志 ${{ steps.release_notes.outputs.CHANGELOG }} ### 使用方法 **Cloudflare 短域名(推荐)** ```bash bash <(curl -sSL https://pve.u3u.icu/PVE-Tools.sh) ``` **中国大陆网络** ```bash bash <(curl -sSL https://ghfast.top/https://github.com/PVE-Tools/PVE-Tools-9/releases/latest/download/PVE-Tools.sh) ``` **国际网络** ```bash bash <(curl -sSL https://github.com/PVE-Tools/PVE-Tools-9/releases/latest/download/PVE-Tools.sh) ``` **本地下载运行** ```bash wget https://github.com/PVE-Tools/PVE-Tools-9/releases/latest/download/PVE-Tools.sh chmod +x PVE-Tools.sh sudo ./PVE-Tools.sh ``` files: | dist/PVE-Tools.sh dist/SHA256SUMS.txt draft: false prerelease: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}