Skip to content

feat: add try move trial branches #62

feat: add try move trial branches

feat: add try move trial branches #62

Workflow file for this run

name: Release
on:
push:
tags:
- "v*.*.*"
workflow_dispatch:
inputs:
katago_asset_release_tag:
description: "GoAgent release tag to reuse standard bundled KataGo assets from"
required: false
default: "v0.3.6"
type: string
opencl_katago_asset_repo:
description: "Repository that provides the Windows OpenCL KataGo runtime asset"
required: false
default: "wimi321/lizzieyzy-next"
type: string
opencl_katago_asset_release_tag:
description: "Release tag that provides the Windows OpenCL KataGo runtime asset"
required: false
default: "1.0.0-next-2026-05-02.3"
type: string
opencl_katago_asset_pattern:
description: "Asset pattern for the Windows OpenCL runtime bundle"
required: false
default: "*windows64.opencl.portable.zip"
type: string
nvidia_katago_asset_repo:
description: "Repository that provides the Windows NVIDIA KataGo runtime asset"
required: false
default: "wimi321/lizzieyzy-next"
type: string
nvidia_katago_asset_release_tag:
description: "Release tag that provides the Windows NVIDIA KataGo runtime asset"
required: false
default: "1.0.0-next-2026-05-02.3"
type: string
nvidia_katago_asset_pattern:
description: "Asset pattern for the Windows NVIDIA runtime bundle"
required: false
default: "*windows64.nvidia.portable.zip"
type: string
permissions:
contents: write
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: true
jobs:
release-preflight:
name: Release preflight
runs-on: ubuntu-latest
outputs:
can-package: ${{ steps.katago-assets.outputs.can-package }}
can-package-nvidia: ${{ steps.katago-assets.outputs.can-package-nvidia }}
steps:
- name: Check KataGo asset sources
id: katago-assets
shell: bash
env:
GOAGENT_KATAGO_ASSET_DIR: ${{ secrets.GOAGENT_KATAGO_ASSET_DIR }}
GOAGENT_KATAGO_BINARY: ${{ secrets.GOAGENT_KATAGO_BINARY }}
GOAGENT_KATAGO_MODEL: ${{ secrets.GOAGENT_KATAGO_MODEL }}
GOAGENT_KATAGO_ASSET_RELEASE_TAG: ${{ inputs.katago_asset_release_tag || 'v0.3.6' }}
GOAGENT_OPENCL_KATAGO_ASSET_REPO: ${{ inputs.opencl_katago_asset_repo || 'wimi321/lizzieyzy-next' }}
GOAGENT_OPENCL_KATAGO_ASSET_RELEASE_TAG: ${{ inputs.opencl_katago_asset_release_tag || '1.0.0-next-2026-05-02.3' }}
GOAGENT_OPENCL_KATAGO_ASSET_PATTERN: ${{ inputs.opencl_katago_asset_pattern || '*windows64.opencl.portable.zip' }}
GOAGENT_NVIDIA_KATAGO_ASSET_REPO: ${{ inputs.nvidia_katago_asset_repo || 'wimi321/lizzieyzy-next' }}
GOAGENT_NVIDIA_KATAGO_ASSET_RELEASE_TAG: ${{ inputs.nvidia_katago_asset_release_tag || '1.0.0-next-2026-05-02.3' }}
GOAGENT_NVIDIA_KATAGO_ASSET_PATTERN: ${{ inputs.nvidia_katago_asset_pattern || '*windows64.nvidia.portable.zip' }}
run: |
if [[ -n "${GOAGENT_KATAGO_ASSET_DIR}" || ( -n "${GOAGENT_KATAGO_BINARY}" && -n "${GOAGENT_KATAGO_MODEL}" ) ]]; then
echo "can-package=true" >> "${GITHUB_OUTPUT}"
echo "KataGo standard release asset source is configured."
elif [[ -n "${GOAGENT_KATAGO_ASSET_RELEASE_TAG}" ]]; then
echo "can-package=true" >> "${GITHUB_OUTPUT}"
echo "KataGo standard assets will be restored from configured release sources."
if [[ -n "${GOAGENT_OPENCL_KATAGO_ASSET_REPO}" && -n "${GOAGENT_OPENCL_KATAGO_ASSET_RELEASE_TAG}" && -n "${GOAGENT_OPENCL_KATAGO_ASSET_PATTERN}" ]]; then
echo "Windows OpenCL KataGo assets will be restored from ${GOAGENT_OPENCL_KATAGO_ASSET_REPO}@${GOAGENT_OPENCL_KATAGO_ASSET_RELEASE_TAG}."
fi
else
echo "can-package=false" >> "${GITHUB_OUTPUT}"
echo "::notice title=Release packaging skipped::KataGo standard assets are not configured. Set GOAGENT_KATAGO_ASSET_DIR, both GOAGENT_KATAGO_BINARY and GOAGENT_KATAGO_MODEL, or katago_asset_release_tag to enable automated packaging."
fi
if [[ -n "${GOAGENT_NVIDIA_KATAGO_ASSET_REPO}" && -n "${GOAGENT_NVIDIA_KATAGO_ASSET_RELEASE_TAG}" && -n "${GOAGENT_NVIDIA_KATAGO_ASSET_PATTERN}" ]]; then
echo "can-package-nvidia=true" >> "${GITHUB_OUTPUT}"
echo "KataGo NVIDIA assets will be restored from ${GOAGENT_NVIDIA_KATAGO_ASSET_REPO}@${GOAGENT_NVIDIA_KATAGO_ASSET_RELEASE_TAG}."
else
echo "can-package-nvidia=false" >> "${GITHUB_OUTPUT}"
echo "::notice title=NVIDIA package skipped::Set nvidia_katago_asset_repo, nvidia_katago_asset_release_tag, and nvidia_katago_asset_pattern to publish the Windows NVIDIA edition."
fi
package:
name: Package ${{ matrix.name }}
needs: release-preflight
if: needs.release-preflight.outputs.can-package == 'true'
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: macOS
os: macos-latest
command: pnpm dist:mac
- name: Windows
os: windows-latest
command: pnpm dist:win
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.30.3
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- name: Setup Python for Kokoro zh G2P
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install Linux package dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y libarchive-tools
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install Kokoro zh G2P Python dependencies
run: python -m pip install -r scripts/requirements-tts.txt
- name: Typecheck
run: pnpm typecheck
- name: Prepare Kokoro TTS assets
shell: bash
env:
GOAGENT_TTS_ASSETS_STRICT: "1"
GOAGENT_TTS_SMOKE_STRICT: "1"
GOAGENT_TTS_PYTHON: python
run: |
pnpm prepare:tts-assets
pnpm check:tts-assets
pnpm smoke:tts
- name: Prepare KataGo assets
shell: bash
env:
GH_TOKEN: ${{ github.token }}
GOAGENT_KATAGO_ASSET_DIR: ${{ secrets.GOAGENT_KATAGO_ASSET_DIR }}
GOAGENT_KATAGO_BINARY: ${{ secrets.GOAGENT_KATAGO_BINARY }}
GOAGENT_KATAGO_MODEL: ${{ secrets.GOAGENT_KATAGO_MODEL }}
GOAGENT_KATAGO_ASSET_RELEASE_TAG: ${{ inputs.katago_asset_release_tag || 'v0.3.6' }}
GOAGENT_OPENCL_KATAGO_ASSET_REPO: ${{ inputs.opencl_katago_asset_repo || 'wimi321/lizzieyzy-next' }}
GOAGENT_OPENCL_KATAGO_ASSET_RELEASE_TAG: ${{ inputs.opencl_katago_asset_release_tag || '1.0.0-next-2026-05-02.3' }}
GOAGENT_OPENCL_KATAGO_ASSET_PATTERN: ${{ inputs.opencl_katago_asset_pattern || '*windows64.opencl.portable.zip' }}
run: |
if [[ -n "${GOAGENT_KATAGO_ASSET_DIR}" || ( -n "${GOAGENT_KATAGO_BINARY}" && -n "${GOAGENT_KATAGO_MODEL}" ) ]]; then
if [[ "${RUNNER_OS}" == "macOS" && -n "${GOAGENT_KATAGO_ASSET_DIR}" ]]; then
node scripts/prepare_katago_assets.mjs --asset-dir="${GOAGENT_KATAGO_ASSET_DIR}" --platform=darwin-arm64 --flavor=standard --source-label="manual release asset source"
node scripts/prepare_katago_assets.mjs --asset-dir="${GOAGENT_KATAGO_ASSET_DIR}" --platform=darwin-x64 --flavor=standard --source-label="manual release asset source"
else
node scripts/prepare_katago_assets.mjs --flavor=standard --source-label="manual release asset source"
fi
elif [[ "${RUNNER_OS}" == "macOS" ]]; then
prepare_macos_asset() {
local target="$1"
local repo="$2"
local tag="$3"
local pattern="$4"
local mode="$5"
local source_dir=".katago-asset-source/${target}-${mode}"
local mount_point=".katago-asset-source/mounts/${target}-${mode}"
mkdir -p "${source_dir}" "${mount_point}"
gh release download "${tag}" \
--repo "${repo}" \
--pattern "${pattern}" \
--dir "${source_dir}" || return 1
asset_dmg="$(find "${source_dir}" -maxdepth 1 -name "${pattern}" | head -n 1)"
if [[ -z "${asset_dmg}" ]]; then
echo "No macOS KataGo asset matched ${pattern}" >&2
return 1
fi
hdiutil attach -nobrowse -quiet "${asset_dmg}" -mountpoint "${mount_point}" || return 1
if [[ "${mode}" == "scan" ]]; then
node scripts/prepare_katago_assets.mjs --asset-dir="${mount_point}" --platform="${target}" --scan --copy-runtime-dir --preserve-model-name --flavor=standard --source-label="${repo}@${tag}:${pattern}"
else
asset_dir="$(find "${mount_point}" -path '*/Contents/Resources/data/katago' -type d | head -n 1)"
if [[ -z "${asset_dir}" ]]; then
hdiutil detach "${mount_point}" -quiet || true
echo "Mounted ${asset_dmg} did not contain Contents/Resources/data/katago" >&2
return 1
fi
if [[ ! -f "${asset_dir}/bin/${target}/katago" ]]; then
hdiutil detach "${mount_point}" -quiet || true
echo "Mounted ${asset_dmg} does not contain bin/${target}/katago" >&2
return 2
fi
node scripts/prepare_katago_assets.mjs --asset-dir="${asset_dir}" --platform="${target}" --flavor=standard --source-label="${repo}@${tag}:${pattern}"
fi
hdiutil detach "${mount_point}" -quiet
}
echo "Restoring macOS KataGo runtimes from lizzieyzy-next."
prepare_macos_asset darwin-arm64 "wimi321/lizzieyzy-next" "1.0.0-next-2026-05-02.3" "*mac-apple-silicon.with-katago.dmg" scan
prepare_macos_asset darwin-x64 "wimi321/lizzieyzy-next" "1.0.0-next-2026-05-02.3" "*mac-intel.with-katago.dmg" scan
else
if [[ -n "${GOAGENT_OPENCL_KATAGO_ASSET_REPO}" && -n "${GOAGENT_OPENCL_KATAGO_ASSET_RELEASE_TAG}" && -n "${GOAGENT_OPENCL_KATAGO_ASSET_PATTERN}" ]]; then
mkdir -p .katago-opencl-source/extracted
gh release download "${GOAGENT_OPENCL_KATAGO_ASSET_RELEASE_TAG}" \
--repo "${GOAGENT_OPENCL_KATAGO_ASSET_REPO}" \
--pattern "${GOAGENT_OPENCL_KATAGO_ASSET_PATTERN}" \
--dir .katago-opencl-source
asset_archive="$(find .katago-opencl-source -maxdepth 1 -type f | head -n 1)"
if [[ -z "${asset_archive}" ]]; then
echo "No Windows OpenCL KataGo asset matched ${GOAGENT_OPENCL_KATAGO_ASSET_PATTERN}" >&2
exit 1
fi
if [[ "${RUNNER_OS}" == "Windows" ]] && command -v 7z >/dev/null 2>&1; then
7z x "${asset_archive}" -o.katago-opencl-source/extracted
elif command -v unzip >/dev/null 2>&1; then
unzip -q "${asset_archive}" -d .katago-opencl-source/extracted
elif command -v 7z >/dev/null 2>&1; then
7z x "${asset_archive}" -o.katago-opencl-source/extracted
else
powershell -NoProfile -Command "Expand-Archive -LiteralPath '${asset_archive}' -DestinationPath '.katago-opencl-source/extracted'"
fi
node scripts/prepare_katago_assets.mjs \
--asset-dir=".katago-opencl-source/extracted" \
--platform=win32-x64 \
--scan \
--copy-runtime-dir \
--preserve-model-name \
--flavor=opencl \
--source-label="${GOAGENT_OPENCL_KATAGO_ASSET_REPO}@${GOAGENT_OPENCL_KATAGO_ASSET_RELEASE_TAG}:${GOAGENT_OPENCL_KATAGO_ASSET_PATTERN}"
else
mkdir -p .katago-asset-source/extracted
gh release download "${GOAGENT_KATAGO_ASSET_RELEASE_TAG}" \
--repo "${{ github.repository }}" \
--pattern "GoAgent-*-win-x64-portable.zip" \
--dir .katago-asset-source
asset_zip="$(find .katago-asset-source -maxdepth 1 -name 'GoAgent-*-win-x64-portable.zip' | head -n 1)"
if command -v unzip >/dev/null 2>&1; then
unzip -q "${asset_zip}" -d .katago-asset-source/extracted
elif command -v 7z >/dev/null 2>&1; then
7z x "${asset_zip}" -o.katago-asset-source/extracted
else
powershell -NoProfile -Command "Expand-Archive -LiteralPath '${asset_zip}' -DestinationPath '.katago-asset-source/extracted'"
fi
node scripts/prepare_katago_assets.mjs --asset-dir=".katago-asset-source/extracted/resources/data/katago" --flavor=standard --source-label="${{ github.repository }}@${GOAGENT_KATAGO_ASSET_RELEASE_TAG}"
fi
fi
if [[ "${RUNNER_OS}" == "macOS" ]]; then
node scripts/check_katago_assets.mjs --mode=release --platform=darwin-arm64
node scripts/check_katago_assets.mjs --mode=release --platform=darwin-x64
else
node scripts/check_katago_assets.mjs --mode=release
fi
- name: Bundle zhizi b28 model
shell: bash
env:
ZHIZI_B28_URL: https://media.katagotraining.org/uploaded/networks/models/kata1/kata1-zhizi-b28c512nbt-muonfd2.bin.gz
ZHIZI_B28_FILENAME: kata1-zhizi-b28c512nbt-muonfd2.bin.gz
run: |
mkdir -p data/katago/models
target="data/katago/models/${ZHIZI_B28_FILENAME}"
if [[ -f "${target}" ]]; then
echo "zhizi b28 already present, skipping download"
else
echo "Downloading zhizi b28 from ${ZHIZI_B28_URL}"
curl -fsSL --retry 3 --retry-delay 5 "${ZHIZI_B28_URL}" -o "${target}"
fi
node scripts/select_default_katago_model.mjs \
--model="${target}" \
--id=official-b28-strong \
--display-name="KataGo zhizi b28 Official Strongest" \
--prune
- name: Package desktop app
shell: bash
env:
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
CSC_IDENTITY_AUTO_DISCOVERY: ${{ secrets.CSC_LINK != '' && 'true' || 'false' }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_KEYCHAIN: ${{ secrets.APPLE_KEYCHAIN }}
APPLE_KEYCHAIN_PROFILE: ${{ secrets.APPLE_KEYCHAIN_PROFILE }}
run: |
for name in \
CSC_LINK \
CSC_KEY_PASSWORD \
WIN_CSC_LINK \
WIN_CSC_KEY_PASSWORD \
APPLE_API_KEY \
APPLE_API_KEY_ID \
APPLE_API_ISSUER \
APPLE_ID \
APPLE_APP_SPECIFIC_PASSWORD \
APPLE_TEAM_ID \
APPLE_KEYCHAIN \
APPLE_KEYCHAIN_PROFILE
do
if [[ -z "${!name:-}" ]]; then
unset "${name}"
fi
done
if [[ "${RUNNER_OS}" == "macOS" && -z "${CSC_LINK:-}" ]]; then
export CSC_IDENTITY_AUTO_DISCOVERY=false
fi
${{ matrix.command }}
- name: Upload packaged artifacts
uses: actions/upload-artifact@v4
with:
name: GoAgent-${{ matrix.name }}
path: |
release/**/*.AppImage
release/**/*.deb
release/**/*.dmg
release/**/*.exe
release/**/*.zip
release/**/*.tar.gz
release/**/*.yml
if-no-files-found: error
package-lite:
name: Package Lite ${{ matrix.name }}
needs: release-preflight
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: macOS
os: macos-latest
command: pnpm dist:lite:mac
- name: Windows
os: windows-latest
command: pnpm dist:lite:win
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.30.3
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- name: Setup Python for Kokoro zh G2P
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install Kokoro zh G2P Python dependencies
run: python -m pip install -r scripts/requirements-tts.txt
- name: Typecheck
run: pnpm typecheck
- name: Prepare Kokoro TTS assets
shell: bash
env:
GOAGENT_TTS_ASSETS_STRICT: "1"
GOAGENT_TTS_SMOKE_STRICT: "1"
GOAGENT_TTS_PYTHON: python
run: |
pnpm prepare:tts-assets
pnpm check:tts-assets
pnpm smoke:tts
- name: Package Lite desktop app
shell: bash
env:
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
CSC_IDENTITY_AUTO_DISCOVERY: ${{ secrets.CSC_LINK != '' && 'true' || 'false' }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_KEYCHAIN: ${{ secrets.APPLE_KEYCHAIN }}
APPLE_KEYCHAIN_PROFILE: ${{ secrets.APPLE_KEYCHAIN_PROFILE }}
run: |
for name in \
CSC_LINK \
CSC_KEY_PASSWORD \
WIN_CSC_LINK \
WIN_CSC_KEY_PASSWORD \
APPLE_API_KEY \
APPLE_API_KEY_ID \
APPLE_API_ISSUER \
APPLE_ID \
APPLE_APP_SPECIFIC_PASSWORD \
APPLE_TEAM_ID \
APPLE_KEYCHAIN \
APPLE_KEYCHAIN_PROFILE
do
if [[ -z "${!name:-}" ]]; then
unset "${name}"
fi
done
if [[ "${RUNNER_OS}" == "macOS" && -z "${CSC_LINK:-}" ]]; then
export CSC_IDENTITY_AUTO_DISCOVERY=false
fi
${{ matrix.command }}
- name: Upload Lite packaged artifacts
uses: actions/upload-artifact@v4
with:
name: GoAgent-Lite-${{ matrix.name }}
path: |
release/**/*-lite.AppImage
release/**/*-lite.deb
release/**/*-lite.dmg
release/**/*-lite.exe
release/**/*-lite-portable.zip
release/**/*-lite.tar.gz
release/**/*.yml
if-no-files-found: error
package-nvidia-windows:
name: Package Windows NVIDIA
needs: release-preflight
if: needs.release-preflight.outputs.can-package == 'true' && needs.release-preflight.outputs.can-package-nvidia == 'true'
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.30.3
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- name: Setup Python for Kokoro zh G2P
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install Kokoro zh G2P Python dependencies
run: python -m pip install -r scripts/requirements-tts.txt
- name: Typecheck
run: pnpm typecheck
- name: Prepare Kokoro TTS assets
shell: bash
env:
GOAGENT_TTS_ASSETS_STRICT: "1"
GOAGENT_TTS_SMOKE_STRICT: "1"
GOAGENT_TTS_PYTHON: python
run: |
pnpm prepare:tts-assets
pnpm check:tts-assets
pnpm smoke:tts
- name: Prepare NVIDIA KataGo assets
shell: bash
env:
GH_TOKEN: ${{ github.token }}
GOAGENT_NVIDIA_KATAGO_ASSET_REPO: ${{ inputs.nvidia_katago_asset_repo || 'wimi321/lizzieyzy-next' }}
GOAGENT_NVIDIA_KATAGO_ASSET_RELEASE_TAG: ${{ inputs.nvidia_katago_asset_release_tag || '1.0.0-next-2026-05-02.3' }}
GOAGENT_NVIDIA_KATAGO_ASSET_PATTERN: ${{ inputs.nvidia_katago_asset_pattern || '*windows64.nvidia.portable.zip' }}
run: |
mkdir -p .katago-nvidia-source/extracted
gh release download "${GOAGENT_NVIDIA_KATAGO_ASSET_RELEASE_TAG}" \
--repo "${GOAGENT_NVIDIA_KATAGO_ASSET_REPO}" \
--pattern "${GOAGENT_NVIDIA_KATAGO_ASSET_PATTERN}" \
--dir .katago-nvidia-source
asset_archive="$(find .katago-nvidia-source -maxdepth 1 -type f | head -n 1)"
if [[ -z "${asset_archive}" ]]; then
echo "No NVIDIA KataGo asset matched ${GOAGENT_NVIDIA_KATAGO_ASSET_PATTERN}" >&2
exit 1
fi
case "${asset_archive}" in
*.zip)
if [[ "${RUNNER_OS}" == "Windows" ]] && command -v 7z >/dev/null 2>&1; then
7z x "${asset_archive}" -o.katago-nvidia-source/extracted
elif command -v unzip >/dev/null 2>&1; then
unzip -q "${asset_archive}" -d .katago-nvidia-source/extracted
elif command -v 7z >/dev/null 2>&1; then
7z x "${asset_archive}" -o.katago-nvidia-source/extracted
else
powershell -NoProfile -Command "Expand-Archive -LiteralPath '${asset_archive}' -DestinationPath '.katago-nvidia-source/extracted'"
fi
;;
*.tar.gz|*.tgz)
tar -xzf "${asset_archive}" -C .katago-nvidia-source/extracted
;;
*)
if command -v 7z >/dev/null 2>&1; then
7z x "${asset_archive}" -o.katago-nvidia-source/extracted
else
echo "Unsupported NVIDIA asset archive: ${asset_archive}" >&2
exit 1
fi
;;
esac
node scripts/prepare_katago_assets.mjs \
--asset-dir=".katago-nvidia-source/extracted" \
--platform=win32-x64 \
--scan \
--copy-runtime-dir \
--preserve-model-name \
--flavor=nvidia \
--source-label="${GOAGENT_NVIDIA_KATAGO_ASSET_REPO}@${GOAGENT_NVIDIA_KATAGO_ASSET_RELEASE_TAG}:${GOAGENT_NVIDIA_KATAGO_ASSET_PATTERN}"
node scripts/check_katago_assets.mjs --mode=release --platform=win32-x64
- name: Bundle zhizi b28 model (NVIDIA)
shell: bash
env:
ZHIZI_B28_URL: https://media.katagotraining.org/uploaded/networks/models/kata1/kata1-zhizi-b28c512nbt-muonfd2.bin.gz
ZHIZI_B28_FILENAME: kata1-zhizi-b28c512nbt-muonfd2.bin.gz
run: |
mkdir -p data/katago/models
target="data/katago/models/${ZHIZI_B28_FILENAME}"
if [[ -f "${target}" ]]; then
echo "zhizi b28 already present, skipping download"
else
echo "Downloading zhizi b28 from ${ZHIZI_B28_URL}"
curl -fsSL --retry 3 --retry-delay 5 "${ZHIZI_B28_URL}" -o "${target}"
fi
node scripts/select_default_katago_model.mjs \
--model="${target}" \
--id=official-b28-strong \
--display-name="KataGo zhizi b28 Official Strongest" \
--prune
- name: Package NVIDIA desktop app
shell: bash
env:
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
CSC_IDENTITY_AUTO_DISCOVERY: "false"
run: |
for name in WIN_CSC_LINK WIN_CSC_KEY_PASSWORD; do
if [[ -z "${!name:-}" ]]; then
unset "${name}"
fi
done
pnpm build
pnpm exec electron-builder --win nsis --publish never
- name: Rename NVIDIA artifacts
shell: pwsh
run: |
$version = node -p "JSON.parse(require('fs').readFileSync('package.json','utf8')).version"
$releaseDir = Join-Path "release" $version
$installer = Get-ChildItem -Path $releaseDir -Filter "GoAgent-$version-win-x64.exe" -File | Select-Object -First 1
$unpackedDir = Join-Path $releaseDir "win-unpacked"
if (-not $installer) { throw "Missing NVIDIA installer EXE before rename." }
if (-not (Test-Path $unpackedDir)) { throw "Missing win-unpacked directory for NVIDIA portable recompression." }
Push-Location $releaseDir
& 7z a -t7z -m0=LZMA2 -mx=5 -mmt=on -v1900m "GoAgent-$version-win-x64-nvidia-portable.7z" ".\win-unpacked\*" | Out-Host
Pop-Location
Rename-Item -LiteralPath $installer.FullName -NewName "GoAgent-$version-win-x64-nvidia.exe" -Force
$nvidiaPortableParts = Get-ChildItem -Path $releaseDir -Filter "GoAgent-$version-win-x64-nvidia-portable.7z.*" -File | Sort-Object Name
$nvidiaInstaller = Get-Item (Join-Path $releaseDir "GoAgent-$version-win-x64-nvidia.exe")
if (-not $nvidiaPortableParts) { throw "Missing NVIDIA portable split 7z parts after recompression." }
$nvidiaPortableTotal = ($nvidiaPortableParts | Measure-Object -Property Length -Sum).Sum
Write-Host "NVIDIA portable split 7z parts: $($nvidiaPortableParts.Count)"
Write-Host "NVIDIA portable split 7z total bytes: $nvidiaPortableTotal"
Write-Host "NVIDIA installer EXE bytes: $($nvidiaInstaller.Length)"
foreach ($part in $nvidiaPortableParts) {
Write-Host "NVIDIA portable part bytes: $($part.Name) $($part.Length)"
if ($part.Length -ge 2147483648) {
throw "NVIDIA portable split archive part exceeds GitHub's 2 GiB asset limit: $($part.Name) $($part.Length)"
}
}
- name: Upload NVIDIA packaged artifacts
uses: actions/upload-artifact@v4
with:
name: GoAgent-Windows-NVIDIA
path: |
release/**/*nvidia*.exe
release/**/*nvidia*.7z*
if-no-files-found: error
github-release:
name: Publish GitHub Release
needs:
- release-preflight
- package
- package-lite
- package-nvidia-windows
runs-on: ubuntu-latest
if: always() && needs.release-preflight.outputs.can-package == 'true' && needs.release-preflight.outputs.can-package-nvidia == 'true' && needs.package.result == 'success' && needs.package-lite.result == 'success' && needs.package-nvidia-windows.result == 'success' && startsWith(github.ref, 'refs/tags/')
steps:
- name: Checkout release notes
uses: actions/checkout@v4
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
merge-multiple: true
- name: Generate checksums
shell: bash
run: |
shopt -s globstar nullglob
files=(
artifacts/**/GoAgent-*-mac-arm64.dmg
artifacts/**/GoAgent-*-mac-x64.dmg
artifacts/**/GoAgent-*-mac-arm64-lite.dmg
artifacts/**/GoAgent-*-mac-x64-lite.dmg
artifacts/**/GoAgent-*-win-x64-lite-portable.zip
artifacts/**/GoAgent-*-win-x64-lite.exe
artifacts/**/GoAgent-*-win-x64-portable.zip
artifacts/**/GoAgent-*-win-x64.exe
artifacts/**/GoAgent-*-win-x64-nvidia-portable.7z*
artifacts/**/GoAgent-*-win-x64-nvidia.exe
)
if [[ ${#files[@]} -eq 0 ]]; then
echo "No release assets found for checksum generation." >&2
exit 1
fi
sha256sum "${files[@]}" | sed 's# .*/# #' > artifacts/SHA256SUMS.txt
- name: Create release
uses: softprops/action-gh-release@v2
with:
prerelease: ${{ contains(github.ref_name, '-') }}
make_latest: ${{ contains(github.ref_name, '-') && 'false' || 'true' }}
files: |
artifacts/**/GoAgent-*-mac-arm64.dmg
artifacts/**/GoAgent-*-mac-x64.dmg
artifacts/**/GoAgent-*-mac-arm64-lite.dmg
artifacts/**/GoAgent-*-mac-x64-lite.dmg
artifacts/**/GoAgent-*-win-x64-lite-portable.zip
artifacts/**/GoAgent-*-win-x64-lite.exe
artifacts/**/GoAgent-*-win-x64-portable.zip
artifacts/**/GoAgent-*-win-x64.exe
artifacts/**/GoAgent-*-win-x64-nvidia-portable.7z*
artifacts/**/GoAgent-*-win-x64-nvidia.exe
artifacts/SHA256SUMS.txt
body_path: docs/RELEASE_NOTES_${{ github.ref_name }}.md