name: Release CI
on:
push:
tags:
- "v*"
permissions:
id-token: write 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
- 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