一、前情回顾
在上一篇 【Gitea Action 第二篇】上手体验 中,针对工程进行 Docker 镜像构建,并推送到 Harbor 私服,以待部署所用。但对于镜像版本号的标记还不够灵活,需要硬编码在 action 文件中。
二、预览
本篇会在第二篇基础上,增加使用 metadata-action
,实现从 Git 引用或 Gitea 事件中提取元数据,并对 Docker 镜像进行标记。
三、初识 metadata-action
metadata-action
是一个开源的 GitHub Action(适用于Gitea),用于从 Git 引用和 GitHub 事件中提取元数据。结合 build-push-action
一起使用,可便捷的标记 Docker 镜像。
用白话描述即:此工具会根据不同的 Gitea 事件(推送、PR等)以及分支名称作为输入,输出不同的 Tag,工具提供了两种常用输出模式,Basic
以及 Semver
,其中 Basic 如下:
Event(事件输入) | Ref(分支输入) | Docker Tags(输出) |
---|---|---|
pull_request | refs/pull/2/merge | pr-2 |
push | refs/heads/master | master |
push | refs/heads/releases/v1 | releases-v1 |
push tag | refs/tags/v1.2.3 | v1.2.3 , latest |
push tag | refs/tags/v2.0.8-beta.67 | v2.0.8-beta.67 , latest |
workflow_dispatch | refs/heads/master | master |
Semver 如下:
Event(事件输入) | Ref(分支输入) | Docker Tags(输出) |
---|---|---|
pull_request | refs/pull/2/merge | pr-2 |
push | refs/heads/master | master |
push | refs/heads/releases/v1 | releases-v1 |
push tag | refs/tags/v1.2.3 | 1.2.3 , 1.2 , latest |
push tag | refs/tags/v2.0.8-beta.67 | 2.0.8-beta.67 |
四、配置 Action 文件
在 Action 文件中增加 metadata-action
步骤。
# 提取元数据
- name: Docker meta
id: meta
uses: http://192.168.1.43:3000/actions/metadata-action@v4 # ①号说明
with:
images: |
name=192.168.1.44:18123/temp/action-demo # ②号说明
tags: |
type=ref,event=branch # ③号说明
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
# 构建并推送 Docker 镜像
- name: Build and push docker image
uses: docker/build-push-action@v4
env:
ACTIONS_RUNTIME_TOKEN: ''
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }} # ④号说明
复制使用时,记得删除 #
开头的注释内容。
解释:
①:在前文有提到过,由于网络问题,将工程 clone 到了本地仓库,故如此写法,如果网络条件支持,可以替换成 docker/metadata-action@v4
。
②:镜像的基础名称
③:规则的定义
实际运行输出例子:
Event(事件) | Ref(分支名称) | Image Full Name(完整镜像名称) |
---|---|---|
push | main | 192.168.1.44:18123/temp/action-demo:main |
push | release/v1.0.0 | 192.168.1.44:18123/temp/action-demo:release-v1.0.0 |
push tag | v1.0.0 | 192.168.1.44:18123/temp/action-demo:1.0.0 192.168.1.44:18123/temp/action-demo:1.0 192.168.1.44:18123/temp/action-demo:latest |
五、完整 Action 一览
# 触发条件,只在 master 或 main 分支发送推送时触发
on:
push:
branches: [ master, main ]
# 工作流的名称
name: release
# 作业,工作流运行由一个或多个 jobs 组成,默认情况下并行运行
jobs:
# job ID
release:
# 定义要运行作业的计算机类型
runs-on: ubuntu-latest
# 指定容器映像,默认使用的是一个基于Node的镜像,没有内置docker
container: catthehacker/ubuntu:act-latest
# 作业任务
steps:
# 检出代码
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
# 设置 Docker BuildX
- name: Set up Docker BuildX
uses: docker/setup-buildx-action@v2.6.0
# 登录 Harbor
- name: Login to Harbor
uses: docker/login-action@v2
with:
registry: ${{ secrets.HARBOR_REGISTRY }}
username: ${{ secrets.HARBOR_USERNAME }}
password: ${{ secrets.HARBOR_PASSWORD }}
# 安装 JDK
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'oracle'
java-version: 17
# 安装 Maven
- name: Setup maven
uses: actions/setup-maven@v4.5
with:
maven-version: 3.8.4
# Maven 打包
- name: Maven package
run: mvn clean package
# 提取元数据
- name: Docker meta
id: meta
uses: http://192.168.1.43:3000/actions/metadata-action@v4
with:
images: |
name=192.168.1.44:18123/temp/action-demo
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
# 构建并推送 Docker 镜像
- name: Build and push docker image
uses: docker/build-push-action@v4
env:
ACTIONS_RUNTIME_TOKEN: ''
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}