type
status
date
slug
summary
tags
category
icon
password
一、先来创建一个项目
首先在 github 上面创建一个私有项目
二、前置准备工作
1.推送ghcr.io
去 这个网站生成一个 token
PS:注意此 token 需要读写 packages 等权限 详情请见这里准备好你的要部署的服务器的 账号 和密码(当前页可以使用秘钥登录,这里暂且使用密码)想好你的镜像名称(此处以 web-image 为例)
2.推送hub.docker.com
1.首先当然是申请账号,然后在Account setting、security下面有个AccessToken,生成一个
2.然后在github项目的setting=>security下,找到secrets and variables
3.配置上DOCKERHUB_USER和DOCKERHUB_TOKEN
4.将dockerhub的image namespace改为自己的,因为官方的账号我们没有权限推送,只能推自己账号下的空间
三、编写 github action
1、在源仓库的
.github/workflows
目录创建一个 publish-image.yml
2、在workflow文件中设置触发条件和作业(jobs)"
"示例代码如下:"
name: Docker Hub on: push: branches: [dev] tags: ["v*.*.*"] pull_request: branches: [dev] env: REGISTRY: docker.io IMAGE_NAME: ${{ secrets.DOCKER_USERNAME }}/pandora-web jobs: build: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Log into Docker Hub if: github.event_name != 'pull_request' uses: docker/login-action@v1 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Extract Docker metadata id: meta uses: docker/metadata-action@v3 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=sha type=ref,event=branch,branch=dev type=semver,pattern={{version}} - name: Build and push Docker image uses: docker/build-push-action@v2 with: context: . platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
这段代码是一个GitHub Actions的工作流程配置文件,用于自动化构建和推送Docker镜像到Docker Hub。它在特定的条件下(如代码推送到特定分支或创建拉取请求时)触发。以下是详细解释:
工作流程名称
name: Docker Hub
工作流程的名称为“Docker Hub”。
触发条件
on: push: branches: [dev] tags: ["v*.*.*"] pull_request: branches: [dev]
该工作流程会在以下情况下触发:
- 当代码推送到
dev
分支时。
- 当推送带有特定模式(
v*.*.*
)的标签时。
- 当针对
dev
分支创建拉取请求时。
环境变量
env: REGISTRY: docker.io IMAGE_NAME: ${{ secrets.DOCKER_USERNAME }}/pandora-web
定义了一些环境变量:
REGISTRY
:Docker注册表地址,设为docker.io
。
IMAGE_NAME
:Docker镜像名称,包含了从机密变量中读取的Docker用户名和固定的镜像名称pandora-web
。
工作流的任务定义
jobs: build: runs-on: ubuntu-latest permissions: contents: read packages: write
定义了一个名为
build
的任务,运行环境为ubuntu-latest
。并且设置了权限,允许读取内容和写入包。步骤定义
- 检出代码仓库
- name: Checkout repository uses: actions/checkout@v2
使用
actions/checkout@v2
动作检出代码仓库。- 设置Docker Buildx
- name: Set up Docker Buildx uses: docker/setup-buildx-action@v1
使用
docker/setup-buildx-action@v1
设置Docker Buildx,用于构建多平台镜像。- 登录Docker Hub
- name: Log into Docker Hub if: github.event_name != 'pull_request' uses: docker/login-action@v1 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }}
这一步在非拉取请求的事件中执行,使用
docker/login-action@v1
登录Docker Hub。用户名和密码从机密变量中读取。- 提取Docker元数据
- name: Extract Docker metadata id: meta uses: docker/metadata-action@v3 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=sha type=ref,event=branch,branch=dev type=semver,pattern={{version}}
使用
docker/metadata-action@v3
提取Docker元数据并生成标签。根据不同的类型生成标签,如基于SHA的标签、分支标签(当事件为分支推送且分支为dev时)、和基于语义版本(semver)的标签。- 构建并推送Docker镜像
context
:构建上下文,当前目录。platforms
:指定目标平台(amd64和arm64)。push
:只有在不是拉取请求的事件中才推送镜像。tags
:使用从上一步骤中提取的标签。labels
:使用从上一步骤中提取的标签。
- name: Build and push Docker image uses: docker/build-push-action@v2 with: context: . platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
使用
docker/build-push-action@v2
构建并推送Docker镜像:总体来说,这个GitHub Actions配置文件实现了在特定条件下自动化构建和推送Docker镜像的功能。
四、修改的配置
1.创建版本号文件
- 创建
VERSION
文件: - 在你的代码仓库根目录下创建一个名为
VERSION
的文件。 - 文件内容为当前的版本号,例如:
1.0.0
这样配置之后,每次在
dev
分支推送代码时,GitHub Actions将自动递增版本号,构建Docker镜像,并推送到Docker Hub,同时保留所有之前的版本。2.新增的修改
- 读取当前版本号。
- 递增版本号。
- 更新并提交新的版本号。
- 构建并推送带有版本号和
latest
标签的Docker镜像
name: Docker Hub on: push: branches: [dev] pull_request: branches: [dev] env: REGISTRY: docker.io IMAGE_NAME: ${{ secrets.DOCKER_USERNAME }}/pandora-web jobs: build: runs-on: ubuntu-latest permissions: contents: write packages: write steps: - name: Checkout repository uses: actions/checkout@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Log into Docker Hub if: github.event_name != 'pull_request' uses: docker/login-action@v1 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Get current version id: get_version run: echo "CURRENT_VERSION=$(cat VERSION)" >> $GITHUB_ENV - name: Increment version id: increment_version run: | VERSION_PARTS=(${CURRENT_VERSION//./ }) NEW_PATCH=$((VERSION_PARTS[2]+1)) NEW_VERSION="${VERSION_PARTS[0]}.${VERSION_PARTS[1]}.$NEW_PATCH" echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV echo $NEW_VERSION > VERSION - name: Commit new version run: | git config --global user.name 'github-actions' git config --global user.email '[email protected]' git add VERSION git commit -m "Increment version to ${{ env.NEW_VERSION }}" git push - name: Extract Docker metadata id: meta uses: docker/metadata-action@v3 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=raw,value=${{ env.NEW_VERSION }} type=raw,value=latest labels: | type=raw,value=${{ env.NEW_VERSION }} type=raw,value=latest - name: Build and push Docker image uses: docker/build-push-action@v2 with: context: . platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
- 作者:悟然
- 链接:https://notion.zyqn.site/article/GitHub%20action
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章