如何正确使用github-action上传镜像到ghcr.io
- 今天
在现代软件开发中,自动化构建和部署是提升效率的关键环节,许多开源项目托管在 GitHub 上,其构建产物也常常通过 GitHub Packages 发布和分发。
GitHub Actions 作为 GitHub 提供的持续集成和持续部署(CI/CD)平台,可以帮助开发者在代码推送时自动执行构建、测试和部署等任务。
本文将介绍如何使用 GitHub Actions 将 Docker 镜像自动构建并上传到 GitHub Container Registry(ghcr.io)。
项目结构
首先,确保你的项目目录包含以下结构:
├── .github
│ └── workflows
│ └── publish-image.yaml
└── Dockerfile
其中:
- Dockerfile:定义 Docker 镜像的构建步骤。
- .github/workflows/publish-image.yaml:GitHub Actions 的工作流程文件,用于自动化任务配置。
GitHub Actions
配置 GitHub Actions 工作流程
在 publish-image.yaml 文件中,我们将设置一个工作流程,在代码推送到 main 分支时自动执行以下步骤:
1. 检出代码:使用官方的 actions/checkout 操作,将最新的代码检出。
2. 设置 Docker Buildx:使用 docker/setup-buildx-action 操作,配置用于构建多平台镜像的环境。
3. 登录到 GitHub 容器注册表:使用 docker/login-action 操作,登录到 ghcr.io。
4. 构建并推送镜像:使用 docker/build-push-action 操作,构建并推送 Docker 镜像到 ghcr.io。
以下是示例配置文件:
name: "Publish Container Image"
on:
push:
branches: [ main ]
jobs:
publish:
runs-on: ubuntu-20.04
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v2.3.5
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Login to GitHub Package Registry
uses: docker/login-action@v1.12.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v2.7.0
with:
context: .
platforms: linux/amd64,linux/arm64/v8
push: true
tags: ghcr.io/lomtom/spark-dependencies:1.62.0
注意事项
-
默认密钥配置:无需手动设置 GITHUB_TOKEN,GitHub 会自动提供该密钥。
-
命名空间和标签替换:将示例中的镜像标签(tags)替换为实际项目名称和版本号。
运行 GitHub Actions 工作流程
成功推送后,可以在 GitHub 仓库的 Actions 页面查看任务执行日志。
最终,可以在Package中查看到推送的代码:
问题
解决 403 Forbidden 错误
在执行上述工作流程时,可能会遇到以下错误:
ERROR: failed to solve: failed to push ghcr.io/your-username/your-image-name: unexpected status from POST request to https://ghcr.io/v2/your-username/your-image-name/blobs/uploads/: 403 Forbidden
解决方法
- 修改 permissions 设置:
在 publish-image.yaml 中,确保权限设置如下:
jobs:
publish:
permissions:
contents: read
packages: write
- 设置仓库访问权限:
- 打开 GitHub 仓库,点击右上角的 Settings。
- 在左侧菜单中,选择 Actions > General。
- 在 Workflow permissions 部分,选择 Read and write permissions。
- 点击 Save 保存设置。
完成上述配置后,重新运行工作流程,即可成功推送镜像至 ghcr.io。
参考资料
• 使用 GitHub Actions 发布和安装包 🔗
• Working with the Container registry 🔗
• Publishing Docker images 🔗
• Workflow syntax for GitHub Actions 🔗