用于 Gleam 单仓库的 GitHub Actions
摘要
一位开发者分享了他们在 Gleam 单仓库中测试 BEAM 与 JavaScript 两套运行时的 GitHub Actions 配置,采用矩阵策略并严格执行格式检查。
<p><a href="https://lobste.rs/s/zjceyu/github_actions_for_gleam_monorepo">评论</a></p>
查看缓存全文
缓存时间:
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 中汇报。
相似文章
Hacker News Top
Gleam v1.17.0 引入了 `gleam export escript` 命令以创建单文件 BEAM 程序,在语言服务器中高亮引用,以及常量 `todo` 表达式。此外,首届 Gleam Gathering 大会的视频也已发布。
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 等),但这样做需要特殊的工具链以及更复...
Hugging Face Blog
本文提供了一份逐步指南,教你如何将 GitHub Actions CI 迁移到 Hugging Face Jobs 上运行,从而为类似 Trackio 的项目启用基于 GPU 的测试套件,并将 CPU CI 时间缩短 30%。
Lobsters Hottest
作者通过用 systemd-nspawn 容器替换 Docker 来改进其自托管的 Gitea Actions Runner 设置,以提高安全性,并详细说明了配置和权衡。
Hacker News Top
2026年5月12日,GitHub Actions 因内部数据库迁移导致复制延迟,影响了 CodeQL、webhooks 和通知。服务在扩展工作节点后恢复。