如何在本地运行 GitHub Actions 工作流程?
Posted
技术标签:
【中文标题】如何在本地运行 GitHub Actions 工作流程?【英文标题】:How to run GitHub Actions workflows locally? 【发布时间】:2020-04-02 02:32:58 【问题描述】:我计划使用 Docker 将 Travis CI 构建迁移到 GitHub Actions 以进行每次提交测试。
我可以在本地重复运行这些新的 GitHub Actions 工作流程吗?是否有一种通用的方法可以在本地运行任何 GitHub Actions 工作流?
【问题讨论】:
There is 如果您仍在使用 deprecated HCL 语法进行操作并且尚未升级到新的 YAML 样式。我还没有看到任何支持新的 yaml 样式工作流的工作nejtos/act
对支持 YAML 语法很感兴趣,请参阅下面的答案以及正在讨论的问题的链接。
也许自托管的跑步者可以帮助github.com/actions/runner
【参考方案1】:
有像前面提到的act
这样的工具,但它们并不完美。
你并不孤单。类似的问题有:
而我对这些问题的解决方案是:
避免使用 CI 工具(GitHub Actions、Gitlab CI 等)提供的功能 尽可能多地以 CI 无关的方式编写(BASH 脚本、PowerShell 脚本、Gradle 脚本、NPM 脚本、Dockerfiles、Ansible 脚本 - 任何你知道的) 从您的 CI 工具调用这些脚本。在 GitHub 操作中:run: your command to run
【讨论】:
其实gitlab有一个cli工具可以测试你的工作流程:gitlab-runner exec docker my-job
很好的答案!但不幸的是,当您测试诸如上传和下载工件到 github 版本之类的事情时,这并没有多大帮助。
也许 github api 或 github cli 可以做到这一点?不幸的是,我的方法仅适用于大约 95% 的操作。从工具生成的 xml 中收集测试结果和覆盖率之类的事情,也许你的问题,只能由 GHA / Jenkins 等本地完成
Circle CI 也允许你在本地运行:circleci.com/docs/2.0/local-cli
“CI-agnostic way”在使用每个特定的 CI 缓存功能时都会带来缓存挑战【参考方案2】:
您可以使用自0.2.0(预发布)以来支持yaml语法的nektos/act。
查看他们的latest 版本。
【讨论】:
似乎这不支持 Windows 构建。很好奇,其他人通常如何测试他们对 Github Actions for Windows 应用程序的更改(无需签入并触发它们)? 似乎已按照github.com/nektos/act/pull/675进行了修复 Act 也不支持 macOS 构建 :( 不支持工件 这只是 github 操作(人们还使用 Jenkins、gitlab ci、Amazon 代码管道、Travis 等)。使用构建工具(gradle、npm、bash)编写大部分构建脚本效果最好【参考方案3】:测试 Github 操作的一种方法是创建一个私有存储库,并在那里迭代操作配置。因此,您可以避免因提交中断而污染实际的 repo。
我知道,这不是问题的直接答案 - 这不是本地方式。但一开始我并没有想到这一点,我认为这对于许多用例来说已经足够了。
【讨论】:
在处理大规模、多 repo 项目时,这是少数。希望有更好的选择,但不幸的是,这是唯一有保证的用于测试的镜像功能。 另一种可能性是在您的存储库中创建一个新分支,将更改推送到该分支,直到您使操作正常工作,然后压缩为单个提交并合并到 main。【参考方案4】:你最好的选择是https://github.com/nektos/act,但是(在 0.2.0 之前)它还不支持 yaml 语法,虽然有很多兴趣又名:https://github.com/nektos/act/issues/80https://github.com/nektos/act/issues/76 和 https://github.com/nektos/act/issues/74
Gitlab 有 gitlab-runner exec docker job-name
但那是 Gitlab :)
【讨论】:
act 从 0.2.0 开始支持 yaml 语法(参见 Webber 的回答)【参考方案5】:使用docker容器,这个工具叫做act,可以在这里找到,https://github.com/nektos/act 您可以在 docker 容器中本地运行所有 github 操作。 注意:act 构建所有必要的容器以运行操作。您所要做的就是遵循有关如何使用该工具的文档
【讨论】:
【参考方案6】:除了 @iirekm 和 @riQQ 所说的之外,为了保持与 CI 无关并具有一些编排功能,您可以使用 Task 抽象您的步骤,然后从您的 Github Actions 或任何其他 CI/CD。 这样,您还可以获得能够在本地运行所有内容的好处。
【讨论】:
以上是关于如何在本地运行 GitHub Actions 工作流程?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Github Actions 工作流中从 Github 包访问 Maven 依赖项?
如何将降价页面附加到 GitHub Actions 工作流程运行摘要?
GitHub Actions API:获取查看工作流运行历史记录