feat:移除了弹窗,服务器添加sls

This commit is contained in:
2026-09-08 22:39:45 +08:00
commit 6a295f9a7a
4082 changed files with 1322534 additions and 0 deletions

400
.github/workflows/axolotl-release.yml vendored Normal file
View File

@ -0,0 +1,400 @@
name: Axolotl release
on:
push:
tags:
- 'v*'
permissions:
contents: write
concurrency:
group: axolotl-release-${{ github.ref }}
cancel-in-progress: false
jobs:
preflight:
name: Release preflight
runs-on: ubuntu-24.04
env:
SQLX_OFFLINE: true
steps:
- name: Check out source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
submodules: recursive
- name: Set up pnpm
uses: pnpm/action-setup@008330803749db0355799c700092d9a85fd074e9 # v6.0.9
- name: Set up Node.js
uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
with:
node-version-file: .nvmrc
cache: pnpm
- name: Set up Rust
uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 # stable
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install Blockbench skin editor dependencies
run: npm ci
working-directory: third-party/blockbench
- name: Run release guardrails
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
node scripts/axolotl/check-migrations.mjs --release
node scripts/axolotl/brand-guard.mjs
node scripts/axolotl/i18n-check.mjs
cargo fmt --all --check
- name: Prepare draft release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
release_notes="${RUNNER_TEMP}/axolotl-release-notes.md"
node scripts/axolotl/create-release-notes.mjs "${GITHUB_REF_NAME}" "$release_notes"
existing_release="$(
gh release list --limit 100 --json tagName \
--jq ".[] | select(.tagName == \"${GITHUB_REF_NAME}\") | .tagName"
)"
if [[ -n "$existing_release" ]]; then
echo "Release ${GITHUB_REF_NAME} already exists"
gh release edit "${GITHUB_REF_NAME}" --notes-file "$release_notes"
exit 0
fi
release_args=(
--draft
--notes-file "$release_notes"
--title "Axolotl Launcher ${GITHUB_REF_NAME}"
)
if [[ "${GITHUB_REF_NAME}" == *-* ]]; then
release_args+=(--prerelease)
fi
gh release create "${GITHUB_REF_NAME}" "${release_args[@]}"
build:
name: Build (${{ matrix.name }})
needs: preflight
strategy:
fail-fast: true
max-parallel: 4
matrix:
include:
- name: Linux x64
runner: ubuntu-24.04
args: --config tauri-release.conf.json --config tauri-updater.conf.json
- name: Linux arm64
runner: ubuntu-24.04-arm
args: --config tauri-release.conf.json --config tauri-updater.conf.json
- name: Windows x64
runner: windows-2025
args: --config tauri-release.conf.json --config tauri-modern.conf.json --config tauri-updater.conf.json
- name: macOS universal
runner: macos-15
args: --target universal-apple-darwin --config tauri-release.conf.json --config tauri-updater.conf.json
runs-on: ${{ matrix.runner }}
env:
SQLX_OFFLINE: true
steps:
- name: Check out source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
submodules: recursive
- name: Set up pnpm
uses: pnpm/action-setup@008330803749db0355799c700092d9a85fd074e9 # v6.0.9
- name: Set up Node.js
uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
with:
node-version-file: .nvmrc
cache: pnpm
- name: Set up Rust
uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 # stable
- name: Set up Rust compiler cache
if: runner.os == 'Windows'
uses: mozilla-actions/sccache-action@2df7dbab909c49ab7d3382d05da469f3f975c2d6 # v0.0.7
- name: Check Rust compiler cache availability
id: sccache
if: runner.os == 'Windows'
continue-on-error: true
shell: bash
env:
SCCACHE_GHA_ENABLED: 'true'
run: ${SCCACHE_PATH} rustc -vV
- name: Enable Rust compiler cache
if: runner.os == 'Windows' && steps.sccache.outcome == 'success'
shell: bash
run: |
echo 'RUSTC_WRAPPER=sccache' >> "$GITHUB_ENV"
echo 'SCCACHE_GHA_ENABLED=true' >> "$GITHUB_ENV"
echo 'SCCACHE_CACHE_SIZE=4G' >> "$GITHUB_ENV"
- name: Add macOS universal targets
if: runner.os == 'macOS'
run: rustup target add aarch64-apple-darwin x86_64-apple-darwin
- name: Install Linux dependencies
if: runner.os == 'Linux'
run: sudo apt-get -o Acquire::ForceIPv4=true update && sudo apt-get -o Acquire::ForceIPv4=true install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf xdg-utils
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install Blockbench skin editor dependencies
run: npm ci
working-directory: third-party/blockbench
- uses: ./.github/actions/replace-gradle-mirror
- name: Set release version
run: node scripts/axolotl/set-version.mjs "${{ github.ref_name }}"
- name: Build and upload release assets
uses: tauri-apps/tauri-action@1ddc7b49b13c3038297360482fcb3e058764d7c9 # v0.6.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
TAURI_BUNDLER_DMG_IGNORE_CI: ${{ runner.os == 'macOS' && 'true' || '' }}
with:
projectPath: apps/app
tauriScript: pnpm tauri
args: ${{ matrix.args }}
tagName: ${{ github.ref_name }}
releaseName: Axolotl Launcher ${{ github.ref_name }}
releaseDraft: true
prerelease: ${{ contains(github.ref_name, '-') }}
generateReleaseNotes: false
includeUpdaterJson: false
updaterJsonPreferNsis: true
retryAttempts: 2
- name: Show Rust compiler cache statistics
if: runner.os == 'Windows' && steps.sccache.outcome == 'success' && always()
shell: bash
run: ${SCCACHE_PATH} --show-stats
- name: Publish Windows distribution variants
if: runner.os == 'Windows'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
shell: pwsh
run: |
$version = "${{ github.ref_name }}" -replace '^v', ''
$appName = "Axolotl Launcher"
$outDir = "target/release/bundle/nsis"
$buildDir = "target/portable-build"
$publishDir = Join-Path $env:RUNNER_TEMP "windows-assets"
New-Item -ItemType Directory -Force -Path $publishDir | Out-Null
$modernInstallers = @(Get-ChildItem $outDir -Filter '*-setup.exe' -File)
if ($modernInstallers.Count -ne 1) {
throw "Expected one modern installer, found $($modernInstallers.Count)"
}
$modernName = "Axolotl_Launcher_${version}_x64_modern-setup.exe"
$modernPath = Join-Path $publishDir $modernName
Copy-Item -Force $modernInstallers[0].FullName $modernPath
gh release upload "${{ github.ref_name }}" $modernPath --clobber
$modernSignature = "$($modernInstallers[0].FullName).sig"
if (Test-Path $modernSignature) {
$modernSignaturePath = "$modernPath.sig"
Copy-Item -Force $modernSignature $modernSignaturePath
gh release upload "${{ github.ref_name }}" $modernSignaturePath --clobber
gh release delete-asset "${{ github.ref_name }}" "$($modernInstallers[0].Name).sig" --yes
}
gh release delete-asset "${{ github.ref_name }}" $modernInstallers[0].Name --yes
pnpm --filter @modrinth/app tauri build --config tauri-release.conf.json --config tauri-native.conf.json
$nativeInstallers = @(Get-ChildItem $outDir -Filter '*-setup.exe' -File)
if ($nativeInstallers.Count -ne 1) {
throw "Expected one native NSIS installer, found $($nativeInstallers.Count)"
}
$nativeName = "Axolotl_Launcher_${version}_x64_nsis-setup.exe"
$nativePath = Join-Path $publishDir $nativeName
Copy-Item -Force $nativeInstallers[0].FullName $nativePath
gh release upload "${{ github.ref_name }}" $nativePath --clobber
$nativeSignature = "$($nativeInstallers[0].FullName).sig"
if (Test-Path $nativeSignature) {
$nativeSignaturePath = "$nativePath.sig"
Copy-Item -Force $nativeSignature $nativeSignaturePath
gh release upload "${{ github.ref_name }}" $nativeSignaturePath --clobber
}
# Reuse the binary already built by tauri-action
$appExe = "target/release/${appName}.exe"
if (Test-Path $appExe) {
New-Item -ItemType Directory -Force -Path "$buildDir\Axolotl" | Out-Null
Copy-Item -Force $appExe "$buildDir\Axolotl\"
# Create empty .Axolotl folder to trigger portable mode
New-Item -ItemType Directory -Force -Path "$buildDir\Axolotl\.Axolotl" | Out-Null
# Create portable zip (for manual download)
$zipName = "Axolotl_Launcher_${version}_x64_portable.zip"
$zipPath = Join-Path $publishDir $zipName
Compress-Archive -Path "$buildDir\Axolotl" -DestinationPath $zipPath -Force
Write-Output "Created portable zip: $zipPath"
# Upload portable zip (for manual download only)
gh release upload "${{ github.ref_name }}" "$zipPath" --clobber
} else {
throw "Binary not found at $appExe"
}
verify-and-publish:
name: Verify and publish
needs: build
runs-on: ubuntu-24.04
steps:
- name: Check out source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
ref: main
- name: Download updater signatures
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release download "${GITHUB_REF_NAME}" --pattern '*.sig' --dir release-check/signatures
- name: Download release metadata
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
release_id="$(
gh api "repos/${GITHUB_REPOSITORY}/releases" \
--paginate \
--jq ".[] | select(.tag_name == \"${GITHUB_REF_NAME}\") | .id"
)"
if [[ -z "$release_id" ]]; then
echo "Release ${GITHUB_REF_NAME} was not found"
exit 1
fi
gh api "repos/${GITHUB_REPOSITORY}/releases/${release_id}" > release-check/release.json
- name: Generate update manifest
run: node scripts/axolotl/create-update-manifest.mjs release-check/release.json release-check/signatures "${GITHUB_REF_NAME}" release-check/latest.json
- name: Verify update manifest
run: node scripts/axolotl/verify-update-manifest.mjs release-check/latest.json "${GITHUB_REF_NAME}"
- name: Upload update manifest
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release upload "${GITHUB_REF_NAME}" release-check/latest.json --clobber
- name: Publish release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if [[ "${GITHUB_REF_NAME}" == *-* ]]; then
gh release edit "${GITHUB_REF_NAME}" --draft=false --prerelease
else
gh release edit "${GITHUB_REF_NAME}" --draft=false --latest
fi
- name: Refresh published GitHub release metadata
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
release_id="$(
gh api "repos/${GITHUB_REPOSITORY}/releases" \
--paginate \
--jq ".[] | select(.tag_name == \"${GITHUB_REF_NAME}\") | .id"
)"
if [[ -z "$release_id" ]]; then
echo "Published release ${GITHUB_REF_NAME} was not found"
exit 1
fi
gh api "repos/${GITHUB_REPOSITORY}/releases/${release_id}" > release-check/release.json
- name: Build Update Server artifact catalog
run: |
node scripts/axolotl/create-update-server-catalog.mjs \
release-check/release.json \
"${GITHUB_REF_NAME}" \
release-check/update-server-catalog.json
node scripts/axolotl/create-update-server-catalog.test.mjs
- name: Notify Update Server to publish release assets
env:
UPDATE_SERVER_URL: ${{ secrets.UPDATE_SERVER_URL }}
UPDATE_SERVER_WEBHOOK_SECRET: ${{ secrets.UPDATE_SERVER_WEBHOOK_SECRET }}
UPDATE_SERVER_FORCE_UPDATE: 'false'
run: |
node scripts/axolotl/publish-update-server.mjs \
release-check/update-server-catalog.json \
release-check/release.json \
"${GITHUB_REF_NAME}"
- name: Publish website download metadata
if: ${{ !contains(github.ref_name, '-') }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
node scripts/axolotl/create-website-release-metadata.mjs \
release-check/release.json \
apps/website/releases/latest.json
node scripts/axolotl/create-website-release-catalog.mjs \
apps/website/releases/catalog.json
git config user.name "Axolotl Release Bot"
git config user.email "release@axolotl.local"
git add apps/website/releases/latest.json apps/website/releases/catalog.json
if git diff --cached --quiet; then
echo "Website metadata is unchanged"
else
git commit -m "chore(website): update download metadata to ${GITHUB_REF_NAME} [skip ci]"
git push origin main
fi
- name: Mirror published release to CNB
env:
CNB_REPO_URL_HTTPS: ${{ secrets.CNB_REPO_URL_HTTPS }}
CNB_TOKEN: ${{ secrets.CNB_TOKEN }}
CNB_TOKEN_USER_NAME: ${{ secrets.CNB_TOKEN_USER_NAME }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
if [[ -z "${CNB_TOKEN:-}" ]]; then
echo "CNB_TOKEN is not configured"
exit 1
fi
cnb_url="${CNB_REPO_URL_HTTPS:-https://cnb.cool/axlmc/Axolotl.git}"
token_user="${CNB_TOKEN_USER_NAME:-cnb}"
auth="$(printf '%s:%s' "$token_user" "$CNB_TOKEN" | base64 -w0)"
git_cnb() {
git -c "http.extraHeader=Authorization: Basic $auth" "$@"
}
git fetch origin "refs/tags/${GITHUB_REF_NAME}:refs/tags/${GITHUB_REF_NAME}"
git_cnb push --force "$cnb_url" \
"refs/tags/${GITHUB_REF_NAME}:refs/tags/${GITHUB_REF_NAME}"
node scripts/axolotl/cnb-release.mjs finalize "${GITHUB_REF_NAME}" cnb-release/final
node scripts/axolotl/verify-update-manifest.mjs \
cnb-release/final/latest.json "${GITHUB_REF_NAME}" cnb