Skip to content

feat: release v0.3.6 #48

feat: release v0.3.6

feat: release v0.3.6 #48

Workflow file for this run

name: Build and Release
on:
push:
tags:
- "v*"
workflow_dispatch:
jobs:
build:
strategy:
matrix:
include:
- os: macos-latest
platform: mac
- os: windows-latest
platform: win
arch: x64
- os: windows-latest
platform: win
arch: arm64
- os: ubuntu-latest
platform: linux
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
# 显式使用与 package.json 中一致的 pnpm 版本
version: 9.15.0
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Clean previous build artifacts
shell: bash
run: |
rm -rf dist || true
- name: Build for ${{ matrix.platform }} ${{ matrix.arch }}
shell: bash
run: |
if [ "${{ matrix.platform }}" = "win" ] && [ -n "${{ matrix.arch }}" ]; then
# Windows: build specific architecture
pnpm vite build && pnpm electron-builder --win --${{ matrix.arch }} --publish never
else
pnpm electron:build:${{ matrix.platform }}
fi
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Normalize Windows update metadata
if: matrix.platform == 'win' && matrix.arch != ''
shell: bash
run: |
# Generate appropriate yml files for each architecture
# 为每个架构生成适当的 yml 文件
if [ "${{ matrix.arch }}" = "arm64" ]; then
if [ -f "dist/latest.yml" ]; then
# Rename to latest-arm64.yml for arm64 builds
mv dist/latest.yml dist/latest-arm64.yml
echo "Renamed latest.yml to latest-arm64.yml for ARM64"
fi
else
# x64: Generate BOTH latest.yml AND latest-x64.yml for backward compatibility
# x64: 同时生成 latest.yml 和 latest-x64.yml 以保持向后兼容
# - New versions (0.3.5+) use default behavior -> latest.yml
# - Old versions (0.3.4 and earlier) use channel='x64' -> latest-x64.yml
if [ -f "dist/latest.yml" ]; then
exe=$(ls dist/PromptHub-Setup-*-x64.exe 2>/dev/null | head -1 | xargs -I {} basename {})
if [ -n "$exe" ]; then
sed -i.bak "s/PromptHub-Setup-[0-9.]*\.exe/$exe/g" dist/latest.yml
rm -f dist/latest.yml.bak
echo "Updated latest.yml to point to $exe"
fi
# Create latest-x64.yml as a copy for backward compatibility with old versions
# 创建 latest-x64.yml 副本以兼容旧版本
cp dist/latest.yml dist/latest-x64.yml
echo "Created latest-x64.yml for backward compatibility"
fi
fi
# Remove duplicate NSIS blockmap without arch (prevents release upload errors)
shopt -s nullglob
for file in dist/*.exe.blockmap; do
case "$file" in
*-x64.exe.blockmap|*-arm64.exe.blockmap) ;;
*) rm -f "$file" ;;
esac
done
- name: Remove debug files
shell: bash
run: |
# 删除 builder-debug.yml
find dist -name "builder-debug.yml" -delete || true
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.platform }}-${{ matrix.arch || 'default' }}-build
path: |
dist/*.dmg
dist/*.zip
dist/*-x64.exe
dist/*-arm64.exe
dist/*.AppImage
dist/*.deb
dist/*.blockmap
dist/latest*.yml
if-no-files-found: ignore
release:
needs: build
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Set release version
shell: bash
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_ENV"
- name: List artifacts for debugging
shell: bash
run: |
echo "=== Artifact structure ==="
find artifacts -type f -name "*.yml" -o -name "*.exe" -o -name "*.dmg" | head -50
- name: Create Release with gh CLI
shell: bash
run: |
# 1. Prepare Release Notes
cat > release_notes.md <<EOF
## 📦 下载安装
| 平台 | 下载 |
|------|------|
| Windows | [![Windows x64](https://img.shields.io/badge/Windows_x64-0078D6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/legeling/PromptHub/releases/latest/download/PromptHub-Setup-${VERSION}-x64.exe) [![Windows arm64](https://img.shields.io/badge/Windows_arm64-0078D6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/legeling/PromptHub/releases/latest/download/PromptHub-Setup-${VERSION}-arm64.exe) |
| macOS | [![macOS Apple Silicon](https://img.shields.io/badge/macOS_Apple_Silicon-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/legeling/PromptHub/releases/latest/download/PromptHub-${VERSION}-arm64.dmg) [![macOS Intel](https://img.shields.io/badge/macOS_Intel-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/legeling/PromptHub/releases/latest/download/PromptHub-${VERSION}-x64.dmg) |
| Linux | [![Linux AppImage](https://img.shields.io/badge/Linux_AppImage-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/legeling/PromptHub/releases/latest/download/PromptHub-${VERSION}-x64.AppImage) [![Linux deb](https://img.shields.io/badge/Linux_deb-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/legeling/PromptHub/releases/latest/download/prompthub_${VERSION}_amd64.deb) |
### ⚠️ macOS 首次启动
如果提示"无法打开"或"已损坏",请在终端执行:
\`\`\`bash
sudo xattr -rd com.apple.quarantine /Applications/PromptHub.app
\`\`\`
---
## 🔄 本次更新
详细更新日志请查看 [更新日志](https://github.com/legeling/PromptHub#-更新日志)
EOF
# 2. Collect and Deduplicate Assets
echo "Collecting and deduplicating assets..."
mkdir -p release_assets
# Find all matching files and copy them to a single directory
# This handles duplicates by overwriting (latest version wins)
find artifacts -type f \( \
-name "PromptHub-*-x64.dmg" -o \
-name "PromptHub-*-arm64.dmg" -o \
-name "PromptHub-Setup-*-x64.exe" -o \
-name "PromptHub-Setup-*-arm64.exe" -o \
-name "PromptHub-*-x64.AppImage" -o \
-name "prompthub_*_amd64.deb" -o \
-name "PromptHub-*.zip" -o \
-name "latest*.yml" -o \
-name "*.blockmap" \
\) -exec cp -f {} release_assets/ \;
echo "Files to upload (deduplicated):"
ls -1 release_assets/
# 3. Clean up existing release
echo "Checking for existing release..."
gh release delete "${GITHUB_REF_NAME}" --yes --cleanup-tag || true
# IMPORTANT: Add delay to allow GitHub API to propagate the deletion
echo "Waiting for GitHub API consistency..."
sleep 10
# 4. Re-create Tag (Ensure it exists for the release)
git tag -f "${GITHUB_REF_NAME}"
git push origin "${GITHUB_REF_NAME}" --force
# 5. Create Release and Upload
echo "Creating release..."
gh release create "${GITHUB_REF_NAME}" \
release_assets/* \
--title "PromptHub ${VERSION}" \
--notes-file release_notes.md \
--draft=false \
--prerelease=${{ contains(github.ref, 'beta') || contains(github.ref, 'alpha') }} \
--generate-notes
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}