libchai 0.3.9

汉字编码优化算法
Documentation
name: Release CI

on:
  push:
    tags:
      - "v*"

permissions:
  id-token: write  # Required for OIDC
  contents: write

jobs:
  prepare:
    runs-on: ubuntu-latest
    outputs:
      changelog: ${{ steps.build_changelog.outputs.changelog }}
    steps:
      # 拉取代码
      - name: Checkout
        uses: actions/checkout@v4
      # 获取静态资源
      - name: Fetch Static Resources
        run: |
          chmod +x fetch.sh
          ./fetch.sh
      # 拉取前端代码
      - name: Checkout Website
        uses: actions/checkout@v4
        with:
          repository: hanzi-chai/hanzi-chai.github.io
          path: hanzi-chai
      # 安装 Bun
      - name: Install Bun
        uses: oven-sh/setup-bun@v2
      # 编译前端
      - name: Build Website
        run: |
          cd hanzi-chai
          bun install
          bun run fetch
          bun run build:CLIENT
          cd ..
          cp -r hanzi-chai/dist/client client
      # 上传
      - name: Upload Static
        uses: actions/upload-artifact@v4
        with:
          name: static
          path: |
            assets
            examples
            client
      - name: Build Changelog
        id: build_changelog
        uses: mikepenz/release-changelog-builder-action@v5
        with:
          mode: "COMMIT"
          configurationJson: |
            {
              "template": "Change log from #{{FROM_TAG}} to #{{TO_TAG}}: #{{RELEASE_DIFF}}\n#{{UNCATEGORIZED}}",
              "pr_template": "- [#{{MERGE_SHA}}] - #{{TITLE}}"
            }
      - name: Create Release
        uses: ncipollo/release-action@v1
        with:
          allowUpdates: true
          body: |
            ${{ steps.build_changelog.outputs.changelog }}
          token: ${{ secrets.GITHUB_TOKEN }}

  build-linux:
    needs: prepare
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
      - name: 获取静态资源
        uses: actions/download-artifact@v4
        with:
          name: static
      - name: 安装 Rust 工具链
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          target: "x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl"
      - name: Rust cache
        uses: Swatinem/rust-cache@v2
      - name: 构建 chai
        run: |
          cargo build --target x86_64-unknown-linux-gnu --bin chai --release
          cargo build --target x86_64-unknown-linux-musl --bin chai --release
      - name: Archive
        run: |
          cp target/x86_64-unknown-linux-gnu/release/chai ./
          tar -czf chai-linux-gnu.tar.gz chai assets/* examples/* README.md LICENSE
          cp target/x86_64-unknown-linux-musl/release/chai ./
          tar -czf chai-linux-musl.tar.gz chai assets/* examples/* README.md LICENSE
      - uses: ncipollo/release-action@v1
        with:
          artifacts: "chai*.tar.gz"
          allowUpdates: true
          body: ${{ needs.prepare.outputs.changelog }}
          token: ${{ secrets.GITHUB_TOKEN }}

  build-macos:
    needs: prepare
    runs-on: macos-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
      - name: 获取静态资源
        uses: actions/download-artifact@v4
        with:
          name: static
      - name: Install Zig
        uses: goto-bus-stop/setup-zig@v2
        with:
          version: 0.13.0
      - name: Install Rust Toolchains
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          target: "x86_64-apple-darwin, aarch64-apple-darwin"
      - name: Rust cache
        uses: Swatinem/rust-cache@v2
      - name: Install cargo-zigbuild
        run: cargo install cargo-zigbuild
      - name: Build
        run: cargo zigbuild --target universal2-apple-darwin --bin chai --release
      - name: Archive
        run: |
          cp target/universal2-apple-darwin/release/chai ./
          tar -czf chai-macos.tar.gz chai assets/* examples/* README.md LICENSE
      - uses: ncipollo/release-action@v1
        with:
          artifacts: "chai-macos.tar.gz"
          allowUpdates: true
          body: ${{ needs.prepare.outputs.changelog }}
          token: ${{ secrets.GITHUB_TOKEN }}

  build-windows:
    needs: prepare
    runs-on: windows-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
      - name: 获取静态资源
        uses: actions/download-artifact@v4
        with:
          name: static
      - name: Install Rust Toolchains
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          target: "x86_64-pc-windows-msvc"
      - name: Rust cache
        uses: Swatinem/rust-cache@v2
      - name: Build
        run: cargo build --bin chai --release
      - name: Archive
        run: |
          cp target/release/chai.exe ./
          7z a -tzip chai-windows.zip chai.exe assets/* examples/* README.md LICENSE
      - uses: ncipollo/release-action@v1
        with:
          artifacts: "chai-windows.zip"
          allowUpdates: true
          body: ${{ needs.prepare.outputs.changelog }}
          token: ${{ secrets.GITHUB_TOKEN }}

  publish-crates:
    needs: [build-linux, build-macos, build-windows]
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
      - name: 安装 Rust 工具链
        uses: actions-rust-lang/setup-rust-toolchain@v1
      - name: Rust cache
        uses: Swatinem/rust-cache@v2
      - uses: rust-lang/crates-io-auth-action@v1
        id: auth
      - name: 发布到 crates.io
        run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}

  publish-npm:
    needs: [build-linux, build-macos, build-windows]
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
      - name: 安装 Rust 工具链
        uses: actions-rust-lang/setup-rust-toolchain@v1
      - name: Rust cache
        uses: Swatinem/rust-cache@v2
      - name: 安装 wasm-pack
        run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          registry-url: 'https://registry.npmjs.org'
      - name: 构建 WASM
        run: RUSTFLAGS='--cfg getrandom_backend="wasm_js"' wasm-pack build --target web --release --no-default-features -- --features console_error_panic_hook
      - name: 发布到 NPM
        run: wasm-pack publish