首页
/
工具
/
用于 Gleam 单仓库的 GitHub Actions
用于 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 中汇报。
相似文章
Lobsters Hottest
The article explains how to speed up running Haskell scripts with Magix on GitHub Actions by caching dependencies and compiled artifacts, reducing full build times from over 100 seconds to near-instant reruns.
X AI KOLs Following
查理·马什发推文强调Zizmor是改进GitHub Actions工作流的工具,但未提供具体细节。
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 等),但这样做需要特殊的工具链以及更复...
X AI KOLs Timeline
本篇文章介绍了如何构建一个自我改进的代码审查代理,作为云软件工厂的一部分,使用了代码审查技能、GitHub Actions以及一个外层循环代理来实现持续改进。