Skip to content

refactor(core): move internal logic to MessageParsingContext [skip … #103

refactor(core): move internal logic to MessageParsingContext [skip …

refactor(core): move internal logic to MessageParsingContext [skip … #103

Workflow file for this run

name: Build Yogurt Executables
on:
push:
branches:
- main
paths-ignore:
- '.devin/**'
- 'kotlin-js-store/**'
- 'packages/core/**'
- 'packages/docs/**'
- '**.md'
workflow_dispatch:
permissions:
id-token: write
contents: write
jobs:
build-native:
if: contains(github.event.head_commit.message, '[skip build]') == false
runs-on: ${{ matrix.runs-on }}
strategy:
matrix:
include:
- runs-on: ubuntu-latest
target: mingwX64
gradle-target: MingwX64
platform: windows-x64
ext: .exe
dynamic-lib-prefix: ''
dynamic-lib-ext: .dll
- runs-on: macos-latest
target: macosX64
gradle-target: MacosX64
platform: macos-x64
ext: .kexe
dynamic-lib-prefix: lib
dynamic-lib-ext: .dylib
- runs-on: macos-latest
target: macosArm64
gradle-target: MacosArm64
platform: macos-arm64
ext: .kexe
dynamic-lib-prefix: lib
dynamic-lib-ext: .dylib
- runs-on: ubuntu-latest
target: linuxX64
gradle-target: LinuxX64
platform: linux-x64
ext: .kexe
dynamic-lib-prefix: lib
dynamic-lib-ext: .so
- runs-on: ubuntu-latest
target: linuxArm64
gradle-target: LinuxArm64
platform: linux-arm64
ext: .kexe
dynamic-lib-prefix: lib
dynamic-lib-ext: .so
env:
GITHUB_ACTIONS_BUILD_TARGET: ${{ matrix.target }}
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Cache konan
uses: actions/cache@v4
with:
path: ~/.konan
key: ${{ runner.os }}-konan-${{ matrix.target }}-${{ hashFiles('**/gradle/libs.versions.toml') }}
- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrappers
key: ${{ runner.os }}-gradleNativeBuild-${{ matrix.target }}-${{ hashFiles('**/gradle/libs.versions.toml') }}
- name: Setup JDK 21
uses: actions/setup-java@v5
with:
distribution: graalvm
java-version: 21
- name: Build Yogurt for ${{ matrix.target }}
run: ./gradlew :yogurt:linkReleaseExecutable${{ matrix.gradle-target }} --no-daemon
- name: Copy artifacts
run: |
mkdir -p artifacts/lib/${{ matrix.platform }}
cp ./yogurt/build/bin/${{ matrix.target }}/releaseExecutable/yogurt${{ matrix.ext }} artifacts/
cp ./yogurt-media-codec/lib/${{ matrix.platform }}/${{ matrix.dynamic-lib-prefix }}lagrangecodec${{ matrix.dynamic-lib-ext }} artifacts/lib/${{ matrix.platform }}/
- name: Upload ${{ matrix.target }} executable
uses: actions/upload-artifact@v4
with:
name: yogurt-${{ matrix.platform }}
path: artifacts/**
build-jvm:
if: contains(github.event.head_commit.message, '[skip build]') == false
runs-on: ubuntu-latest
env:
GITHUB_ACTIONS_BUILD_TARGET: jvm
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Setup JDK 21
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 21
cache: gradle
- name: Build yogurt-jvm fat jar
run: ./gradlew :yogurt-jvm:buildFatJar --no-daemon
- name: Upload fat jar artifact
uses: actions/upload-artifact@v4
with:
name: yogurt-jvm
path: yogurt-jvm/build/libs/yogurt-jvm-all.jar
release-nightly:
if: contains(github.event.head_commit.message, '[skip build]') == false
needs:
- build-native
- build-jvm
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Prepare release assets
run: |
mkdir -p release-assets
# Package Windows x64
cd artifacts/yogurt-windows-x64
zip -r ../../release-assets/yogurt-windows-x64.zip .
cd ../..
# Package macOS x64
cd artifacts/yogurt-macos-x64
tar -czf ../../release-assets/yogurt-macos-x64.tar.gz .
cd ../..
# Package macOS ARM64
cd artifacts/yogurt-macos-arm64
tar -czf ../../release-assets/yogurt-macos-arm64.tar.gz .
cd ../..
# Package Linux x64
cd artifacts/yogurt-linux-x64
tar -czf ../../release-assets/yogurt-linux-x64.tar.gz .
cd ../..
# Package Linux ARM64
cd artifacts/yogurt-linux-arm64
tar -czf ../../release-assets/yogurt-linux-arm64.tar.gz .
cd ../..
# Copy JVM jar
cp artifacts/yogurt-jvm/yogurt-jvm-all.jar release-assets/
- name: Delete existing nightly release
uses: dev-drprasad/delete-tag-and-release@v1.1
with:
tag_name: nightly
github_token: ${{ secrets.GITHUB_TOKEN }}
continue-on-error: true
- name: Create nightly release
uses: softprops/action-gh-release@v2
with:
tag_name: nightly
name: Nightly Build
body: |
🚀自动构建的 Yogurt 可执行文件
构建时间: ${{ github.event.head_commit.timestamp }}
提交: ${{ github.sha }}
files: release-assets/*
prerelease: false
draft: false
make_latest: true
publish-npm:
if: contains(github.event.head_commit.message, '[skip build]') == false
needs:
- build-native
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Download native artifacts
uses: actions/download-artifact@v4
with:
pattern: yogurt-*
path: native-artifacts
- name: Prepare npm packages
run: |
python3 <<'PY'
import json
import os
import re
import shutil
from pathlib import Path
root = Path(".").resolve()
gradle_file = root / "yogurt" / "build.gradle.kts"
gradle_content = gradle_file.read_text(encoding="utf-8")
match = re.search(r'version\s*=\s*"([^"]+)"', gradle_content)
if not match:
raise RuntimeError("Cannot find version in build.gradle.kts")
base_version = match.group(1)
build_number = os.environ.get("GITHUB_RUN_NUMBER")
if not build_number:
raise RuntimeError("GITHUB_RUN_NUMBER is not set")
npm_version = f"{base_version}-dev.{build_number}"
packages_dir = root / "packages"
artifacts_root = root / "native-artifacts"
platform_configs = [
{
"package": "yogurt-win32-x64",
"artifact": "yogurt-windows-x64",
"binary": "yogurt.exe",
},
{
"package": "yogurt-linux-x64",
"artifact": "yogurt-linux-x64",
"binary": "yogurt.kexe",
},
{
"package": "yogurt-linux-arm64",
"artifact": "yogurt-linux-arm64",
"binary": "yogurt.kexe",
},
{
"package": "yogurt-darwin-x64",
"artifact": "yogurt-macos-x64",
"binary": "yogurt.kexe",
},
{
"package": "yogurt-darwin-arm64",
"artifact": "yogurt-macos-arm64",
"binary": "yogurt.kexe",
},
]
def update_package_json(pkg_path: Path) -> None:
data = json.loads(pkg_path.read_text(encoding="utf-8"))
data["version"] = npm_version
optional = data.get("optionalDependencies")
if isinstance(optional, dict):
for key in optional.keys():
optional[key] = npm_version
pkg_path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
for cfg in platform_configs:
payload_root = artifacts_root / cfg["artifact"]
if not payload_root.exists():
raise FileNotFoundError(f"Missing artifact contents for {cfg['artifact']}")
package_dir = packages_dir / cfg["package"]
package_dir.mkdir(parents=True, exist_ok=True)
binary_src = payload_root / cfg["binary"]
if not binary_src.exists():
raise FileNotFoundError(f"Missing binary {binary_src}")
binary_dest = package_dir / cfg["binary"]
shutil.copy2(binary_src, binary_dest)
if binary_dest.suffix == ".kexe":
binary_dest.chmod(0o755)
lib_src = payload_root / "lib"
if not lib_src.exists():
raise FileNotFoundError(f"Missing codec library for {cfg['artifact']}")
lib_dest = package_dir / "lib"
if lib_dest.exists():
shutil.rmtree(lib_dest)
shutil.copytree(lib_src, lib_dest)
package_files = [
packages_dir / "yogurt-win32-x64" / "package.json",
packages_dir / "yogurt-linux-x64" / "package.json",
packages_dir / "yogurt-linux-arm64" / "package.json",
packages_dir / "yogurt-darwin-x64" / "package.json",
packages_dir / "yogurt-darwin-arm64" / "package.json",
packages_dir / "yogurt" / "package.json",
]
for pkg_file in package_files:
if not pkg_file.exists():
raise FileNotFoundError(f"Missing {pkg_file}")
update_package_json(pkg_file)
print(f"Prepared npm packages with version {npm_version}")
PY
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 24
registry-url: https://registry.npmjs.org
- name: Update npm
run: npm install -g npm@latest
- name: Publish npm packages
run: |
set -euo pipefail
packages=(
"packages/yogurt-win32-x64"
"packages/yogurt-linux-x64"
"packages/yogurt-linux-arm64"
"packages/yogurt-darwin-x64"
"packages/yogurt-darwin-arm64"
"packages/yogurt"
)
for pkg in "${packages[@]}"; do
echo "Publishing $pkg"
cd "$pkg"
npm publish --tag latest --access public
cd -
done