用于 Gleam 单仓库的 GitHub Actions

Lobsters Hottest 工具

摘要

一位开发者分享了他们在 Gleam 单仓库中测试 BEAM 与 JavaScript 两套运行时的 GitHub Actions 配置,采用矩阵策略并严格执行格式检查。

<p><a href="https://lobste.rs/s/zjceyu/github_actions_for_gleam_monorepo">评论</a></p>
查看原文 导出为 Word 导出为 PDF
查看缓存全文

缓存时间: 2026/04/22 12:38

# 为 Gleam 单体仓库配置 GitHub Actions 来源:https://crowdhailer.me/2026-04-21/github-actions-for-a-gleam-monorepo/ > 单体仓库在 GitHub Actions 中的 CI 视图。 我偏爱用 Gleam 单体仓库把项目拆成多个包。如果你想同时支持多个运行时(比如给客户端用 JavaScript、给稳健的后端用 Erlang),就必须拆包。而且不必只停留在“前端 / 后端”这一层。 [EYG](https://github.com/CrowdHailer/eyg-lang) 是一门我正在写的静态类型函数式脚本语言,目标是成为更好的 bash。我希望用户能按需裁剪工具链,因此把它拆成了十几个包:有些跑在 BEAM 上,有些编译到 JavaScript,还有些两边都能跑。 下文是我 CI 配置的精简总结。 ## 仓库结构 我用 GitHub Actions 做 CI,所有配置放在 `.github/workflows/test.yml`。 每个 Gleam 包位于 `packages/` 目录,各自拥有独立的 `gleam.toml`。 ``` packages/ gleam_analysis/ gleam_compiler/ gleam_hub/ gleam_interpreter/ gleam_parser/ morph/ website/ ... ``` ## Job 结构 测试运行时的最大差异在于“目标运行时”。因此 workflow 为每个运行时分别建了一个 job:`test-beam` 和 `test-bun`。 (还有一个 `test-db` job,同样跑在 BEAM 上,此处不展开。) ### 运行时设置 每个 job 通过 matrix 指定不同维度:运行时版本、要测试的包。 我利用 `gleam` 版本的 matrix 快速验证候选发布版。当前正在测试 `1.16.0` 的 RC,只要在 matrix 里加一行就能提前发现任何包可能遇到的问题。 ```yaml test-beam: runs-on: ubuntu-latest strategy: fail-fast: false matrix: gleam: ["1.15.4", "v1.16.0-rc3"] otp: ["28.4"] rebar3: ["3.25"] package: ["gleam_analysis", "gleam_hub", "gleam_ir", "gleam_parser", "touch_grass", "untethered"] ``` `fail-fast: false` 很关键:否则一个包失败就会取消其余任务,让你看不到还有哪些地方挂了。 `test-bun` 也有类似的包列表。我尽量让大部分包同时支持两个目标。“sans-io” 模式让我把包做成运行时无关,效果不错,以后可能单独写篇帖子。 不是所有包都出现在两个 matrix 里。例如 `gleam_cli` 跟 [bun](https://bun.com/) 强绑定,我用 bun 把 CLI 打包成单文件可执行文件进行分发。 ### 测试与其他检查 真正的测试步骤如下: ```yaml steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ matrix.otp }} gleam-version: ${{ matrix.gleam }} rebar3-version: ${{ matrix.rebar3 }} - run: gleam deps download shell: bash working-directory: packages/${{ matrix.package }} - run: gleam build --warnings-as-errors working-directory: packages/${{ matrix.package }} - run: gleam test working-directory: packages/${{ matrix.package }} - run: gleam format --check src test working-directory: packages/${{ matrix.package }} ``` 检查尽可能严格: - `gleam build --warnings-as-errors` 让任何编译警告都导致 CI 失败。本地开发可以有警告,但提交前必须清零。 - `gleam format --check src test` 确保所有源码和测试文件都格式化到位。 ## GitHub 上的展示 这样配置后,每个“包 × 运行时”组合在 CI 报告里独占一行,一眼就能看出是依赖挂了还是仅某个 Gleam 版本出问题。 就这些。 --- 我正在打造 EYG:一项“更好”的语言与工具实验。所有进展都会在我的不定期 newsletter 中汇报。

相似文章

在多语言 Monorepo 中使用 Changesets

Hacker News Top

# 在多语言 Monorepo 中使用 Changesets 来源:[https://luke.hsiao.dev/blog/changesets-polyglot-monorepo/](https://luke.hsiao.dev/blog/changesets-polyglot-monorepo/) 在规模较小的企业工作有一个优势,那就是你可以使用那些无需向超大规模扩展的工具。软件开发领域的一个例子就是 Monorepo。虽然 Monorepo *确实能够*很好地扩展(例如 Google、Facebook 等),但这样做需要特殊的工具链以及更复...

Show HN:面向AI代理的Git

Hacker News Top

re_gent 是一个开源的版本控制系统,专为AI代理活动设计,记录每一次工具调用及其相关提示,使开发者能够审查和回滚代理的变更。