Skip to content

Commit 595d762

Browse files
👷 添加 release ci
1 parent a39be36 commit 595d762

2 files changed

Lines changed: 240 additions & 1 deletion

File tree

.github/workflows/release.yml

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
name: release
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
workflow_dispatch:
8+
9+
permissions:
10+
contents: read
11+
12+
jobs:
13+
metadata:
14+
name: Resolve metadata
15+
runs-on: ubuntu-24.04
16+
outputs:
17+
version: ${{ steps.meta.outputs.version }}
18+
owner_lc: ${{ steps.meta.outputs.owner_lc }}
19+
is_tag: ${{ steps.meta.outputs.is_tag }}
20+
expected_tag: ${{ steps.meta.outputs.expected_tag }}
21+
steps:
22+
- name: Checkout
23+
uses: actions/checkout@v6
24+
25+
- name: Resolve workspace version
26+
id: meta
27+
shell: bash
28+
run: |
29+
set -euo pipefail
30+
31+
pkgid="$(cargo pkgid -p fontbake-cli)"
32+
fragment="${pkgid##*#}"
33+
version="${fragment##*@}"
34+
owner_lc="${GITHUB_REPOSITORY_OWNER,,}"
35+
is_tag=false
36+
expected_tag="v${version}"
37+
38+
if [[ "${GITHUB_REF:-}" == refs/tags/* ]]; then
39+
is_tag=true
40+
if [[ "${GITHUB_REF_NAME:-}" != "$expected_tag" ]]; then
41+
echo "tag '${GITHUB_REF_NAME:-}' does not match workspace version '$expected_tag'" >&2
42+
exit 1
43+
fi
44+
fi
45+
46+
{
47+
echo "version=$version"
48+
echo "owner_lc=$owner_lc"
49+
echo "is_tag=$is_tag"
50+
echo "expected_tag=$expected_tag"
51+
} >> "$GITHUB_OUTPUT"
52+
53+
cli:
54+
name: CLI ${{ matrix.target }}
55+
needs: metadata
56+
runs-on: ${{ matrix.runner }}
57+
strategy:
58+
fail-fast: false
59+
matrix:
60+
include:
61+
- runner: ubuntu-24.04
62+
target: x86_64-unknown-linux-gnu
63+
archive_ext: tar.gz
64+
- runner: ubuntu-24.04-arm
65+
target: aarch64-unknown-linux-gnu
66+
archive_ext: tar.gz
67+
- runner: windows-2025
68+
target: x86_64-pc-windows-msvc
69+
archive_ext: zip
70+
- runner: windows-11-arm
71+
target: aarch64-pc-windows-msvc
72+
archive_ext: zip
73+
- runner: macos-15-intel
74+
target: x86_64-apple-darwin
75+
archive_ext: tar.gz
76+
- runner: macos-15
77+
target: aarch64-apple-darwin
78+
archive_ext: tar.gz
79+
steps:
80+
- name: Checkout
81+
uses: actions/checkout@v6
82+
83+
- name: Install Rust toolchain
84+
uses: dtolnay/rust-toolchain@stable
85+
with:
86+
targets: ${{ matrix.target }}
87+
88+
- name: Build fontbake CLI
89+
shell: bash
90+
run: cargo build --locked --release -p fontbake-cli --target ${{ matrix.target }}
91+
92+
- name: Package archive (Unix)
93+
if: runner.os != 'Windows'
94+
shell: bash
95+
run: |
96+
set -euo pipefail
97+
stage_dir="stage/${{ matrix.target }}"
98+
mkdir -p "$stage_dir"
99+
cp "target/${{ matrix.target }}/release/fontbake" "$stage_dir/fontbake"
100+
tar -C "$stage_dir" -czf "fontbake-${{ needs.metadata.outputs.version }}-${{ matrix.target }}.${{ matrix.archive_ext }}" fontbake
101+
102+
- name: Package archive (Windows)
103+
if: runner.os == 'Windows'
104+
shell: pwsh
105+
run: |
106+
$stageDir = "stage/${{ matrix.target }}"
107+
New-Item -ItemType Directory -Force -Path $stageDir | Out-Null
108+
Copy-Item "target/${{ matrix.target }}/release/fontbake.exe" "$stageDir/fontbake.exe"
109+
Compress-Archive -Path "$stageDir/fontbake.exe" -DestinationPath "fontbake-${{ needs.metadata.outputs.version }}-${{ matrix.target }}.${{ matrix.archive_ext }}" -Force
110+
111+
- name: Upload CLI artifact
112+
uses: actions/upload-artifact@v7
113+
with:
114+
name: cli-${{ matrix.target }}
115+
path: fontbake-${{ needs.metadata.outputs.version }}-${{ matrix.target }}.${{ matrix.archive_ext }}
116+
if-no-files-found: error
117+
118+
wasm:
119+
name: WASM
120+
needs: metadata
121+
runs-on: ubuntu-24.04
122+
permissions:
123+
contents: read
124+
packages: write
125+
steps:
126+
- name: Checkout
127+
uses: actions/checkout@v6
128+
129+
- name: Install Rust toolchain
130+
uses: dtolnay/rust-toolchain@stable
131+
with:
132+
targets: wasm32-unknown-unknown
133+
134+
- name: Setup Node.js for GitHub Packages
135+
uses: actions/setup-node@v6
136+
with:
137+
node-version: "20"
138+
registry-url: https://npm.pkg.github.com
139+
scope: "@${{ needs.metadata.outputs.owner_lc }}"
140+
141+
- name: Install wasm-pack
142+
shell: bash
143+
run: cargo install wasm-pack --locked
144+
145+
- name: Build WASM package
146+
shell: bash
147+
run: wasm-pack build crates/fontbake-wasm --target web --scope ${{ needs.metadata.outputs.owner_lc }}
148+
149+
- name: Finalize npm package metadata
150+
id: package_meta
151+
shell: bash
152+
env:
153+
PACKAGE_JSON_PATH: crates/fontbake-wasm/pkg/package.json
154+
run: |
155+
set -euo pipefail
156+
157+
node <<'NODE'
158+
const fs = require('node:fs');
159+
const outputPath = process.env.GITHUB_OUTPUT;
160+
const packageJsonPath = process.env.PACKAGE_JSON_PATH;
161+
const data = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
162+
data.publishConfig = { registry: 'https://npm.pkg.github.com' };
163+
fs.writeFileSync(packageJsonPath, `${JSON.stringify(data, null, 2)}\n`);
164+
fs.appendFileSync(outputPath, `package_name=${data.name}\npackage_version=${data.version}\n`);
165+
NODE
166+
167+
- name: Pack WASM npm tarball
168+
working-directory: crates/fontbake-wasm/pkg
169+
shell: bash
170+
run: npm pack
171+
172+
- name: Detect existing GitHub Packages version
173+
if: needs.metadata.outputs.is_tag == 'true'
174+
id: published
175+
working-directory: crates/fontbake-wasm/pkg
176+
shell: bash
177+
env:
178+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
179+
PACKAGE_NAME: ${{ steps.package_meta.outputs.package_name }}
180+
PACKAGE_VERSION: ${{ steps.package_meta.outputs.package_version }}
181+
run: |
182+
set -euo pipefail
183+
if npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version --registry=https://npm.pkg.github.com; then
184+
echo "already_published=true" >> "$GITHUB_OUTPUT"
185+
else
186+
echo "already_published=false" >> "$GITHUB_OUTPUT"
187+
fi
188+
189+
- name: Publish WASM to GitHub Packages
190+
if: needs.metadata.outputs.is_tag == 'true' && steps.published.outputs.already_published != 'true'
191+
working-directory: crates/fontbake-wasm/pkg
192+
shell: bash
193+
env:
194+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
195+
run: npm publish
196+
197+
- name: Upload WASM artifact
198+
uses: actions/upload-artifact@v7
199+
with:
200+
name: wasm-package
201+
path: crates/fontbake-wasm/pkg/*.tgz
202+
if-no-files-found: error
203+
204+
release:
205+
name: Publish release assets
206+
needs:
207+
- metadata
208+
- cli
209+
- wasm
210+
if: needs.metadata.outputs.is_tag == 'true'
211+
runs-on: ubuntu-24.04
212+
permissions:
213+
contents: write
214+
steps:
215+
- name: Download CLI artifacts
216+
uses: actions/download-artifact@v8
217+
with:
218+
pattern: cli-*
219+
path: release-assets
220+
merge-multiple: true
221+
222+
- name: Download WASM artifact
223+
uses: actions/download-artifact@v8
224+
with:
225+
name: wasm-package
226+
path: release-assets
227+
228+
- name: Upload assets to GitHub Release
229+
uses: softprops/action-gh-release@v2
230+
with:
231+
tag_name: ${{ github.ref_name }}
232+
generate_release_notes: true
233+
fail_on_unmatched_files: true
234+
files: |
235+
release-assets/*.tar.gz
236+
release-assets/*.zip
237+
release-assets/*.tgz

crates/fontbake-wasm/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
name = "fontbake-wasm"
33
version.workspace = true
44
edition.workspace = true
5+
description = "fontbake WebAssembly bindings"
6+
repository = "https://github.com/A-Minos/fontbake"
57

68
[lib]
79
crate-type = ["cdylib", "rlib"]
@@ -12,4 +14,4 @@ wasm-bindgen.workspace = true
1214
thiserror.workspace = true
1315
serde_json.workspace = true
1416
serde.workspace = true
15-
serde-wasm-bindgen.workspace = true
17+
serde-wasm-bindgen.workspace = true

0 commit comments

Comments
 (0)