diff --git a/trigger-version/README.md b/trigger-version/README.md index deb6045..fbab743 100644 --- a/trigger-version/README.md +++ b/trigger-version/README.md @@ -7,6 +7,7 @@ - 🏷️ **标签触发检测**:自动识别版本标签(如 `v1.2.3`)并提取版本号 - 🔄 **版本分支检测**:识别版本分支(如 `v1.2.x`)并提取版本信息 - 🆕 **常规分支处理**:对于非版本分支提供基础信息 +- 📦 **最新版本获取**:始终获取仓库中的最新版本号,无论触发方式如何 - 🎯 **灵活的版本前缀**:支持自定义版本前缀(默认为 `v`) - 🔧 **版本格式转换**:自动生成横线格式的版本号(如 `v1.2.3` → `v1-2-3`) - 📤 **环境变量输出**:自动设置环境变量供后续步骤使用 @@ -14,21 +15,24 @@ ## 输入参数 -| 参数名 | 描述 | 必需 | 默认值 | -| ---------------- | -------------------------------- | ---- | ------ | -| `version-prefix` | 版本前缀,用于匹配版本标签或分支 | 否 | `v` | +| 参数名 | 描述 | 必需 | 默认值 | +| -------------------------- | ------------------------------ | ---- | ------- | +| `version-prefix` | 版本前缀,用于匹配版本标签或分支 | 否 | `v` | +| `use-latest-version` | 在非版本触发时是否使用最新版本 | 否 | `false` | ## 输出参数 -| 参数名 | 描述 | 示例值 | -| -------------------- | ------------------------ | ------------------------------- | -| `ref-type` | 引用类型 | `tag` 或 `branch` | -| `ref-name` | 引用名称 | `v1.2.3`、`main`、`feature/xxx` | -| `is-version-trigger` | 是否为版本触发 | `true` 或 `false` | -| `trigger-version` | 触发的版本号(去除前缀) | `1.2.3` | -| `version-with-dash` | 版本号,点替换为横线 | `1-2-3` | -| `trigger-source` | 触发源 | `tag` 或 `branch` | -| `full-ref` | 完整的 Git 引用 | `refs/tags/v1.2.3` | +| 参数名 | 描述 | 示例值 | +| ------------------------------ | ---------------------------- | ------------------------------- | +| `ref-type` | 引用类型 | `tag` 或 `branch` | +| `ref-name` | 引用名称 | `v1.2.3`、`main`、`feature/xxx` | +| `is-version-trigger` | 是否为版本触发 | `true` 或 `false` | +| `trigger-version` | 触发的版本号(标准化格式) | `v1.2.3` | +| `version-with-dash` | 版本号,点替换为横线 | `v1-2-3` | +| `trigger-source` | 触发源 | `tag` 或 `branch` | +| `full-ref` | 完整的 Git 引用 | `refs/tags/v1.2.3` | +| `latest-version` | 仓库中的最新版本号 | `v1.2.3` | +| `latest-version-with-dash` | 最新版本号,点替换为横线 | `v1-2-3` | ## 环境变量 @@ -56,17 +60,24 @@ jobs: outputs: is-version-trigger: ${{ steps.version-info.outputs.is-version-trigger }} trigger-version: ${{ steps.version-info.outputs.trigger-version }} + latest-version: ${{ steps.version-info.outputs.latest-version }} version-with-dash: ${{ steps.version-info.outputs.version-with-dash }} trigger-source: ${{ steps.version-info.outputs.trigger-source }} steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # 必需:获取完整历史以获取所有标签 + - name: 获取版本信息 id: version-info - uses: actions/xgj/trigger-version@v1 + uses: ./trigger-version - name: 显示版本信息 run: | echo "是否版本触发: ${{ steps.version-info.outputs.is-version-trigger }}" - echo "版本号: ${{ steps.version-info.outputs.trigger-version }}" + echo "触发版本: ${{ steps.version-info.outputs.trigger-version }}" + echo "最新版本: ${{ steps.version-info.outputs.latest-version }}" echo "横线版本号: ${{ steps.version-info.outputs.version-with-dash }}" echo "触发源: ${{ steps.version-info.outputs.trigger-source }}" @@ -81,6 +92,25 @@ jobs: echo "Docker标签: myapp:${{ needs.get-version-info.outputs.version-with-dash }}" ``` +### 使用最新版本功能 + +```yaml +- name: 获取版本信息(启用最新版本) + id: version-info + uses: ./trigger-version + with: + use-latest-version: true # 在非版本触发时使用最新版本 + +- name: 使用最新版本进行构建 + run: | + if [[ -n "${{ steps.version-info.outputs.latest-version }}" ]]; then + echo "构建镜像标签: myapp:${{ steps.version-info.outputs.latest-version-with-dash }}" + # docker build -t myapp:${{ steps.version-info.outputs.latest-version-with-dash }} . + else + echo "未找到版本标签,使用默认标签" + # docker build -t myapp:latest . + fi + ### 自定义版本前缀 ```yaml @@ -183,14 +213,19 @@ jobs: 1. **条件部署**:使用 `is-version-trigger` 来决定是否执行生产部署 2. **版本标记**:在构建产物中使用 `trigger-version` 进行版本标记 -3. **Docker 标签**:使用 `version-with-dash` 作为 Docker 镜像标签(避免点号问题) -4. **环境区分**:根据触发源选择不同的部署环境 -5. **日志记录**:记录详细的版本信息用于追踪和调试 +3. **最新版本获取**:使用 `latest-version` 输出来获取仓库的最新版本,适用于回滚或版本比较 +4. **Docker 标签**:使用 `version-with-dash` 作为 Docker 镜像标签(避免点号问题) +5. **环境区分**:根据触发源选择不同的部署环境 +6. **完整历史获取**:在工作流中使用 `fetch-depth: 0` 确保能获取所有标签 +7. **日志记录**:记录详细的版本信息用于追踪和调试 ## 注意事项 - 版本前缀区分大小写 - 空的版本号会被设置为空字符串 +- `latest-version` 输出始终获取仓库的最新版本,无论触发方式如何 +- 获取最新版本需要完整的 Git 历史,建议使用 `fetch-depth: 0` +- 最新版本按语义化版本排序,确保标签格式符合版本规范 - 确保工作流触发条件与你的版本策略一致 - 在使用输出参数时注意布尔值的字符串比较(使用 `== 'true'`) diff --git a/trigger-version/action.yml b/trigger-version/action.yml index 6bdf19f..b42b740 100644 --- a/trigger-version/action.yml +++ b/trigger-version/action.yml @@ -34,6 +34,12 @@ outputs: 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" @@ -42,6 +48,59 @@ runs: id: get-version-info shell: bash run: | + # 获取最新版本号的函数 + get_latest_version() { + local prefix="$1" + local latest_version="" + local latest_version_with_dash="" + + echo "🔍 开始获取最新版本号(前缀:${prefix})..." + + # 检查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 + 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,使用 git 的排序 + latest_version=$(git tag --list "${prefix}*" --sort=-version:refname 2>/dev/null | head -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 "⚠️ 未找到匹配前缀 '${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 }}" @@ -54,6 +113,9 @@ runs: VERSION_PREFIX="${{ inputs.version-prefix }}" USE_LATEST_VERSION="${{ inputs.use-latest-version }}" + # 获取最新版本号(无论触发方式如何都获取) + get_latest_version "$VERSION_PREFIX" + # 判断是否为标签触发 if [[ "$REF_TYPE" == "tag" ]]; then # 标准化版本号为v开头格式 @@ -84,49 +146,17 @@ runs: echo "🆕 常规分支触发: $REF_NAME" if [[ "$USE_LATEST_VERSION" == "true" ]]; then - # 获取当前分支最新的版本标签 - echo "🔍 查找最新版本标签..." - - # 检查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 "🏷️ 查找匹配前缀 '${VERSION_PREFIX}' 的标签..." - ALL_TAGS=$(git tag --list "${VERSION_PREFIX}*" 2>/dev/null) - # echo "找到的标签: $ALL_TAGS" - - # 获取最新的版本标签 - if command -v sort >/dev/null 2>&1; then - # 使用 sort 命令进行版本排序 - LATEST_TAG=$(echo "$ALL_TAGS" | sort -V | tail -1) - else - # 如果没有 sort -V,使用 git 的排序 - LATEST_TAG=$(git tag --list "${VERSION_PREFIX}*" --sort=-version:refname 2>/dev/null | head -1) - fi - - if [[ -n "$LATEST_TAG" ]]; then - # 找到了版本标签,使用它 - TRIGGER_VERSION=$LATEST_TAG - VERSION_WITH_DASH=$(echo "$TRIGGER_VERSION" | sed 's/\./-/g') - echo "📦 使用最新版本标签: $LATEST_TAG" - 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 + # 使用已获取的最新版本 + 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 - # Git仓库不可用 - echo "❌ Git仓库不可用,使用空版本" + # 没有找到版本标签 + echo "⚠️ 未找到匹配前缀 '${VERSION_PREFIX}' 的版本标签,使用空版本" IS_VERSION_TRIGGER=false TRIGGER_VERSION="" VERSION_WITH_DASH="" @@ -155,6 +185,16 @@ runs: 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" diff --git a/trigger-version/examples/latest-version-demo.yml b/trigger-version/examples/latest-version-demo.yml new file mode 100644 index 0000000..4fbf060 --- /dev/null +++ b/trigger-version/examples/latest-version-demo.yml @@ -0,0 +1,65 @@ +name: Latest Version Demo +on: + push: + branches: [ main, develop ] + pull_request: + branches: [ main ] + +jobs: + show-version-info: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # 获取完整历史,确保能获取所有标签 + + - name: Get Version Info + id: version + uses: ./trigger-version + with: + version-prefix: 'v' + use-latest-version: true + + - name: Display Version Information + run: | + echo "=== 版本信息详情 ===" + echo "引用类型: ${{ steps.version.outputs.ref-type }}" + echo "引用名称: ${{ steps.version.outputs.ref-name }}" + echo "完整引用: ${{ steps.version.outputs.full-ref }}" + echo "" + echo "=== 触发版本信息 ===" + echo "是否版本触发: ${{ steps.version.outputs.is-version-trigger }}" + echo "触发版本: ${{ steps.version.outputs.trigger-version }}" + echo "触发源: ${{ steps.version.outputs.trigger-source }}" + echo "版本(横线格式): ${{ steps.version.outputs.version-with-dash }}" + echo "" + echo "=== 最新版本信息 ===" + echo "最新版本: ${{ steps.version.outputs.latest-version }}" + echo "最新版本(横线格式): ${{ steps.version.outputs.latest-version-with-dash }}" + + - name: Use Latest Version in Deployment + if: steps.version.outputs.latest-version != '' + run: | + echo "使用最新版本进行部署: ${{ steps.version.outputs.latest-version }}" + echo "镜像标签: myapp:${{ steps.version.outputs.latest-version-with-dash }}" + + # 示例:构建 Docker 镜像 + # docker build -t myapp:${{ steps.version.outputs.latest-version-with-dash }} . + + # 示例:设置 Kubernetes 部署 + # kubectl set image deployment/myapp container=myapp:${{ steps.version.outputs.latest-version-with-dash }} + + - name: Handle No Version Found + if: steps.version.outputs.latest-version == '' + run: | + echo "⚠️ 未找到任何版本标签" + echo "这可能是因为:" + echo "1. 仓库中没有版本标签" + echo "2. 版本标签不匹配指定的前缀" + echo "3. Git 获取标签失败" + echo "" + echo "建议:" + echo "1. 检查仓库是否有版本标签(如 v1.0.0)" + echo "2. 确认版本前缀设置正确" + echo "3. 确保 fetch-depth: 0 以获取完整历史"