在没有官方操作的情况下使用 docker buildx github 操作缓存

Gui*_*ume 5 caching docker github-actions docker-buildkit github-actions-artifacts

长话短说:

如何手动ACTIONS_RUNTIME_TOKENACTIONS_CACHE_URL在 GitHub 中查找操作?

语境

我正在尝试在 GitHub 操作中的 buildkit 构建过程中缓存 docker 层。

理论上,使用docker/setup-buildx-actiondocker/build-push-actioncrazy-max/ghaction-github-runtime操作很容易。问题是,我不能使用它们(组织政策)。

我的工作流程的相关部分现在是:

$repo_url= "<ECR repo in aws>"
docker buildx create --use --driver=docker-container
docker buildx build --tag "${repo_url}:latest"  --file docker/Dockerfile . --cache-to "type=gha,mode=max" --cache-from type=gha
Run Code Online (Sandbox Code Playgroud)

缓存需要 2 个变量/配置:ACTIONS_RUNTIME_TOKENACTIONS_CACHE_URL。它们将由 来设置ghaction-github-runtime,因此我无法使用。查看代码,似乎从环境中导出了2个变量,但我找不到它们。

我如何在没有其他操作帮助的情况下手动找到它们?

Gui*_*ume 9

这有点恶心,但这是我想出的解决方案:

一、给工作流添加权限

permissions:
  id-token: write # Important for at least docker gha cache
  contents: read
Run Code Online (Sandbox Code Playgroud)

这将为您提供环境变量ACTIONS_ID_TOKEN_REQUEST_URLACTIONS_ID_TOKEN_REQUEST_TOKEN.

Docker gha 缓存需要 2 个变量:

  • ACTIONS_RUNTIME_TOKEN,这实际上是ACTIONS_ID_TOKEN_REQUEST_TOKEN
  • ACTIONS_CACHE_URL,由此可以推断出ACTIONS_ID_TOKEN_REQUEST_URL。GitHub 变量看起来像https://pipelines.actions.githubusercontent.com/<a long id>/<a lot of things>ACTIONS_CACHE_URLdocker 变量应该是https://artifactcache.actions.githubusercontent.com/<the long id from above>/

所以我最终的解决方案是:

export ACTIONS_CACHE_URL=$(echo "$ACTIONS_ID_TOKEN_REQUEST_URL" | grep -Po 'https://[^/]+/[^/]+/' | sed 's/pipelines/artifactcache/')
export ACTIONS_RUNTIME_TOKEN=$ACTIONS_ID_TOKEN_REQUEST_TOKEN

docker buildx build --load --file docker/Dockerfile . --cache-to "type=gha,mode=max" --cache-from type=gha
Run Code Online (Sandbox Code Playgroud)

现在我可以使用缓存而无需外部操作。