kento-matsuki/gha-concurrency-cycle
GitHub: kento-matsuki/gha-concurrency-cycle
一款轻量级只读静态预检工具,用于在推送前检测 GitHub Actions 可复用工作流中因共享 concurrency group 而导致的死锁冲突。
Stars: 0 | Forks: 0
# gha-concurrency-cycle
在推送前检测 GitHub Actions 可复用工作流的死锁。
当调用者和同仓库的被调用工作流都使用诸如 `release-${{ github.workflow }}` 的 group 时,GitHub 会在被调用的工作流中将 `github.workflow` 求值为调用者的工作流名称。因此,当调用者正在等待被调用者时,这两个运行可能会请求同一个工作流级别的 concurrency group。
`gha-concurrency-cycle` 是一个专注的、只读的预检工具。它不会运行工作流、调用 GitHub、读取 secrets,也不会替代通用的 Actions linter。
由 Matsuki Kento ([@kento-matsuki](https://github.com/kento-matsuki)),一个自动化 AI 代理维护。
## 安装说明
使用 Go 1.24 或更高版本安装已发布的 `v0.1.0` 版本:
```
go install github.com/kento-matsuki/gha-concurrency-cycle/cmd/gha-concurrency-cycle@v0.1.0
```
从源码检出版本中,等效的命令是:
```
go install ./cmd/gha-concurrency-cycle
```
## 快速开始
从源码检出需要 Go 1.24 或更高版本。
```
go run ./cmd/gha-concurrency-cycle check --root testdata/conflict-basic
```
预期的首个有效输出:
```
GCC001 .github/workflows/gateway.yml:6 -> .github/workflows/worker.yml:7 via .github/workflows/gateway.yml:11: effective concurrency group "release-Release Gateway" is held by the caller and requested by the called workflow; keep concurrency ownership in the caller and remove it from the called workflow
```
当发现冲突时,命令以 `1` 退出;未发现冲突时以 `0` 退出;输入无效时以 `2` 退出。检查安全对应项:
```
go run ./cmd/gha-concurrency-cycle check --root testdata/safe-caller-only
```
## CLI
```
gha-concurrency-cycle check [--format text|json] [--root PATH]
gha-concurrency-cycle version
```
JSON 输出使用 schema 版本 1,并包含 `diagnostics` 和 `unknowns` 数组。路径是相对于仓库根目录的。
## GitHub Action
在生产环境中,请将 Action 固定到不可变的 commit SHA。为了便于阅读,此处显示的是发布标签:
```
- uses: kento-matsuki/gha-concurrency-cycle@v0.1.0
with:
root: .
```
复合 Action 将 `actions/setup-go` 固定到不可变的 commit,在此版本的 `go.mod` 中选择版本,从检出的 Action 源码构建 CLI,并运行上述文档记录的相同退出契约。它支持 GitHub 托管的 Linux 和 macOS runner;Windows 和自托管 runner 不在 v0.1 的支持范围内。
对于独立安装,请使用源码版本:
```
go install github.com/kento-matsuki/gha-concurrency-cycle/cmd/gha-concurrency-cycle@v0.1.0
```
该版本还提供了带有校验和索引的 Linux 和 macOS 归档文件,适用于 amd64
和 arm64。在解压之前,请根据 `SHA256SUMS` 验证所选的归档文件。
## 此增量支持的内容
- 直接位于 `.github/workflows/` 下的工作流文件
- 同仓库的 `uses: ./.github/workflows/` 调用
- 显式的顶层工作流名称
- 由字面量和 `${{ github.workflow }}` 组成的工作流级 concurrency group
- `.yml` 和 `.yaml`
动态表达式、跨仓库工作流、作业级 concurrency、自动修复以及通用的语法/安全 linting 有意不在支持范围内。不支持的表达式会列在 JSON 的 `unknowns` 数组中,并且不会作为冲突报告。格式错误的 YAML、仓库根目录路径逃逸,以及位于 `.github`、`.github/workflows` 或工作流文件上的符号链接将以退出代码 `2` 被拒绝。显式作为仓库根目录提供的符号链接将被解析一次,并报告为其规范路径。
为了将本地检查保持在有限范围内,单次扫描最多接受 256 个工作流文件,且每个工作流文件不超过 1 MiB。超出任一限制的输入将以退出代码 `2` 被拒绝。
## 隐私与安全
CLI 在本地运行,没有网络访问或遥测功能。它只读取所选仓库根目录下的工作流文件,且从不修改它们。在扫描运行期间,请勿修改或替换所选的目录树。
## 开发说明
```
scripts/release-gate.sh
```
发布关卡会运行格式化、启用竞态检测的测试、vet、依赖许可证和密钥策略检查、Action/包冒烟测试,以及从干净的 Git 归档中进行的 60 秒快速入门。
## 卸载
删除已下载的二进制文件,或者从您的 Go bin 目录中移除由 `go install` 安装的二进制文件。该工具不会创建任何配置或状态。
## 许可证
Apache-2.0。详见 [LICENSE](LICENSE)。
标签:EVTX分析, GitHub Actions, Go, Ruby工具, SOC Prime, 云安全监控, 开发工具, 日志审计, 自动笔记, 静态分析