Skip to content

ci: add release workflow for automated CLI releases#403

Merged
Kamirus merged 2 commits into
mainfrom
kamil/release-yml
Mar 18, 2026
Merged

ci: add release workflow for automated CLI releases#403
Kamirus merged 2 commits into
mainfrom
kamil/release-yml

Conversation

@Kamirus
Copy link
Copy Markdown
Collaborator

@Kamirus Kamirus commented Mar 18, 2026

Summary

  • Adds .github/workflows/release.yml that automates CLI releases end-to-end
  • Triggered by cli-v* tag push: validates tag is on main, builds CLI tarball in Docker, publishes to npm via OIDC trusted publishing, creates GitHub Release with tarball + changelog

Tested

Temporarily triggered the workflow on push (dry-run mode) — all steps passed:

  • Docker build, tarball extraction, SHA256 computation
  • npm ci + wasm build
  • Changelog extraction
  • npm publish --dry-run

How to use

# After merging a release PR:
git tag cli-v<version>
git push origin cli-v<version>

Key decisions

  • OIDC trusted publishing instead of NPM_TOKEN — no secrets to manage
  • Single job for simplicity (can split build/publish later if needed)
  • All ${{ }} expressions passed through env: to prevent expression injection
  • npm pinned to 11.4.0 (minimum for trusted publishing)
  • --ignore-scripts on npm publish avoids redundant prepare run
  • Changelog extraction via awk (avoids tsx/node dependency for a simple text extraction)

@Kamirus Kamirus requested a review from a team as a code owner March 18, 2026 08:04
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 18, 2026

Benchmark Results

bench/1-buffer-vector-add.bench.mo $({\color{green}-8.22\%})$

Add (second)

Add items one-by-one (second)

Instructions: ${\color{green}-8.22\%}$
Heap: ${\color{gray}0\%}$
Stable Memory: ${\color{gray}0\%}$
Garbage Collection: ${\color{gray}0\%}$

Instructions

10 10000 1000000
Buffer 9_557 $({\color{green}-29.67\%})$ 5_687_594 $({\color{green}-8.33\%})$ 525_783_888 $({\color{green}-8.25\%})$
Vector 13_525 $({\color{red}+18.47\%})$ 4_378_612 $({\color{green}-10.82\%})$ 417_864_498 $({\color{green}-10.74\%})$

Heap

10 10000 1000000
Buffer 272 B $({\color{gray}0\%})$ 272 B $({\color{gray}0\%})$ 272 B $({\color{gray}0\%})$
Vector 272 B $({\color{gray}0\%})$ 272 B $({\color{gray}0\%})$ 272 B $({\color{gray}0\%})$

Garbage Collection

10 10000 1000000
Buffer 1.09 KiB $({\color{gray}0\%})$ 143.28 KiB $({\color{gray}0\%})$ 12.02 MiB $({\color{gray}0\%})$
Vector 1.09 KiB $({\color{gray}0\%})$ 45.65 KiB $({\color{gray}0\%})$ 3.86 MiB $({\color{gray}0\%})$
bench/2-vector-buffer-add.bench.mo $({\color{green}-10.02\%})$

Add

Add items one-by-one

Instructions: ${\color{green}-10.02\%}$
Heap: ${\color{gray}0\%}$
Stable Memory: ${\color{gray}0\%}$
Garbage Collection: ${\color{gray}0\%}$

Instructions

10 10000 1000000
Vector 13_525 $({\color{green}-12.27\%})$ 4_378_966 $({\color{green}-10.82\%})$ 417_886_092 $({\color{green}-10.74\%})$
Buffer 9_557 $({\color{green}-9.75\%})$ 5_686_886 $({\color{green}-8.33\%})$ 525_781_056 $({\color{green}-8.25\%})$

Heap

