【Gitea Action 第三篇】动态标记Docker镜像版本号

一、前情回顾

在上一篇 【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_requestrefs/pull/2/mergepr-2
pushrefs/heads/mastermaster
pushrefs/heads/releases/v1releases-v1
push tagrefs/tags/v1.2.3v1.2.3, latest
push tagrefs/tags/v2.0.8-beta.67v2.0.8-beta.67, latest
workflow_dispatchrefs/heads/mastermaster

Semver 如下:

Event(事件输入)Ref(分支输入)Docker Tags(输出)
pull_requestrefs/pull/2/mergepr-2
pushrefs/heads/mastermaster
pushrefs/heads/releases/v1releases-v1
push tagrefs/tags/v1.2.31.2.3, 1.2, latest
push tagrefs/tags/v2.0.8-beta.672.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(完整镜像名称)
pushmain192.168.1.44:18123/temp/action-demo:main
pushrelease/v1.0.0192.168.1.44:18123/temp/action-demo:release-v1.0.0
push tagv1.0.0192.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 }}
         
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值