name: Preview Nightly on: schedule: # GitHub Actions schedule uses UTC. 16:00 UTC = 北京时间次日 00:00 - cron: "0 16 * * *" workflow_dispatch: permissions: contents: write env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" FIXED_PREVIEW_TAG: nightly-preview ELECTRON_BUILDER_BINARIES_MIRROR: https://github.com/electron-userland/electron-builder-binaries/releases/download/ jobs: prepare: runs-on: ubuntu-latest outputs: should_build: ${{ steps.meta.outputs.should_build }} preview_version: ${{ steps.meta.outputs.preview_version }} steps: - name: Check out git repository uses: actions/checkout@v5 with: fetch-depth: 0 - name: Install Node.js uses: actions/setup-node@v5 with: node-version: 24 cache: "npm" - name: Decide whether to build and generate preview version id: meta shell: bash run: | set -euo pipefail git fetch origin main --depth=1 COMMITS_24H="$(git rev-list --count --since='24 hours ago' origin/main)" if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then SHOULD_BUILD=true elif [ "$COMMITS_24H" -gt 0 ]; then SHOULD_BUILD=true else SHOULD_BUILD=false fi BASE_VERSION="$(node -p "require('./package.json').version.split('-')[0]")" YEAR_2="$(TZ=Asia/Shanghai date +%y)" PREVIEW_VERSION="${BASE_VERSION}-preview.${YEAR_2}.${GITHUB_RUN_NUMBER}" echo "should_build=$SHOULD_BUILD" >> "$GITHUB_OUTPUT" echo "preview_version=$PREVIEW_VERSION" >> "$GITHUB_OUTPUT" echo "Preview version: $PREVIEW_VERSION (commits in last 24h on main: $COMMITS_24H)" - name: Ensure fixed preview prerelease exists env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | set -euo pipefail if gh release view "$FIXED_PREVIEW_TAG" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then gh release edit "$FIXED_PREVIEW_TAG" --repo "$GITHUB_REPOSITORY" --title "Preview Nightly Build" --prerelease else gh release create "$FIXED_PREVIEW_TAG" --repo "$GITHUB_REPOSITORY" --title "Preview Nightly Build" --notes "预览版发布页" --prerelease fi preview-mac-arm64: needs: prepare if: needs.prepare.outputs.should_build == 'true' runs-on: macos-14 steps: - name: Check out git repository uses: actions/checkout@v5 with: fetch-depth: 0 - name: Install Node.js uses: actions/setup-node@v5 with: node-version: 24 cache: "npm" - name: Install Dependencies run: npm install - name: Set preview version shell: bash run: npm version "${{ needs.prepare.outputs.preview_version }}" --no-git-tag-version --allow-same-version - name: Build Frontend & Type Check run: | npx tsc npx vite build - name: Package macOS arm64 preview artifacts env: CSC_IDENTITY_AUTO_DISCOVERY: "false" shell: bash run: | export ELECTRON_BUILDER_BINARIES_MIRROR="https://github.com/electron-userland/electron-builder-binaries/releases/download/" echo "Using ELECTRON_BUILDER_BINARIES_MIRROR=$ELECTRON_BUILDER_BINARIES_MIRROR" npx electron-builder --mac dmg --arm64 --publish never '--config.publish.channel=preview' '--config.artifactName=${productName}-preview-arm64.${ext}' - name: Upload macOS arm64 assets to fixed preview release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | assets=() while IFS= read -r file; do assets+=("$file") done < <(find release -maxdepth 1 -type f | sort) if [ "${#assets[@]}" -eq 0 ]; then echo "No release files found in ./release" exit 1 fi gh release upload "$FIXED_PREVIEW_TAG" "${assets[@]}" --repo "$GITHUB_REPOSITORY" --clobber preview-linux: needs: prepare if: needs.prepare.outputs.should_build == 'true' runs-on: ubuntu-latest steps: - name: Check out git repository uses: actions/checkout@v5 with: fetch-depth: 0 - name: Install Node.js uses: actions/setup-node@v5 with: node-version: 24 cache: "npm" - name: Install Dependencies run: npm install - name: Set preview version shell: bash run: npm version "${{ needs.prepare.outputs.preview_version }}" --no-git-tag-version --allow-same-version - name: Build Frontend & Type Check run: | npx tsc npx vite build - name: Package Linux preview artifacts env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | npx electron-builder --linux --publish never '--config.publish.channel=preview' '--config.artifactName=${productName}-preview-linux.${ext}' - name: Upload Linux assets to fixed preview release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | assets=() while IFS= read -r file; do assets+=("$file") done < <(find release -maxdepth 1 -type f | sort) if [ "${#assets[@]}" -eq 0 ]; then echo "No release files found in ./release" exit 1 fi gh release upload "$FIXED_PREVIEW_TAG" "${assets[@]}" --repo "$GITHUB_REPOSITORY" --clobber preview-win-x64: needs: prepare if: needs.prepare.outputs.should_build == 'true' runs-on: windows-latest steps: - name: Check out git repository uses: actions/checkout@v5 with: fetch-depth: 0 - name: Install Node.js uses: actions/setup-node@v5 with: node-version: 24 cache: "npm" - name: Install Dependencies run: npm install - name: Set preview version shell: bash run: npm version "${{ needs.prepare.outputs.preview_version }}" --no-git-tag-version --allow-same-version - name: Build Frontend & Type Check run: | npx tsc npx vite build - name: Package Windows x64 preview artifacts env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | npx electron-builder --win nsis --x64 --publish never '--config.publish.channel=preview' '--config.artifactName=${productName}-preview-x64-Setup.${ext}' - name: Upload Windows x64 assets to fixed preview release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | assets=() while IFS= read -r file; do assets+=("$file") done < <(find release -maxdepth 1 -type f | sort) if [ "${#assets[@]}" -eq 0 ]; then echo "No release files found in ./release" exit 1 fi gh release upload "$FIXED_PREVIEW_TAG" "${assets[@]}" --repo "$GITHUB_REPOSITORY" --clobber preview-win-arm64: needs: prepare if: needs.prepare.outputs.should_build == 'true' runs-on: windows-latest steps: - name: Check out git repository uses: actions/checkout@v5 with: fetch-depth: 0 - name: Install Node.js uses: actions/setup-node@v5 with: node-version: 24 cache: "npm" - name: Install Dependencies run: npm install - name: Set preview version shell: bash run: npm version "${{ needs.prepare.outputs.preview_version }}" --no-git-tag-version --allow-same-version - name: Build Frontend & Type Check run: | npx tsc npx vite build - name: Package Windows arm64 preview artifacts env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | npx electron-builder --win nsis --arm64 --publish never '--config.publish.channel=preview-arm64' '--config.artifactName=${productName}-preview-arm64-Setup.${ext}' - name: Upload Windows arm64 assets to fixed preview release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | assets=() while IFS= read -r file; do assets+=("$file") done < <(find release -maxdepth 1 -type f | sort) if [ "${#assets[@]}" -eq 0 ]; then echo "No release files found in ./release" exit 1 fi gh release upload "$FIXED_PREVIEW_TAG" "${assets[@]}" --repo "$GITHUB_REPOSITORY" --clobber update-preview-release-notes: needs: - prepare - preview-mac-arm64 - preview-linux - preview-win-x64 - preview-win-arm64 if: needs.prepare.outputs.should_build == 'true' && always() runs-on: ubuntu-latest steps: - name: Update preview release notes env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | set -euo pipefail TAG="$FIXED_PREVIEW_TAG" CURRENT_PREVIEW_VERSION="${{ needs.prepare.outputs.preview_version }}" REPO="$GITHUB_REPOSITORY" RELEASE_PAGE="https://github.com/$REPO/releases/tag/$TAG" if ! gh release view "$TAG" --repo "$REPO" >/dev/null 2>&1; then echo "Release $TAG not found (possibly all publish jobs failed), skip notes update." exit 0 fi ASSETS_JSON="$(gh release view "$TAG" --repo "$REPO" --json assets)" pick_asset() { local pattern="$1" echo "$ASSETS_JSON" | jq -r --arg p "$pattern" '[.assets[].name | select(test($p))][0] // ""' } WINDOWS_ASSET="$(pick_asset "x64.*[.]exe$")" if [ -z "$WINDOWS_ASSET" ]; then WINDOWS_ASSET="$(echo "$ASSETS_JSON" | jq -r '[.assets[].name | select(test("[.]exe$")) | select(test("arm64") | not)][0] // ""')" fi WINDOWS_ARM64_ASSET="$(pick_asset "arm64.*[.]exe$")" MAC_ASSET="$(pick_asset "[.]dmg$")" LINUX_TAR_ASSET="$(pick_asset "[.]tar[.]gz$")" LINUX_APPIMAGE_ASSET="$(pick_asset "[.]AppImage$")" build_link() { local name="$1" if [ -n "$name" ]; then echo "https://github.com/$REPO/releases/download/$TAG/$name" fi } WINDOWS_URL="$(build_link "$WINDOWS_ASSET")" WINDOWS_ARM64_URL="$(build_link "$WINDOWS_ARM64_ASSET")" MAC_URL="$(build_link "$MAC_ASSET")" LINUX_TAR_URL="$(build_link "$LINUX_TAR_ASSET")" LINUX_APPIMAGE_URL="$(build_link "$LINUX_APPIMAGE_ASSET")" cat > preview_release_notes.md < 如某个平台链接暂未生成,请前往发布页查看最新资源:$RELEASE_PAGE EOF gh release edit "$TAG" --repo "$REPO" --notes-file preview_release_notes.md