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"