用于 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
# 在多语言 Monorepo 中使用 Changesets
来源:[https://luke.hsiao.dev/blog/changesets-polyglot-monorepo/](https://luke.hsiao.dev/blog/changesets-polyglot-monorepo/)
在规模较小的企业工作有一个优势,那就是你可以使用那些无需向超大规模扩展的工具。软件开发领域的一个例子就是 Monorepo。虽然 Monorepo *确实能够*很好地扩展(例如 Google、Facebook 等),但这样做需要特殊的工具链以及更复...
TLDR AI
GitHub通过API代理记录Token使用并建立每日优化工作流,减少了未使用的MCP工具注册带来的开销,从而提升了其代理工作流的Token效率。
Reddit r/LocalLLaMA
一位开发者分享了在本地运行 Gemma4 和 Qwen 进行编程任务的复杂体验,指出了工具集成、循环处理和任务完成方面存在的问题,并向社区寻求更优化的使用策略。
Hacker News Top
re_gent 是一个开源的版本控制系统,专为AI代理活动设计,记录每一次工具调用及其相关提示,使开发者能够审查和回滚代理的变更。
X AI KOLs Following
一名开发者搭建自动化 Agent 流水线,在 72 小时内向 100 多个主流开源项目提交 500 多次 commit,Kubernetes、Hugging Face 等项目的维护者甚至合并了部分 PR,随后 GitHub 直接封禁了其账号。