注:GitHub Enterprise Server 2.22 上的 GitHub Actions 支持是有限的公测版。 测试已结束。 GitHub Actions 现在一般可用于 GitHub Enterprise Server 3.0 或更新版本。 更多信息请参阅 GitHub Enterprise Server 3.0 发行说明。
- 有关升级到 GitHub Enterprise Server 3.0 或更新版本的更多信息,请参阅“升级 GitHub Enterprise Server”。
- 有关在升级后配置 GitHub Actions 的更多信息,请参阅 GitHub Enterprise Server 3.0 的文档。
注: GitHub 托管的运行器目前在 GitHub Enterprise Server 上不受支持。 您可以在 GitHub 公共路线图 上查看有关未来支持计划的更多信息。
简介
本指南介绍如何创建执行 Docker 构建的工作流程,然后将 Docker 映像发布到 Docker Hub 或 GitHub Packages。 通过单个工作流程,您可以将映像发布到单一注册表或多个注册表。
注意:如果要推送到另一个第三方 Docker 注册表,则“发布映像到 GitHub Packages”部分可作为一个很好的模板。
基本要求
建议基本了解工作流程配置选项和如何创建工作流程文件。 更多信息请参阅“Learn GitHub Actions”。
您可能还发现基本了解以下内容是有帮助的:
- 加密的密码"
- "工作流程中的身份验证"
- “使用 Docker 注册表”
关于映像配置
本指南假定您对存储在 GitHub 仓库的 Docker 映像有完整的定义。 例如,仓库必须包含 Dockerfile 以及执行 Docker 构建所需的任何其他文件才可创建映像。
在本指南中,我们将使用 Docker build-push-action
操作来构建 Docker 映像并将其推送到一个或多个 Docker 注册表。 更多信息请参阅 build-push-action
。
注:您的 GitHub Enterprise Server 实例 上的 GitHub Actions 对 GitHub.com 或 GitHub Marketplace 上的操作具有有限的访问权限。 更多信息请参阅“自托管运行器与 GitHub 之间的通信”。
将映像发布到 Docker Hub
每次在 GitHub 上创建新版本时,都可以触发工作流程来发布映像。 以下示例中的工作流程在活动类型为 created
的 release
事件触发时运行。 有关 release
事件的更多信息,请参阅“触发工作流程的事件”。
在下面的示例工作流程中,我们使用 Docker login-action
和 build-push-action
操作构建 Docker 映像,如果构建成功,则将构建映像推送到 Docker Hub。
要推送到 Docker Hub,您需要有一个 Docker Hub 帐户,并创建一个 Docker Hub 仓库。 更多信息请参阅 Docker 文档中的“将 Docker 容器映像推送到 Docker Hub”。
Docker Hub 需要的 login-action
选项包括:
username
和password
:这是您的 Docker Hub 用户名和密码。 我们建议将 Docker Hub 用户名和密码存储为机密,使它们不会公开在工作流程文件中。 更多信息请参阅“创建和使用加密密码”。
Docker Hub 需要的 metadata-action
选项包括:
images
:您构建/推送到 Docker Hub 的 Docker 映像的命名空间和名称。
Docker Hub 需要的 build-push-action
选项包括:
tags
:新映像的标记,格式为DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION
。 您可以如下所示设置单个标记,或在列表中指定多个标记。push
:如果设置为true
,则映像在构建成功后将被推送到注册表。
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档管理。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: my-docker-hub-namespace/my-docker-hub-repository
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
上述工作流程检出 GitHub 仓库,使用 login-action
登录到注册表,然后使用 build-push-action
操作:基于仓库的 Dockerfile
构建 Docker 映像;将该映像推送到 Docker Hub,然后应用标记到映像。
发布映像到 GitHub Packages
每次在 GitHub 上创建新版本时,都可以触发工作流程来发布映像。 以下示例中的工作流程在活动类型为 created
的 release
事件触发时运行。 有关 release
事件的更多信息,请参阅“触发工作流程的事件”。
在下面的示例工作流程中,我们使用 Docker login-action
和 build-push-action
操作构建 Docker 映像,如果构建成功,则将构建的映像推送到 GitHub Packages。
GitHub Packages 需要的 login-action
选项包括:
registry
:必须设置为docker.pkg.github.com
。username
:您可以使用${{ github.actor }}
上下文自动使用触发工作流程运行的用户的用户名。 更多信息请参阅“上下文”。password
:您可以使用自动生成的GITHUB_TOKEN
密码作为密码。 更多信息请参阅“使用 GITHUB_TOKEN 验证身份”。
GitHub Packages 需要的 build-push-action
选项为:
push
:如果设置为true
,则映像在构建成功后将被推送到注册表。tags
:必须设置为格式docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION
。 例如,对于http://github.com/octo-org/octo-repo
上名为octo-image
stored on GitHub 的映像,tags
选项应设置为docker.pkg.github.com/octo-org/octo-repo/octo-image:latest
。 您可以如下所示设置单个标记,或在列表中指定多个标记。
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档管理。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to GitHub Packages
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to GitHub Docker Registry
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: |
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.sha }}
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.event.release.tag_name }}
The above workflow checks out the GitHub repository, uses the login-action
to log in to the registry, and then uses the build-push-action
action to: build a Docker image based on your repository's Dockerfile
; push the image to the Docker registry, and apply the commit SHA and release version as image tags.
发布映像到 Docker Hub 和 GitHub Packages
在单一工作流程中,您可以对每个注册表使用 login-action
和 build-push-action
> 操作,以将 Docker 映像发布到多个注册表。
下面的示例工作流程使用前面章节中的步骤(“发布映像到 Docker Hub”和“发布映像到 GitHub Packages”)来创建同时推送到两个注册表的单一工作流程。
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档管理。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registries:
name: Push Docker image to multiple registries
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Log in to the Docker registry
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: |
my-docker-hub-namespace/my-docker-hub-repository
docker.pkg.github.com/${{ github.repository }}/my-image
- name: Build and push Docker images
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
上面的工作流程检出 GitHub 仓库,使用两次 login-action
操作登录两个注册表,然后使用 metadata-action
操作生成标记和标签。 然后,build-pow-action
操作构建并推送 Docker 映像到 Docker Hub 和 Docker 注册表。