如何在本地运行GitHub Actions工作流程?

247

我计划使用Docker将我们的Travis CI构建转移到GitHub Actions以进行每次提交测试。

我能否在本地可重复地运行这些新的GitHub Actions工作流程?是否有一种通用的方式来在本地运行任何GitHub Actions工作流程?


2
如果您仍在使用已弃用的 HCL 语法进行操作,并且尚未升级到新的 YAML 样式,则可以使用 这里。我还没有看到任何支持新的 YAML 样式工作流程的进展。 - smac89
1
有很多人对 nejtos/act 支持 YAML 语法感兴趣,可以看下面我的回答,里面有相关讨论的链接。 - Jubair
2
也许自托管的 Runner 可以帮助解决这个问题 https://github.com/actions/runner - UselesssCat
10个回答

207

有一些像已经提到的act之类的工具,但它们并不完美。

你并不孤单。类似的问题还有:

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

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

  • 避免使用CI工具提供的功能(GitHub Actions,Gitlab CI等)
  • 尽可能以与CI无关的方式编写(BASH脚本、PowerShell脚本、Gradle脚本、NPM脚本、Dockerfiles、Ansible脚本-任何您熟悉的东西)
  • 从您的CI工具调用这些脚本。 在GitHub actions中:run:your command to run

更新2022年; Bit-bucket的Pipelines支持本地运行,这意味着100%免费使用小时,代价是购买自己的PC/Mac(如果您想要永久服务器)。


42
GitLab实际上有一个CLI工具来测试您的工作流程:gitlab-runner exec docker my-job - Jubair
23
好的回答!但遗憾的是,当您测试像上传和下载GitHub发布的工件之类的事情时,这并没有帮助太多。 - dmedine
3
Circle CI 还允许您在本地运行:https://circleci.com/docs/2.0/local-cli/ - Mike Pennington
4
当使用每个特定的CI缓存功能时,“CI-agnostic way”会带来缓存挑战。 - luismartingil
5
这正是我多年来一直在做的事情。掌控自己,不依赖专有的CI工具远比能够看到每个阶段完成的小圆圈标记带来的好处更重要。CI工具供应商应该提供钩子供我们的脚本使用以指示已完成的阶段。CI工具供应商应该透明地处理缓存;这是他们的问题,而不是我们的问题。 - Mike Nakis
显示剩余3条评论

73

测试 Github Actions 的方法之一是创建一个私有仓库,并在其中迭代操作配置。这样,您可以避免在实际仓库中添加错误提交。

我知道,这不是直接回答问题的方式 - 这不是本地方法。但一开始我没有想到这一点,我认为这对于许多用例可能已经足够了。


在处理大型多仓库项目时,这是一个棘手的问题。希望有更好的替代方案,但不幸的是这是测试的唯一保证镜像功能。 - m4heshd
83
另一个可能性是在你的代码库中创建一个新的分支,将更改推送到该分支,直到动作正常工作,然后将这些更改压缩成一个单一的提交并合并到主分支。 - Jordan Mitchell Barrett
2
@JordanMitchellBarrett,很遗憾地说,当添加新的工作流程时,这种方法不起作用。有时,工作流YAML文件必须存在于您的主线/默认分支上,才能在操作UI中显示出来。 - void.pointer
1
@void.pointer 这是真的!在这种情况下,我会在主分支中创建一个最小的新工作流程,以便它出现在 GitHub Actions 下。然后,在此之后,我会创建一个新的分支,并继续开发和测试工作流程,直到它完全按照我的要求工作为止。 - John
@JordanMitchellBarrett 这应该是一个答案 - nocibambi
显示剩余2条评论

48

1
但它在 .net/windows 项目上无法工作 :( - Daniel Williams
@DanielWilliams,具体是什么不起作用呢?是否与操作有关? - Webber
我一直收到以下错误信息:" {Skipping unsupported platform -- Try running with -P windows-latest=... }",但是无论如何都不能将任何内容作为参数传递给 -P。我尝试了这个:-P ubuntu-latest=node:16-buster-slim,但每次都出现相同的错误。 - Daniel Williams
@DanielWilliams,您能否报告一下这个问题吗?https://github.com/nektos/act/issues - Webber
1
谢谢,这很有帮助。我注意到在GitHub Actions和使用act运行Python脚本时有一些差异。我发现在GitHub Actions下运行的脚本似乎被隐式缓存了。这可能更多是GitHub Actions的问题,但由于nektos/act,我能够捕捉到这种行为。 - Omar Khazamov

22

我假设您希望在本地运行该操作以进行调试,因为它正在失败。如果是这样,另一种选择(不需要在本地运行)是使用action-tmate 来 SSH 连接到运行您的操作的机器。从那里,您可以查看日志、运行命令等,以找出问题所在。

开始操作:

  1. 在您的工作流 YAML 文件中,在失败的步骤(或最后)之后添加一个新步骤,如下所示:
    - name: Setup tmate session
      if: success() || failure()
      uses: mxschmitt/action-tmate@v3
  1. 将更改推送到GitHub并重新运行操作。

  2. 等待再次失败 - 这一次,不会停止工作流程,而是会打开一个 tmate 会话,并在工作流程控制台中打印 SSH 详细信息。

  3. 从您自己的计算机通过SSH连接,现在您可以完全访问runner机器。


13

3
自版本0.2.0起,该程序支持YAML语法(请参见Webber的答案)。 - Frank Rem

6

在我的情况下,即使 GitHub CI 通过,ACT 也会失败,所以我找到了这个:

https://github.com/actions/runner

官方的 GitHub Action runner(可以自行托管)。请按照自述文件中的说明进行操作。

它与 ACT 有些不同,但例如允许将存储库 CI 与本地运行程序配对(例如可以使用 cuda)。


谢谢!这对于CUDA来说真的非常有用,就像你说的,甚至适用于苹果的ARM64架构! - melMass

2

除了 @iirekm 和 @riQQ 所说的内容之外,为了保持CI无关性并具有一些编排功能,您可以使用 Task 抽象出您的步骤,然后从您的Github Actions或任何其他CI/CD中调用您的任务。

这样您还可以获得在本地运行所有内容的好处。


1

通过使用Docker容器,可以在此处找到名为act的工具https://github.com/nektos/act。您可以在Docker容器内本地运行所有GitHub操作。 注意:act会构建所有必要的容器以运行操作。您只需按照文档说明使用该工具即可。


1
重复的答案 https://dev59.com/EFIH5IYBdhLWcg3wiPVR#60278805 - mhucka

0

另一种选择是将所有工作放入makefiles中,并使用GitHub Action调用make

这样,可以通过make命令在本地触发作业运行,也可以通过GitHub Action远程触发(同样使用make命令,但在GitHub Action内部)。

我在这里看到了这种方法的提及(这是线程上的顶级评论之一)。


这并不是完全相同的事情。这将导致所有操作在一个容器/ shell 进程的上下文中运行,对于单个服务来说还好,但一旦添加了数据库+缓存+后端+前端,它就不太适用了。 - OneCricketeer
Make是一个构建系统,而不是一个任务运行器。 - undefined

0
很令人惊讶的是,目前还没有官方的方法来实现这一点。Act似乎是一个很好的答案,但我想提出另外几个解决方案:
  1. Skaffold
  2. Earthly
这两个工具都可以让你在本地运行工作流,然后你的CICD只需一条命令即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接