name: Build permissions: write-all on: workflow_dispatch: inputs: version: description: "Tag version to release" required: false push: branches: - master tags: - v* paths-ignore: - 'README.md' - '.github/ISSUE_TEMPLATE/**' - '.github/workflows/issues.yml' jobs: build: strategy: fail-fast: false matrix: os: [windows-latest, ubuntu-latest, macos-latest] arch: [x64, arm64] runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup pnpm run: npm install -g pnpm - name: Determine and Update Version shell: bash run: | GIT_COMMIT_HASH=$(git rev-parse --short HEAD) VERSION=$(jq -r '.version' package.json) if [ "${{ github.event.inputs.version }}" == "" ]; then BASE_VERSION=$(echo $VERSION | awk -F. '{print $1"."$2"."$3+1}') VERSION_PREFIX=${VERSION_PREFIX:-beta} RELEASE_VERSION="${BASE_VERSION}-${VERSION_PREFIX}-${GIT_COMMIT_HASH}" else INPUT_VERSION="${{ github.event.inputs.version }}" CLEAN_VERSION=$(echo "$INPUT_VERSION" | sed 's/^v//') if [[ ! "$CLEAN_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "Invalid version format: $INPUT_VERSION" exit 1 fi RELEASE_VERSION="$CLEAN_VERSION" fi jq --arg version "$RELEASE_VERSION" '.version = $version' package.json > tmp.json && mv tmp.json package.json - name: Install Dependencies and Prepare env: npm_config_arch: ${{ matrix.arch }} npm_config_target_arch: ${{ matrix.arch }} run: | pnpm install pnpm add @mihomo-party/sysproxy-${{ matrix.os == 'windows-latest' && 'win32' || matrix.os == 'ubuntu-latest' && 'linux' || 'darwin' }}-${{ matrix.arch }}${{ matrix.os == 'ubuntu-latest' && '-gnu' || matrix.os == 'windows-latest' && '-msvc' || '' }} pnpm prepare --${{ matrix.arch }} - name: Build env: npm_config_arch: ${{ matrix.arch }} npm_config_target_arch: ${{ matrix.arch }} run: | chmod +x build/pkg-scripts/postinstall pnpm build:${{ matrix.os == 'windows-latest' && 'win' || matrix.os == 'ubuntu-latest' && 'linux' || 'mac' }} --${{ matrix.arch }} - name: Add Portable Flag if: matrix.os == 'windows-latest' run: | New-Item -Path "PORTABLE" -ItemType File Get-ChildItem dist/*portable.7z | ForEach-Object { 7z a $_.FullName PORTABLE } - name: Generate latest.yml run: pnpm updater - name: Upload Artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.os }}-${{ matrix.arch }} path: | dist/mihomo-party* !dist/mihomo-party*blockmap latest.yml changelog.md pre-release: needs: [build] runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Download Artifacts uses: actions/download-artifact@v4 with: path: bin/ merge-multiple: true - name: Delete Pre-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | if ! gh release delete pre-release --yes; then echo "Failed to delete release, but continuing..." fi git log -1 --pretty=format:"%s%n%b" > changelog.md - name: Publish Prerelease if: success() uses: softprops/action-gh-release@v2 with: tag_name: pre-release body_path: changelog.md files: | bin/latest.yml bin/dist/* prerelease: true release: if: startsWith(github.ref, 'refs/tags/v') || (github.event_name == 'workflow_dispatch' && github.event.inputs.version != '') needs: [build] runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Update Version run: | INPUT_VERSION="${{ github.event.inputs.version }}" CLEAN_VERSION=$(echo "$INPUT_VERSION" | sed 's/^v//') if [[ ! "$CLEAN_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "Invalid version format: $INPUT_VERSION" exit 1 fi jq --arg version "$CLEAN_VERSION" '.version = $version' package.json > tmp.json && mv tmp.json package.json git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" git add package.json git commit -m "Update version to $CLEAN_VERSION" git push - uses: actions/download-artifact@v4 with: path: bin/ merge-multiple: true - name: Delete Current uses: 8Mi-Tech/delete-release-assets-action@main with: github_token: ${{ secrets.GITHUB_TOKEN }} tag: ${{ github.event.inputs.version != '' && github.event.inputs.version || github.ref }} deleteOnlyFromDrafts: false - name: Publish Release if: success() uses: softprops/action-gh-release@v2 with: tag_name: ${{ github.event.inputs.version != '' && github.event.inputs.version || github.ref }} body_path: bin/changelog.md files: | bin/latest.yml bin/dist/*