refactor(core): move internal logic to MessageParsingContext [skip …
#103
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |