如何正确使用github-action上传镜像到ghcr.io

如何正确使用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

注意事项

  1. 默认密钥配置:无需手动设置 GITHUB_TOKEN,GitHub 会自动提供该密钥。

  2. 命名空间和标签替换:将示例中的镜像标签(tags)替换为实际项目名称和版本号。

运行 GitHub Actions 工作流程

成功推送后,可以在 GitHub 仓库的 Actions 页面查看任务执行日志。

image-20241230103958574

最终,可以在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

解决方法

  1. 修改 permissions 设置:

在 publish-image.yaml 中,确保权限设置如下:

jobs:
  publish:
  	permissions:
		  contents: read
		  packages: write
  1. 设置仓库访问权限:
  • 打开 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 🔗

lomtom

标题:如何正确使用github-action上传镜像到ghcr.io

作者:lomtom

链接:https://lomtom.cn/djyb02lharzg0