从 GitHub Actions 推送镜像到 Vercel 容器注册表

从 GitHub Actions 推送镜像到 Vercel 容器注册表

💡 原文英文,约300词,阅读约需1分钟。
📝

内容提要

Vercel 推出新 GitHub Action,通过 OIDC 认证将容器镜像推送到 Vercel 容器注册表,无需存储长期凭证。工作流用 OIDC 令牌换取短期 Vercel 令牌登录,任务结束自动注销并撤销。需配置 OIDC 策略、团队 ID 等变量并授予 id-token 写入权限,随后即可构建推送镜像,也可用作 Vercel 沙箱自定义镜像。

🔎

延伸解读

OIDC 认证如何提升安全性

传统方式需在 GitHub 仓库中存储长期有效的注册表凭证,一旦泄露风险较高。新方案利用 GitHub OIDC 令牌换取短期 Vercel 访问令牌,任务结束即自动注销并撤销令牌。这意味着凭证生命周期与工作流绑定,无需人工轮换,显著降低了凭证泄露和滥用的可能性。

配置要点与权限设置

使用前需在 Vercel 团队创建 OIDC 策略,匹配 GitHub 仓库和工作流,并授予 VCR 读写权限。同时将团队 ID、团队 slug、项目 slug 和仓库名存储为 GitHub 仓库变量。工作流必须授予 id-token: write 权限,否则无法获取 OIDC 令牌。这些步骤是认证成功的关键,缺一不可。

构建推送与自定义镜像用途

登录后即可使用 docker/build-push-action 构建并推送镜像,示例中指定了 linux/amd64 平台和 zstd 压缩。推送完成后,镜像可作为 Vercel Sandbox 的自定义镜像,在同一项目内通过 <repository>:<tag> 引用。这为需要特定运行时环境的沙箱任务提供了灵活性。

引擎兼容性与注意事项

该 Action 默认认证 Docker,但也支持通过 engines 参数改用 Podman 或 Buildah。推送时需注意镜像标签格式,需包含团队 slug、项目 slug 和仓库名。此外,示例中设置了 provenance: false,可能为避免构建证明影响推送,实际使用时可根据需求调整。

❓

Q&A

如何在不存储长期凭证的情况下从 GitHub Actions 推送镜像到 Vercel 容器注册表?

使用新的 vercel/vcr-action/login action,通过 GitHub OIDC 认证。该 action 将工作流的 OIDC 令牌换取短期 Vercel 访问令牌,然后登录到 vcr.vercel.com。任务结束时自动注销并撤销令牌,无需存储长期凭证。

配置 Vercel 容器注册表推送需要设置哪些变量和权限?

需要在 Vercel 团队创建 OIDC 策略,匹配 GitHub 仓库和工作流并授予 VCR 读写权限。将 Vercel 团队 ID 存储为 GitHub 仓库变量(如 VERCEL_TEAM_ID),同时存储团队 slug、项目 slug 和仓库名用于镜像标签。工作流或任务需授予 id-token: write 权限。

vercel/vcr-action/login 在任务结束后会自动执行什么操作?

当任务结束时,该 action 会自动注销并撤销 Vercel 令牌,确保短期凭证不被保留。

除了 Docker,这个 action 还支持哪些容器引擎?

该 action 默认认证 Docker,但可以通过传递 engines 参数来使用 Podman 或 Buildah。

推送镜像到 Vercel 容器注册表后,如何将其用作 Vercel 沙箱的自定义镜像?

当 VCR 完成准备 linux/amd64 镜像后,可以在同一项目中通过 <repository>:<tag> 引用该镜像作为自定义 Vercel 沙箱镜像。

能否提供一个完整的 GitHub Actions 工作流示例来推送镜像到 Vercel 容器注册表?

可以。示例工作流包括:在 push 到 main 分支时触发,设置 permissions 包含 contents: read 和 id-token: write。步骤依次为:actions/checkout@v4、docker/setup-buildx-action@v3、使用 vercel/vcr-action/login@v1 并传入 team 变量、最后使用 docker/build-push-action@v6 构建并推送镜像,标签格式为 vcr.vercel.com/${{ vars.VERCEL_TEAM_SLUG }}/${{ vars.VERCEL_PROJECT_SLUG }}/${{ vars.VCR_REPOSITORY }}:latest。

🏷️

标签

➡️

继续阅读