在这里,我在一个作业下有两个工作流。我们希望达到的唯一目标是,我们希望通过使用缓存或其他方法重用容器映像。对于node_modules,我们也是这样做的
jobs:
build:
name: build
runs-on: [self-hosted, x64, linux, research]
container:
image: <sample docker image>
env:
NPM_AUTH_TOKEN: <sample token>
steps:
- uses: actions/checkout@v2
- name: Install
run: |
npm install
- name: Build
run: |
npm build
Test:
name: Test Lint
runs-on: [self-hosted, x64, linux, research]
container:
image: <sample docker image>
env:
NPM_AUTH_TOKEN: <sample token>
steps:
- uses: actions/checkout@v2
- name: Install Dependencies
run: npm ci
- name: Lint Check
run: npm run lint发布于 2022-03-20 18:48:44
为此,我建议使用码头工人的建造推进行动。通过build-push-action,您可以使用内联缓存、注册表缓存或实验性缓存后端API来缓存容器映像:
内联缓存
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: user/app:latest
cache-from: type=registry,ref=user/app:latest
cache-to: type=inline请参考Buildkit文档。
注册表缓存
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: user/app:latest
cache-from: type=registry,ref=user/app:buildcache
cache-to: type=registry,ref=user/app:buildcache,mode=max请参阅Buildkit文档。
缓存后端API
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: user/app:latest
cache-from: type=gha
cache-to: type=gha,mode=max请参阅Buildkit文档。
我个人更喜欢使用Cache后端API作为它的易于设置,并提供了一个很大的推动,以减少总的CI管道运行时间。
通过查看注释,您似乎希望在工作流之间共享Docker缓存。在这种情况下,可以使用以下示例在工作流中的作业之间共享Docker容器:
jobs:
build:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
tags: myimage:latest
outputs: type=docker,dest=/tmp/myimage.tar
-
name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: myimage
path: /tmp/myimage.tar
use:
runs-on: ubuntu-latest
needs: build
steps:
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Download artifact
uses: actions/download-artifact@v2
with:
name: myimage
path: /tmp
-
name: Load Docker image
run: |
docker load --input /tmp/myimage.tar
docker image ls -a发布于 2022-03-07 08:01:38
通常,GitHub操作中的作业之间不共享数据。作业实际上将在不同的临时VM上并行运行,除非您使用需求显式地创建依赖项。
GHA确实提供了缓存机制。对于包管理器类型缓存,他们将其简化,请参见这里。
对于坞映像,您可以使用docker缓存并将其缓存到远程注册表(包括ghcr),或者使用GHA 缓存动作,这可能更容易。操作/缓存的语法在页面上非常简单明了。对于buildx来说,文档始终是一个小问题(我认为,在很大程度上,因为他的构建非常聪明,以至于他们没有意识到我们有多么不了解他们心中的东西),所以您需要配置缓存操作,然后构建它来缓存它。
或者,您可以执行docker save imagename > imagename.tar并在缓存中使用它。这个这里有一个不错的例子。不知道是谁写的,但它起作用了。
https://stackoverflow.com/questions/71348621
复制相似问题