Skip to content

BetterGI Publish

BetterGI Publish #22

Workflow file for this run

name: BetterGI Publish
on:
workflow_dispatch:
inputs:
version:
description: 'BetterGI Version (eg: 0.35.1, 0.36.5-alpha.1)'
required: true
type: string
kachina-channel:
type: choice
description: 'Kachina Installer Channel'
required: true
default: 'release'
options:
- release
- dev
create-release:
type: boolean
description: '创建 GitHub Release 草稿'
required: true
default: false
jobs:
# Add validation job to check version format
validate:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.set-version.outputs.version }}
steps:
- name: Set version from input or tag
id: set-version
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
# Validate manual input version format
if ! [[ "${{ github.event.inputs.version }}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$ ]]; then
echo "❌ 错误:版本格式必须符合语义化版本规范 (例如: 1.2.3, 1.2.3-alpha, 1.2.3+build.123)"
exit 1
fi
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
echo "✨ 手动触发构建,版本号:${{ github.event.inputs.version }}"
else
# Extract version from tag name (remove 'v' prefix)
VERSION=${GITHUB_REF#refs/tags/v}
echo "version=${VERSION}" >> $GITHUB_OUTPUT
echo "🏷️ 从 tag 触发构建,版本号:${VERSION}"
fi
build_web_map_editor:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
repository: huiyadanli/bettergi-map
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- run: npm install
- run: npm run build:single
- uses: actions/upload-artifact@v4
with:
name: web_map_editor
path: dist/
build_web_scripts_list:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
repository: huiyadanli/bettergi-scripts-web
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- run: npm install
- run: npm run build:single
- uses: actions/upload-artifact@v4
with:
name: web_scripts_list
path: dist/
build_dist:
runs-on: windows-latest
needs: [validate, build_web_map_editor, build_web_scripts_list]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.x
- name: 更新 csproj 文件版本号
run: |
$version = '${{ needs.validate.outputs.version }}'
(Get-Content BetterGenshinImpact/BetterGenshinImpact.csproj) -replace '<Version>.*</Version>', "<Version>$version</Version>" | Set-Content BetterGenshinImpact/BetterGenshinImpact.csproj
- name: 自动提交更改
if: github.repository_owner == 'babalae'
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "Update version to ${{ needs.validate.outputs.version }}"
branch: main
file_pattern: BetterGenshinImpact/BetterGenshinImpact.csproj
- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/BetterGenshinImpact.csproj') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: 🛠️ Build application
run: dotnet publish BetterGenshinImpact/BetterGenshinImpact.csproj -c Release -p:PublishProfile=FolderProfile -p:Version=${{ needs.validate.outputs.version }}
continue-on-error: true
- name: 🧹 Clear & Move Files
run: |
$sourceDir = ".\BetterGenshinImpact\bin\x64\Release\net8.0-windows10.0.22621.0\publish\win-x64"
Get-ChildItem -Path $sourceDir -Recurse -Filter "*.lib" | Remove-Item -Force
Get-ChildItem -Path $sourceDir -Recurse -Filter "*ffmpeg*.dll" | Remove-Item -Force
Get-ChildItem -Path $sourceDir -Recurse -Filter "*.pdb" | Remove-Item -Force
New-Item -Path "dist/BetterGI" -ItemType Directory
xcopy "$sourceDir\*" ".\dist\BetterGI\" /E /H /I /Y
# 下载前面构建好的web内容
- uses: actions/download-artifact@v4
with:
name: web_map_editor
path: dist/BetterGI/Assets/Map/Editor
- uses: actions/download-artifact@v4
with:
name: web_scripts_list
path: dist/BetterGI/Assets/Web/ScriptRepo
# 下载构建 repo 的内容补充数据
- uses: actions/checkout@v4
with:
repository: babalae/bettergi-publish
path: publish
- name: 🗜️ Extract Map
run: |
cd publish
# Extract zst files
Get-ChildItem -Filter *.zst | ForEach-Object {
if ($_.PSIsContainer -eq $false) {
$file = $_.Name
$output_file = "..\dist\BetterGI\Assets\Map\$($file -replace '.zst$', '')"
& zstd -d $file -o $output_file
Write-Host "$file -> $output_file"
}
}
# Extract zip files
Get-ChildItem -Filter *.zip | ForEach-Object {
if ($_.PSIsContainer -eq $false) {
$file = $_.FullName
$destination = "..\dist\BetterGI\Assets\Map"
Expand-Archive -Path $file -DestinationPath $destination -Force
Write-Host "$file -> $destination"
}
}
# 生成更新器
- name: 📥 Download kachina-builder release
if: ${{ github.event.inputs.kachina-channel == 'release' }}
uses: robinraju/release-downloader@v1.8
with:
repository: "YuehaiTeam/kachina-installer"
latest: true
fileName: "kachina-builder.exe"
- name: 📥 Download kachina-builder dev
if: ${{ github.event.inputs.kachina-channel == 'dev' }}
uses: dawidd6/action-download-artifact@v8
with:
github_token: ${{secrets.GITHUB_TOKEN}}
repo: "YuehaiTeam/kachina-installer"
workflow: "build.yml"
name: artifact
branch: main
event: push
workflow_conclusion: success
- name: 📦 Gen Updater by kachina-builder
run: |
cd dist
..\kachina-builder.exe pack -c ..\Build\kachina.config.json -o BetterGI/BetterGI.update.exe
# 打包上传
- name: 📦 Generate archive
run: |
cd dist
7z a "BetterGI_v${{ needs.validate.outputs.version }}.7z" BetterGI -t7z -mx=5 -mf=BCJ2 -r -y
- uses: actions/upload-artifact@v4
with:
name: BetterGI_7z
path: dist/BetterGI_*.7z
build_installer:
runs-on: windows-latest
needs: [validate, build_dist]
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: BetterGI_7z
path: dist
- name: Unpack BetterGI_*.7z
run: |
cd dist
7z x "BetterGI_v${{ needs.validate.outputs.version }}.7z"
- name: 📥 Download kachina-builder release
if: ${{ github.event.inputs.kachina-channel == 'release' }}
uses: robinraju/release-downloader@v1.8
with:
repository: "YuehaiTeam/kachina-installer"
latest: true
fileName: "kachina-builder.exe"
- name: 📥 Download kachina-builder dev
if: ${{ github.event.inputs.kachina-channel == 'dev' }}
uses: dawidd6/action-download-artifact@v8
with:
github_token: ${{secrets.GITHUB_TOKEN}}
repo: "YuehaiTeam/kachina-installer"
workflow: "build.yml"
name: artifact
branch: main
event: push
workflow_conclusion: success
- name: 📥 Download last release
uses: robinraju/release-downloader@v1.8
with:
repository: "babalae/better-genshin-impact"
latest: true
fileName: "BetterGI_v*.7z"
out-file-path: 'last'
- name: 📥 Get 2nd and 3rd release
id: release_tags
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$releasesUrl = "https://api.github.com/repos/babalae/better-genshin-impact/releases"
$headers = @{
"Authorization" = "Bearer $env:GITHUB_TOKEN"
"Accept" = "application/vnd.github.v3+json"
}
$releases = Invoke-RestMethod -Uri $releasesUrl -Headers $headers -Method Get
$validReleases = $releases |
Where-Object { -not $_.draft -and -not $_.prerelease } |
Sort-Object { [DateTime]$_.published_at } -Descending
if ($validReleases.Count -lt 3) {
Write-Error "至少需要 3 个正式 Release(当前找到 $($validReleases.Count) 个)"
exit 1
}
"second_release_tag=$($validReleases[1].tag_name)" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
"third_release_tag=$($validReleases[2].tag_name)" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
- name: 📥 Download 2nd last release
uses: robinraju/release-downloader@v1.8
with:
repository: "babalae/better-genshin-impact"
tag: ${{ steps.release_tags.outputs.second_release_tag }}
fileName: "BetterGI_v*.7z"
out-file-path: '2nd'
- name: 📥 Download 3rd last release
uses: robinraju/release-downloader@v1.8
with:
repository: "babalae/better-genshin-impact"
tag: ${{ steps.release_tags.outputs.third_release_tag }}
fileName: "BetterGI_v*.7z"
out-file-path: '3rd'
- name: Unpack releases
run: |
cd last
7z x "BetterGI*.7z" -otemp
if (Test-Path -Path ".\temp\BetterGI" -PathType Container) {
Move-Item -Path ".\temp\BetterGI" -Destination ".\BetterGI"
} else {
Rename-Item -Path ".\temp" -NewName ".\BetterGI"
}
cd ..
cd 2nd
7z x "BetterGI*.7z" -otemp
if (Test-Path -Path ".\temp\BetterGI" -PathType Container) {
Move-Item -Path ".\temp\BetterGI" -Destination ".\BetterGI"
} else {
Rename-Item -Path ".\temp" -NewName ".\BetterGI"
}
cd ..
cd 3rd
7z x "BetterGI*.7z" -otemp
if (Test-Path -Path ".\temp\BetterGI" -PathType Container) {
Move-Item -Path ".\temp\BetterGI" -Destination ".\BetterGI"
} else {
Rename-Item -Path ".\temp" -NewName ".\BetterGI"
}
cd ..
ls .\last
ls .\2nd
ls .\3rd
- name: 📦 Pack kachina-builder
run: |
cd dist
..\kachina-builder.exe gen -j 6 -i BetterGI -m metadata.json -o hashed -r babalae/bettergi -t ${{ needs.validate.outputs.version }} --diff-vers ..\last\BetterGI --diff-vers ..\2nd\BetterGI --diff-vers ..\3rd\BetterGI --diff-ignore *[.txt,.onnx] -u .\BetterGI\BetterGI.update.exe
..\kachina-builder.exe pack -c ../Build/kachina.config.json -m metadata.json -d hashed -o BetterGI.Install.${{ needs.validate.outputs.version }}.exe
- uses: actions/upload-artifact@v4
with:
name: BetterGI_Install
path: dist/BetterGI.Install.*.exe
- uses: actions/upload-artifact@v4
with:
name: BetterGI_Metadata
path: dist/metadata.json
build_setup:
runs-on: windows-latest
needs: [validate, build_dist]
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: BetterGI_7z
path: dist
- name: Unpack BetterGI_*.7z & Repack
run: |
cd dist
7z x "BetterGI_v${{ needs.validate.outputs.version }}.7z"
cd BetterGI
7z a -t7z "..\..\publish.7z" *
- name: 📥 Download MicaSetup
uses: robinraju/release-downloader@v1.8
with:
repository: "lemutec/MicaSetup"
latest: true
fileName: "MicaSetup_v*.7z"
- name: 📦 Pack MicaSetup
run: |
$archiveFiles = Get-ChildItem -Path . -Filter "MicaSetup_v*.7z"
foreach ($archive in $archiveFiles) {
& 7z x $archive.FullName
}
Copy-Item -Path "Build\micasetup.json" -Destination "."
Copy-Item -Path "Build\micasetup" -Destination "." -Recurse -Force
.\makemica.exe micasetup.json
ren BetterGI_Setup.exe BetterGI_Setup_v${{ needs.validate.outputs.version }}.exe
- uses: actions/upload-artifact@v4
with:
name: BetterGI_Setup
path: BetterGI_Setup*.exe
# 创建 GitHub Release
create_release:
if: github.event.inputs.create-release == 'true'
needs: [validate, build_dist, build_installer]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
path: artifacts
- name: Append Metadata
shell: bash
run: |
mv artifacts/BetterGI_Metadata/metadata.json artifacts/BetterGI_Metadata/BetterGI_Metadata.json
- name: Create Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ needs.validate.outputs.version }}
name: BetterGI v${{ needs.validate.outputs.version }}
draft: true
prerelease: ${{ contains(needs.validate.outputs.version, '-') }}
fail_on_unmatched_files: true
files: |
artifacts/BetterGI_7z/*.7z
artifacts/BetterGI_Install/*.exe
artifacts/BetterGI_Metadata/*.json
mirrorchyan_uploading:
if: github.repository_owner == 'babalae' && contains(needs.validate.outputs.version, '-')
needs: [validate, build_dist, build_installer]
runs-on: macos-latest
steps:
- uses: actions/download-artifact@v4
with:
path: downloads
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Extract 7z
shell: bash
run: |
cd downloads/BetterGI_7z
7z x BetterGI_v*.7z -oun7z
mv ../BetterGI_Metadata/metadata.json ./un7z/BetterGI/.metadata.json
- name: Upload Zip
uses: MirrorChyan/uploading-action@v1
with:
filetype: local
mirrorchyan_rid: BGI
working-directory: downloads/BetterGI_7z/un7z/
pick_files: '["BetterGI"]'
version_name: ${{ needs.validate.outputs.version }}
upload_token: ${{ secrets.MirrorChyanUploadToken }}
os: win
arch: x64
- name: Upload Install.exe
uses: MirrorChyan/uploading-action@v1
with:
filetype: local
mirrorchyan_rid: BGI
working-directory: downloads/BetterGI_Install/
filename: "BetterGI.Install.*.exe"
extra_zip: true
version_name: ${{ needs.validate.outputs.version }}
upload_token: ${{ secrets.MirrorChyanUploadToken }}