update(core): release 1.1.1 #156
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/**' | |
| - 'acidify-core-js/**' | |
| - 'acidify-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 | |
| - runs-on: macos-latest | |
| target: macosX64 | |
| gradle-target: MacosX64 | |
| platform: macos-x64 | |
| - runs-on: macos-latest | |
| target: macosArm64 | |
| gradle-target: MacosArm64 | |
| platform: macos-arm64 | |
| - runs-on: ubuntu-latest | |
| target: linuxX64 | |
| gradle-target: LinuxX64 | |
| platform: linux-x64 | |
| - runs-on: ubuntu-latest | |
| target: linuxArm64 | |
| gradle-target: LinuxArm64 | |
| platform: linux-arm64 | |
| 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: temurin | |
| java-version: 25 | |
| - name: Install aarch64 libgcc | |
| if: matrix.target == 'linuxArm64' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y gcc-aarch64-linux-gnu | |
| echo "LINUX_ARM64_LIBGCC=$(aarch64-linux-gnu-gcc -print-libgcc-file-name)" >> "$GITHUB_ENV" | |
| - name: Build Yogurt for ${{ matrix.target }} | |
| run: ./gradlew :yogurt:linkReleaseExecutable${{ matrix.gradle-target }} --no-daemon | |
| - name: Upload ${{ matrix.target }} executable | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: yogurt-${{ matrix.platform }} | |
| path: yogurt/build/bin/${{ matrix.target }}/releaseExecutable/** | |
| 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: 25 | |
| 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 | |
| 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 / "yogurt-npm-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) | |
| 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=( | |
| "yogurt-npm-packages/yogurt-win32-x64" | |
| "yogurt-npm-packages/yogurt-linux-x64" | |
| "yogurt-npm-packages/yogurt-linux-arm64" | |
| "yogurt-npm-packages/yogurt-darwin-x64" | |
| "yogurt-npm-packages/yogurt-darwin-arm64" | |
| "yogurt-npm-packages/yogurt" | |
| ) | |
| for pkg in "${packages[@]}"; do | |
| echo "Publishing $pkg" | |
| cd "$pkg" | |
| npm publish --tag latest --access public | |
| cd - | |
| done | |
| release-yogurt: | |
| if: contains(github.event.head_commit.message, '[skip build]') == false | |
| needs: | |
| - build-native | |
| - build-jvm | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Download build artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: release-input | |
| - name: Prepare release assets | |
| run: | | |
| set -euo pipefail | |
| mkdir -p release-assets | |
| for dir in release-input/yogurt-*; do | |
| if [ -d "$dir" ]; then | |
| base="$(basename "$dir")" | |
| if [ "$base" = "yogurt-jvm" ]; then | |
| continue | |
| fi | |
| (cd "$dir" && zip -r "../../release-assets/${base}.zip" .) | |
| fi | |
| done | |
| if [ -f release-input/yogurt-jvm/yogurt-jvm-all.jar ]; then | |
| cp release-input/yogurt-jvm/yogurt-jvm-all.jar release-assets/yogurt-jvm-all.jar | |
| fi | |
| - name: Resolve release version | |
| id: release_version | |
| run: | | |
| set -euo pipefail | |
| version="$(python3 <<'PY' | |
| import re | |
| from pathlib import Path | |
| gradle_file = Path("yogurt") / "build.gradle.kts" | |
| content = gradle_file.read_text(encoding="utf-8") | |
| match = re.search(r'version\s*=\s*"([^"]+)"', content) | |
| if not match: | |
| raise SystemExit("Cannot find version in yogurt/build.gradle.kts") | |
| print(match.group(1)) | |
| PY | |
| )" | |
| echo "release_version=${version}" >> "$GITHUB_OUTPUT" | |
| echo "release_tag=v${version}-dev.${{ github.run_number }}" >> "$GITHUB_OUTPUT" | |
| echo "release_name=Yogurt v${version} (build ${{ github.run_number }})" >> "$GITHUB_OUTPUT" | |
| - name: Create release in SaltifyDev/yogurt-releases | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| repository: SaltifyDev/yogurt-releases | |
| tag_name: ${{ steps.release_version.outputs.release_tag }} | |
| name: ${{ steps.release_version.outputs.release_name }} | |
| generate_release_notes: false | |
| files: release-assets/* | |
| body: | | |
| Yogurt build #${{ github.run_number }} | |
| *由 CI 自动构建并发布* | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.YOGURT_RELEASE_TOKEN }} |