如何在本地运行 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 这样的工具,但它们并不完美。 你并不孤单。类似的问题有:

如何在本地测试 Jenkins 构建 如何在本地测试 GitLab CI 构建 如何在本地测试 Circle CI 构建 如何在本地测试 XXXX 构建

而我对这些问题的解决方案是:

避免使用 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 运行特定作业

GitHub Actions API:获取查看工作流运行历史记录

如何使用 Github Actions 发布对 Docker 镜像的更改

如何在 GitHub Actions 中使用最新发布标签?