10 10000 1000000
Vector 272 B $({\color{gray}0\%})$ 272 B $({\color{gray}0\%})$ 272 B $({\color{gray}0\%})$
Buffer 272 B $({\color{gray}0\%})$ 272 B $({\color{gray}0\%})$ 272 B $({\color{gray}0\%})$

Garbage Collection

10 10000 1000000
Vector 1.09 KiB $({\color{gray}0\%})$ 45.65 KiB $({\color{gray}0\%})$ 3.86 MiB $({\color{gray}0\%})$
Buffer 1.09 KiB $({\color{gray}0\%})$ 143.28 KiB $({\color{gray}0\%})$ 12.02 MiB $({\color{gray}0\%})$
bench/array.bench.mo $({\color{green}-17.47\%})$

Array

arr arr

Instructions: ${\color{green}-17.47\%}$
Heap: ${\color{gray}0\%}$
Stable Memory: ${\color{gray}0\%}$
Garbage Collection: ${\color{gray}0\%}$

Instructions

100k x1 reset1 100k x3 reset2 100k x4 reset3
Array 13_502_096 $({\color{green}-10.00\%})$ 3_335 $({\color{green}-25.14\%})$ 27_003_270 $({\color{green}-10.00\%})$ 3_809 $({\color{green}-24.92\%})$ 54_004_127 $({\color{green}-10.00\%})$ 4_283 $({\color{green}-24.74\%})$

Heap

100k x1 reset1 100k x3 reset2 100k x4 reset3
Array 390.9 KiB $({\color{gray}0\%})$ -390.37 KiB $({\color{gray}0\%})$ 390.9 KiB $({\color{gray}0\%})$ -390.37 KiB $({\color{gray}0\%})$ 390.9 KiB $({\color{gray}0\%})$ -390.37 KiB $({\color{gray}0\%})$

Garbage Collection

100k x1 reset1 100k x3 reset2 100k x4 reset3
Array 360 B $({\color{gray}0\%})$ 390.97 KiB $({\color{gray}0\%})$ 391 KiB $({\color{gray}0\%})$ 390.97 KiB $({\color{gray}0\%})$ 1.14 MiB $({\color{gray}0\%})$ 390.97 KiB $({\color{gray}0\%})$
No previous results found "/home/runner/work/mops/mops/.bench/prng.bench.json"
bench/prng.bench.mo $({\color{gray}0\%})$

Prng

Benchmark N next calls for different PRNGs

Instructions: ${\color{gray}0\%}$
Heap: ${\color{gray}0\%}$
Stable Memory: ${\color{gray}0\%}$
Garbage Collection: ${\color{gray}0\%}$

Instructions

10 100 1000 10000
Seiran128 1_694 15_194 150_194 1_500_194
SFC64 2_802 28_962 288_557 2_882_655
SFC32 2_383 23_825 237_026 2_379_333

Heap

10 100 1000 10000
Seiran128 272 B 272 B 272 B 272 B
SFC64 308 B 272 B 272 B 272 B
SFC32 280 B 280 B 272 B 272 B

Garbage Collection

10 100 1000 10000
Seiran128 296 B 296 B 296 B 296 B
SFC64 536 B 4.98 KiB 47.16 KiB 469.04 KiB
SFC32 376 B 1.78 KiB 15.39 KiB 156.11 KiB
bench/removeLast.bench.mo $({\color{green}-10.90\%})$

Remove items using removeLast

Vector and buffer are initialized with 100k items and then 70k items are removed one-by-one.

Instructions: ${\color{green}-10.90\%}$
Heap: ${\color{gray}0\%}$
Stable Memory: ${\color{gray}0\%}$
Garbage Collection: ${\color{gray}0\%}$

Instructions

remove 70k
Vector 27_707_716 $({\color{green}-13.98\%})$
Buffer 29_236_977 $({\color{green}-7.82\%})$

Heap

remove 70k
Vector -136.8 KiB $({\color{gray}0\%})$
Buffer -269.76 KiB $({\color{gray}0\%})$

