GitHub Actions Docker 缓存

10
我认为这对许多人都会有所帮助。
我正在使用https://github.com/phips28/gh-action-bump-version自动在Github Actions中提高NPM版本。
有没有办法缓存此操作的docker镜像,以便不必每次构建镜像?它需要很长时间才能运行,并且在其余步骤之前运行。我确定这对于类似的拉取docker镜像的Github Actions是常见的问题。
Docker镜像看起来非常精简,因此我不确定尝试优化镜像本身是否会有任何好处。更多关注如何配置Github Actions。
有什么建议吗?
2个回答

8

简述

可以!您可以更改GitHub工作流文件,从存储库中拉取图像而不是每次构建。虽然这样做无法缓存图像,但速度明显更快。可以通过编辑您的流程来实现以下效果:

      - name: 'Automated Version Bump'
        id: version-bump
        uses: 'docker://phips28/gh-action-bump-version:master'
        with:
          tag-prefix: 'v'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


请注意在uses:语句中的docker://前缀,以及从@master更改为:master,以将名称转换为有效的镜像名称。
我已经在该存储库上打开了一个PR并提出了建议的修复:^)

原始响应

这是一个非常好的问题,在官方文档中很难找到关于这个问题的信息(尽管GitHub承认他们的文档有延迟)。

GitHub员工回复

我为您搜索到了一篇文章,它来自于GitHub社区论坛,发布于2019年9月,正好讨论了这个话题。它不可避免地链接到了这篇文章,该文章发布于2019年7月。

有一个关于如何每次构建仍然利用Docker构建缓存的精彩解释,从而减少时间,但允许在使用最新版本的基础镜像等方面具有灵活性。

如果您不关心更新的灵活性,只想获得最短的构建时间,那么有一个提议的解决方案,尽管我不确定当前该语法是否仍然有效:

但是假设我不希望我的操作每次运行时甚至评估Dockerfile,因为我想要绝对最快的运行时间。我想要预定义的Docker容器被启动并立即开始工作。你也可以做到这一点!如果您创建了一个Docker镜像并将其上传到Docker Hub或其他公共注册表,则可以使用uses键中的docker://形式指示您的操作专门使用该Docker镜像。有关详细信息,请参见GitHub Actions文档72。这需要更多的前期工作和维护,但是如果您不需要上述Dockerfile评估系统提供的灵活性,则可能值得权衡。

很遗憾,指向Github actions文档的链接已经损坏,但这表明如果动作者修改他们的操作,他们可以允许这种行为。
备选想法
如果您需要控制执行程序主机上的缓存(以真正地缓存映像),则可以考虑托管自己的GitHub运行程序,因为您将完全控制那里的映像。尽管我想象这可能是一个障碍,鉴于GitHub actions基本上是一个免费服务(有限制,这也许是其中之一!)
你可能想考虑添加一个利用 文件缓存操作 的任务,并尝试通过 docker commitdocker savegh-action-bump-version 导出到文件内容,然后在下一次运行时重新inflate它。但是,这会增加复杂性,并且从长远来看可能不会节省时间。 编辑: 现在我们知道操作可以支持从仓库拉取镜像,这是一个可怕的想法。希望这可以帮助你和其他正在寻找更多信息的人。

另一个选项是使用不同的dockerfile构建镜像,发布它,然后将其用作操作Dockerfile的FROM。你觉得呢? - patrick
你说得对,这样做确实可以在不编辑yaml的情况下拉取图像。这会给操作作者增加一些“复杂性”,并且可能需要比从一开始就拉取图像更长的时间,因为它仍然需要检出操作存储库。 - TheQueenIsDead
我还发现你可以将一个Docker镜像放在action.yml中,这样似乎更快,以下是一个例子:https://github.com/strawberry-graphql/release-cards/blob/main/action.yml#L15 - patrick
我认为那个也是做同样的事情,只不过语法不同,很好发现!你有没有找到任何GitHub文档表明这是可能的?我们应该考虑提交更改以使其非常明显地成为可能。 - TheQueenIsDead
1
是的,它在这里有详细记录:https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-docker-actions :) - patrick
不错的发现!当我最初搜索时,那个页面似乎逃过了我的注意。 - TheQueenIsDead

-1

4
我不认为这是Saul Frank想要的答案。 这篇文章展示了如何在构建Docker镜像时缓存层,而我们在这里想要使用一个使用Docker的外部操作,而此操作是在“设置”阶段构建的,我们无法控制。 - Dalpapa

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