Files
xgj/trigger-version/action.yml
Lyda 6fff7a90e1 feat(trigger-version): 添加标签过滤功能支持通配符匹配和排除
新增 `tag-match` 和 `tag-exclude` 输入参数,支持通过通配符模式匹配和排除特定标签
更新 README 文档并添加示例配置文件展示标签过滤功能的使用场景
2025-08-22 13:22:31 +08:00

246 lines
10 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: "Trigger Version Info"
description: "获取触发版本信息,支持标签触发、版本分支触发和常规分支触发"
author: "Your Organization"
inputs:
version-prefix:
description: "版本前缀用于匹配版本标签或分支默认v"
required: false
default: "v"
use-latest-version:
description: "在非版本触发时是否使用当前分支最新的版本标签默认false"
required: false
default: "false"
tag-match:
description: "标签匹配模式支持通配符v*.*.* 或 v[0-9]*),用于进一步过滤标签"
required: false
default: ""
tag-exclude:
description: "标签排除模式,支持通配符(如:*-alpha* 或 *-beta*),匹配的标签将被排除"
required: false
default: ""
outputs:
ref-type:
description: "引用类型 (tag/branch)"
value: ${{ steps.get-version-info.outputs.ref_type }}
ref-name:
description: "引用名称"
value: ${{ steps.get-version-info.outputs.ref_name }}
is-version-trigger:
description: "是否为版本触发true/false"
value: ${{ steps.get-version-info.outputs.is_version_trigger }}
trigger-version:
description: "触发的版本号标准化为v开头的格式"
value: ${{ steps.get-version-info.outputs.trigger_version }}
trigger-source:
description: "触发源tag/branch"
value: ${{ steps.get-version-info.outputs.trigger_source }}
full-ref:
description: "完整的 Git 引用"
value: ${{ steps.get-version-info.outputs.full_ref }}
version-with-dash:
description: "版本号点替换为横线例如v1.2.3 -> v1-2-3"
value: ${{ steps.get-version-info.outputs.version_with_dash }}
latest-version:
description: "仓库中的最新版本号始终获取格式如v1.2.3"
value: ${{ steps.get-version-info.outputs.latest_version }}
latest-version-with-dash:
description: "最新版本号点替换为横线例如v1.2.3 -> v1-2-3"
value: ${{ steps.get-version-info.outputs.latest_version_with_dash }}
runs:
using: "composite"
steps:
- name: 获取触发版本信息
id: get-version-info
shell: bash
run: |
# 获取最新版本号的函数
get_latest_version() {
local prefix="$1"
local tag_match="$2"
local tag_exclude="$3"
local latest_version=""
local latest_version_with_dash=""
echo "🔍 开始获取最新版本号(前缀:${prefix}..."
[[ -n "$tag_match" ]] && echo "🎯 标签匹配模式: $tag_match"
[[ -n "$tag_exclude" ]] && echo "🚫 标签排除模式: $tag_exclude"
# 检查git仓库是否可用
if git rev-parse --git-dir > /dev/null 2>&1; then
echo "✅ Git仓库可用开始获取标签..."
# 确保获取所有标签信息GitHub Actions 默认是浅克隆)
echo "📥 获取远程标签信息..."
git fetch --tags --quiet 2>/dev/null || echo "⚠️ 获取远程标签失败,继续使用本地标签"
# 获取所有匹配的标签
echo "🏷️ 查找匹配前缀 '${prefix}' 的标签..."
local all_tags=$(git tag --list "${prefix}*" 2>/dev/null)
if [[ -n "$all_tags" ]]; then
# 应用标签匹配过滤
if [[ -n "$tag_match" ]]; then
echo "🔍 应用标签匹配过滤: $tag_match"
local filtered_tags=""
while IFS= read -r tag; do
if [[ "$tag" == $tag_match ]]; then
filtered_tags="$filtered_tags$tag\n"
fi
done <<< "$all_tags"
all_tags=$(echo -e "$filtered_tags" | sed '/^$/d')
echo "📋 匹配后的标签数量: $(echo "$all_tags" | wc -l | tr -d ' ')"
fi
# 应用标签排除过滤
if [[ -n "$tag_exclude" && -n "$all_tags" ]]; then
echo "🚫 应用标签排除过滤: $tag_exclude"
local filtered_tags=""
while IFS= read -r tag; do
if [[ "$tag" != $tag_exclude ]]; then
filtered_tags="$filtered_tags$tag\n"
fi
done <<< "$all_tags"
all_tags=$(echo -e "$filtered_tags" | sed '/^$/d')
echo "📋 排除后的标签数量: $(echo "$all_tags" | wc -l | tr -d ' ')"
fi
if [[ -n "$all_tags" ]]; then
# echo "最终标签列表:"
# echo "$all_tags"
# 获取最新的版本标签
if command -v sort >/dev/null 2>&1; then
# 使用 sort 命令进行版本排序
latest_version=$(echo "$all_tags" | sort -V | tail -1)
else
# 如果没有 sort -V使用简单的字典序排序
latest_version=$(echo "$all_tags" | sort | tail -1)
fi
if [[ -n "$latest_version" ]]; then
# 生成带横线的版本号
latest_version_with_dash=$(echo "$latest_version" | sed 's/\./-/g')
echo "📦 找到最新版本: $latest_version"
echo "📦 横线格式版本: $latest_version_with_dash"
else
echo "⚠️ 未能确定最新版本"
fi
else
echo "⚠️ 过滤后没有找到匹配的版本标签"
fi
else
echo "⚠️ 未找到匹配前缀 '${prefix}' 的版本标签"
fi
else
echo "❌ Git仓库不可用"
fi
# 设置全局变量
LATEST_VERSION="$latest_version"
LATEST_VERSION_WITH_DASH="$latest_version_with_dash"
}
# 获取GitHub上下文信息
echo "触发方式: ${{ github.event_name }}"
echo "引用类型: ${{ github.ref_type }}"
echo "引用名称: ${{ github.ref_name }}"
echo "完整引用: ${{ github.ref }}"
REF_TYPE="${{ github.ref_type }}"
REF_NAME="${{ github.ref_name }}"
FULL_REF="${{ github.ref }}"
VERSION_PREFIX="${{ inputs.version-prefix }}"
USE_LATEST_VERSION="${{ inputs.use-latest-version }}"
TAG_MATCH="${{ inputs.tag-match }}"
TAG_EXCLUDE="${{ inputs.tag-exclude }}"
# 获取最新版本号(无论触发方式如何都获取)
get_latest_version "$VERSION_PREFIX" "$TAG_MATCH" "$TAG_EXCLUDE"
# 判断是否为标签触发
if [[ "$REF_TYPE" == "tag" ]]; then
# 标准化版本号为v开头格式
if [[ "$REF_NAME" == ${VERSION_PREFIX}* ]]; then
TRIGGER_VERSION=$REF_NAME
else
TRIGGER_VERSION=${VERSION_PREFIX}$REF_NAME
fi
# 生成带横线的版本号
VERSION_WITH_DASH=$(echo "$TRIGGER_VERSION" | sed 's/\./-/g')
echo "🏷️ 标签触发: $REF_NAME"
echo "标准化版本号: $TRIGGER_VERSION"
echo "横线版本号: $VERSION_WITH_DASH"
IS_VERSION_TRIGGER=true
TRIGGER_SOURCE=tag
elif [[ "$REF_TYPE" == "branch" && "$REF_NAME" == ${VERSION_PREFIX}* ]]; then
# 版本分支触发
TRIGGER_VERSION=$REF_NAME
# 生成带横线的版本号
VERSION_WITH_DASH=$(echo "$TRIGGER_VERSION" | sed 's/\./-/g')
echo "🔄 版本分支触发: $REF_NAME"
echo "标准化版本号: $TRIGGER_VERSION"
echo "横线版本号: $VERSION_WITH_DASH"
IS_VERSION_TRIGGER=true
TRIGGER_SOURCE=branch
else
# 常规分支触发
echo "🆕 常规分支触发: $REF_NAME"
if [[ "$USE_LATEST_VERSION" == "true" ]]; then
# 使用已获取的最新版本
if [[ -n "$LATEST_VERSION" ]]; then
TRIGGER_VERSION=$LATEST_VERSION
VERSION_WITH_DASH=$LATEST_VERSION_WITH_DASH
echo "📦 使用最新版本标签: $LATEST_VERSION"
echo "标准化版本号: $TRIGGER_VERSION"
echo "横线版本号: $VERSION_WITH_DASH"
IS_VERSION_TRIGGER=true
else
# 没有找到版本标签
echo "⚠️ 未找到匹配前缀 '${VERSION_PREFIX}' 的版本标签,使用空版本"
IS_VERSION_TRIGGER=false
TRIGGER_VERSION=""
VERSION_WITH_DASH=""
fi
else
# 不使用最新版本
IS_VERSION_TRIGGER=false
TRIGGER_VERSION=""
VERSION_WITH_DASH=""
fi
TRIGGER_SOURCE=branch
fi
# 设置环境变量
echo "IS_VERSION_TRIGGER=$IS_VERSION_TRIGGER" >> $GITHUB_ENV
echo "TRIGGER_VERSION=$TRIGGER_VERSION" >> $GITHUB_ENV
echo "VERSION_WITH_DASH=$VERSION_WITH_DASH" >> $GITHUB_ENV
echo "TRIGGER_SOURCE=$TRIGGER_SOURCE" >> $GITHUB_ENV
# 输出到 step outputs
echo "ref_type=$REF_TYPE" >> $GITHUB_OUTPUT
echo "ref_name=$REF_NAME" >> $GITHUB_OUTPUT
echo "full_ref=$FULL_REF" >> $GITHUB_OUTPUT
echo "is_version_trigger=$IS_VERSION_TRIGGER" >> $GITHUB_OUTPUT
echo "trigger_version=$TRIGGER_VERSION" >> $GITHUB_OUTPUT
echo "version_with_dash=$VERSION_WITH_DASH" >> $GITHUB_OUTPUT
echo "trigger_source=$TRIGGER_SOURCE" >> $GITHUB_OUTPUT
echo "latest_version=$LATEST_VERSION" >> $GITHUB_OUTPUT
echo "latest_version_with_dash=$LATEST_VERSION_WITH_DASH" >> $GITHUB_OUTPUT
# 输出摘要信息
echo ""
echo "=== 版本信息摘要 ==="
echo "🔸 触发版本: $TRIGGER_VERSION"
echo "🔸 最新版本: $LATEST_VERSION"
echo "🔸 是否版本触发: $IS_VERSION_TRIGGER"
echo "🔸 触发源: $TRIGGER_SOURCE"
branding:
icon: "git-branch"
color: "blue"