Garbage Collection

remove 70k
Vector 139.45 KiB $({\color{gray}0\%})$
Buffer 540.43 KiB $({\color{gray}0\%})$
bench/stable-memory.bench.mo $({\color{green}-134.03\%})$

Stable Memory and Region

Grow Region and store blobs in it

Instructions: ${\color{green}-66.97\%}$
Heap: ${\color{green}-6.10\%}$
Stable Memory: ${\color{gray}0\%}$
Garbage Collection: ${\color{green}-60.97\%}$

Instructions

Region (fill 1/100) Region (fill 1/50) StableMemory
10 pages 2_626_981 $({\color{green}-95.97\%})$ 10_496_366 $({\color{green}-95.97\%})$ 2_693 $({\color{green}-5.87\%})$
100 pages 52_466_841 $({\color{green}-95.97\%})$ 104_914_706 $({\color{green}-95.97\%})$ 2_698 $({\color{green}-8.67\%})$
256 pages 134_273_846 $({\color{green}-95.97\%})$ 268_575_095 $({\color{green}-95.97\%})$ 3_246 $({\color{green}-12.37\%})$

Heap

Region (fill 1/100) Region (fill 1/50) StableMemory
10 pages 272 B $({\color{green}-8.11\%})$ 272 B $({\color{gray}0\%})$ 276 B $({\color{gray}0\%})$
100 pages 272 B $({\color{green}-11.69\%})$ 272 B $({\color{green}-11.69\%})$ 272 B $({\color{gray}0\%})$
256 pages 272 B $({\color{green}-11.69\%})$ 272 B $({\color{green}-11.69\%})$ 276 B $({\color{gray}0\%})$

Garbage Collection

Region (fill 1/100) Region (fill 1/50) StableMemory
10 pages 208.34 KiB $({\color{green}-91.44\%})$ 832.38 KiB $({\color{green}-91.45\%})$ 336 B $({\color{gray}0\%})$
100 pages 4.06 MiB $({\color{green}-91.46\%})$ 8.13 MiB $({\color{green}-91.46\%})$ 340 B $({\color{gray}0\%})$
256 pages 10.4 MiB $({\color{green}-91.46\%})$ 20.8 MiB $({\color{green}-91.46\%})$ 340 B $({\color{gray}0\%})$

Stable Memory

Region (fill 1/100) Region (fill 1/50) StableMemory
10 pages 8 MiB $({\color{gray}0\%})$ 8 MiB $({\color{gray}0\%})$ 8 MiB $({\color{gray}0\%})$
100 pages 8 MiB $({\color{gray}0\%})$ 8 MiB $({\color{gray}0\%})$ 0 B $({\color{gray}0\%})$
256 pages 16 MiB $({\color{gray}0\%})$ 16 MiB $({\color{gray}0\%})$ 16 MiB $({\color{gray}0\%})$

@Kamirus Kamirus force-pushed the kamil/release-yml branch from 8f1843f to e554995 Compare March 18, 2026 08:22
Triggered by `cli-v*` tag push. Builds CLI tarball via Docker,
publishes to npm (OIDC trusted publishing), and creates a GitHub
Release with the tarball and changelog.

Includes `workflow_dispatch` with dry-run mode for testing.

Made-with: Cursor
@Kamirus Kamirus force-pushed the kamil/release-yml branch from e554995 to 9f84ab0 Compare March 18, 2026 08:26
Steps 6-7 (hash verification, npm publish) are now handled by CI.
Remove GNU tar prerequisite (only used inside Docker container).

Made-with: Cursor
@Kamirus Kamirus force-pushed the kamil/release-yml branch from 992921c to 5daabf7 Compare March 18, 2026 08:41
@Kamirus Kamirus merged commit 03bbb5f into main Mar 18, 2026
22 checks passed
@Kamirus Kamirus deleted the kamil/release-yml branch March 18, 2026 08:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant