feat: 添加触发版本信息的 GitHub Action,支持标签、版本分支和常规分支触发,提供详细的输出信息和环境变量,更新文档以反映新功能和使用示例。

This commit is contained in:
Lyda
2025-08-20 20:38:33 +08:00
parent e4063690cd
commit 84f608690b
6 changed files with 887 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
# 基本用法示例
# 这个示例展示了如何使用 trigger-version action 获取版本信息
name: Basic Usage Example
on:
push:
branches: ['main', 'develop', 'v*']
tags: ['v*']
workflow_dispatch:
jobs:
get-version-info:
runs-on: ubuntu-latest
outputs:
is-version-trigger: ${{ steps.version-info.outputs.is-version-trigger }}
trigger-version: ${{ steps.version-info.outputs.trigger-version }}
trigger-source: ${{ steps.version-info.outputs.trigger-source }}
ref-type: ${{ steps.version-info.outputs.ref-type }}
ref-name: ${{ steps.version-info.outputs.ref-name }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: 获取触发版本信息
id: version-info
uses: ./trigger-version
- name: 显示版本信息
run: |
echo "========== 触发信息汇总 =========="
echo "引用类型: ${{ steps.version-info.outputs.ref-type }}"
echo "引用名称: ${{ steps.version-info.outputs.ref-name }}"
echo "完整引用: ${{ steps.version-info.outputs.full-ref }}"
echo "是否版本触发: ${{ steps.version-info.outputs.is-version-trigger }}"
echo "触发版本号: ${{ steps.version-info.outputs.trigger-version }}"
echo "触发源: ${{ steps.version-info.outputs.trigger-source }}"
echo "================================"
- name: 检查环境变量
run: |
echo "========== 环境变量 =========="
echo "IS_VERSION_TRIGGER: ${IS_VERSION_TRIGGER}"
echo "TRIGGER_VERSION: ${TRIGGER_VERSION}"
echo "TRIGGER_SOURCE: ${TRIGGER_SOURCE}"
echo "============================"
show-usage:
needs: get-version-info
runs-on: ubuntu-latest
steps:
- name: 演示如何使用输出参数
run: |
echo "在其他 job 中使用输出参数:"
echo "版本触发: ${{ needs.get-version-info.outputs.is-version-trigger }}"
echo "版本号: ${{ needs.get-version-info.outputs.trigger-version }}"
if [[ "${{ needs.get-version-info.outputs.is-version-trigger }}" == "true" ]]; then
echo "✅ 这是一个版本发布触发"
echo "🚀 版本号: ${{ needs.get-version-info.outputs.trigger-version }}"
echo "📦 触发源: ${{ needs.get-version-info.outputs.trigger-source }}"
else
echo " 这是一个常规分支推送"
echo "🌿 分支名: ${{ needs.get-version-info.outputs.ref-name }}"
fi

View File

@@ -0,0 +1,119 @@
# 条件部署示例
# 这个示例展示了如何根据触发方式进行条件部署
name: Conditional Deployment
on:
push:
branches: ['main', 'develop', 'v*']
tags: ['v*']
jobs:
analyze:
runs-on: ubuntu-latest
outputs:
is-version-trigger: ${{ steps.version-info.outputs.is-version-trigger }}
trigger-version: ${{ steps.version-info.outputs.trigger-version }}
trigger-source: ${{ steps.version-info.outputs.trigger-source }}
ref-name: ${{ steps.version-info.outputs.ref-name }}
deploy-staging: ${{ steps.deployment-strategy.outputs.deploy-staging }}
deploy-production: ${{ steps.deployment-strategy.outputs.deploy-production }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: 获取版本信息
id: version-info
uses: ./trigger-version
- name: 确定部署策略
id: deployment-strategy
run: |
IS_VERSION="${{ steps.version-info.outputs.is-version-trigger }}"
REF_NAME="${{ steps.version-info.outputs.ref-name }}"
echo "分析部署策略..."
# 生产环境部署条件:版本标签触发
if [[ "$IS_VERSION" == "true" && "${{ steps.version-info.outputs.trigger-source }}" == "tag" ]]; then
echo "deploy-production=true" >> $GITHUB_OUTPUT
echo "deploy-staging=false" >> $GITHUB_OUTPUT
echo "🚀 将部署到生产环境"
# 测试环境部署条件main分支或版本分支
elif [[ "$REF_NAME" == "main" || "$IS_VERSION" == "true" ]]; then
echo "deploy-production=false" >> $GITHUB_OUTPUT
echo "deploy-staging=true" >> $GITHUB_OUTPUT
echo "🧪 将部署到测试环境"
else
echo "deploy-production=false" >> $GITHUB_OUTPUT
echo "deploy-staging=false" >> $GITHUB_OUTPUT
echo "⏭️ 跳过部署"
fi
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: 构建应用
run: |
echo "🔨 构建应用中..."
# 模拟构建过程
sleep 2
echo "✅ 构建完成"
- name: 运行测试
run: |
echo "🧪 运行测试中..."
# 模拟测试过程
sleep 1
echo "✅ 测试通过"
deploy-staging:
needs: [analyze, build]
runs-on: ubuntu-latest
if: needs.analyze.outputs.deploy-staging == 'true'
environment: staging
steps:
- name: 部署到测试环境
run: |
echo "🚀 部署到测试环境"
echo "分支/版本: ${{ needs.analyze.outputs.ref-name }}"
if [[ "${{ needs.analyze.outputs.is-version-trigger }}" == "true" ]]; then
echo "版本号: ${{ needs.analyze.outputs.trigger-version }}"
fi
echo "✅ 测试环境部署完成"
- name: 发送通知
run: |
echo "📢 发送测试环境部署通知"
# 这里可以集成 Slack、钉钉等通知
deploy-production:
needs: [analyze, build]
runs-on: ubuntu-latest
if: needs.analyze.outputs.deploy-production == 'true'
environment: production
steps:
- name: 部署到生产环境
run: |
echo "🚀 部署版本 ${{ needs.analyze.outputs.trigger-version }} 到生产环境"
echo "触发源: ${{ needs.analyze.outputs.trigger-source }}"
# 生产部署逻辑
echo "✅ 生产环境部署完成"
- name: 创建 Release
if: needs.analyze.outputs.trigger-source == 'tag'
run: |
echo "📦 创建 GitHub Release"
echo "版本: v${{ needs.analyze.outputs.trigger-version }}"
# 这里可以使用 gh CLI 创建 release
- name: 发送生产部署通知
run: |
echo "📢 发送生产环境部署通知"
echo "🎉 版本 ${{ needs.analyze.outputs.trigger-version }} 已成功部署到生产环境"

View File

@@ -0,0 +1,135 @@
# 自定义版本前缀示例
# 这个示例展示了如何使用不同的版本前缀
name: Custom Version Prefix
on:
push:
branches: ['main', 'release-*']
tags: ['release-*', 'hotfix-*']
jobs:
# 使用默认前缀 'v' 的标准版本
standard-version:
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: 获取标准版本信息
id: standard-version
uses: ./trigger-version
# 使用默认的 'v' 前缀
- name: 显示标准版本信息
run: |
echo "🏷️ 标准版本标签处理"
echo "版本号: ${{ steps.standard-version.outputs.trigger-version }}"
echo "是否版本触发: ${{ steps.standard-version.outputs.is-version-trigger }}"
# 使用 'release-' 前缀的发布版本
release-version:
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/release-') || startsWith(github.ref, 'refs/heads/release-')
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: 获取发布版本信息
id: release-version
uses: ./trigger-version
with:
version-prefix: 'release-'
- name: 显示发布版本信息
run: |
echo "🚀 发布版本处理"
echo "引用名称: ${{ steps.release-version.outputs.ref-name }}"
echo "版本号: ${{ steps.release-version.outputs.trigger-version }}"
echo "触发源: ${{ steps.release-version.outputs.trigger-source }}"
echo "是否版本触发: ${{ steps.release-version.outputs.is-version-trigger }}"
# 使用 'hotfix-' 前缀的热修复版本
hotfix-version:
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/hotfix-')
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: 获取热修复版本信息
id: hotfix-version
uses: ./trigger-version
with:
version-prefix: 'hotfix-'
- name: 显示热修复版本信息
run: |
echo "🔧 热修复版本处理"
echo "版本号: ${{ steps.hotfix-version.outputs.trigger-version }}"
echo "完整引用: ${{ steps.hotfix-version.outputs.full-ref }}"
# 无前缀版本处理
no-prefix-version:
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/') && !startsWith(github.ref, 'refs/tags/v') && !startsWith(github.ref, 'refs/tags/release-') && !startsWith(github.ref, 'refs/tags/hotfix-')
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: 获取无前缀版本信息
id: no-prefix-version
uses: ./trigger-version
with:
version-prefix: ''
- name: 显示无前缀版本信息
run: |
echo "📦 无前缀版本处理"
echo "标签名: ${{ steps.no-prefix-version.outputs.ref-name }}"
echo "版本号: ${{ steps.no-prefix-version.outputs.trigger-version }}"
# 演示多种前缀处理策略
multi-prefix-demo:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: 检测并处理不同前缀
run: |
REF_NAME="${{ github.ref_name }}"
REF_TYPE="${{ github.ref_type }}"
echo "当前引用: $REF_NAME (类型: $REF_TYPE)"
# 根据引用名称确定使用哪种前缀策略
if [[ "$REF_NAME" == v* ]]; then
echo "检测到标准版本前缀 'v'"
VERSION_PREFIX="v"
elif [[ "$REF_NAME" == release-* ]]; then
echo "检测到发布前缀 'release-'"
VERSION_PREFIX="release-"
elif [[ "$REF_NAME" == hotfix-* ]]; then
echo "检测到热修复前缀 'hotfix-'"
VERSION_PREFIX="hotfix-"
else
echo "未检测到特定前缀,使用默认处理"
VERSION_PREFIX=""
fi
echo "VERSION_PREFIX=$VERSION_PREFIX" >> $GITHUB_ENV
- name: 使用动态前缀获取版本信息
id: dynamic-version
uses: ./trigger-version
with:
version-prefix: ${{ env.VERSION_PREFIX }}
- name: 显示动态版本信息
run: |
echo "🎯 动态前缀处理结果"
echo "使用的前缀: '${{ env.VERSION_PREFIX }}'"
echo "提取的版本号: ${{ steps.dynamic-version.outputs.trigger-version }}"
echo "是否版本触发: ${{ steps.dynamic-version.outputs.is-version-trigger }}"

View File

@@ -0,0 +1,282 @@
# 完整的 CI/CD 流程示例
# 这个示例展示了如何在完整的 CI/CD 流程中使用 trigger-version action
name: Complete CI/CD Pipeline
on:
push:
branches: ['main', 'develop', 'feature/*', 'v*']
tags: ['v*']
pull_request:
branches: ['main', 'develop']
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
# 第一步:分析触发信息和构建策略
analyze:
runs-on: ubuntu-latest
outputs:
is-version-trigger: ${{ steps.version-info.outputs.is-version-trigger }}
trigger-version: ${{ steps.version-info.outputs.trigger-version }}
trigger-source: ${{ steps.version-info.outputs.trigger-source }}
ref-name: ${{ steps.version-info.outputs.ref-name }}
should-build: ${{ steps.build-strategy.outputs.should-build }}
should-test: ${{ steps.build-strategy.outputs.should-test }}
should-deploy-dev: ${{ steps.build-strategy.outputs.should-deploy-dev }}
should-deploy-staging: ${{ steps.build-strategy.outputs.should-deploy-staging }}
should-deploy-prod: ${{ steps.build-strategy.outputs.should-deploy-prod }}
image-tag: ${{ steps.build-strategy.outputs.image-tag }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: 获取触发版本信息
id: version-info
uses: ./trigger-version
- name: 确定构建和部署策略
id: build-strategy
run: |
IS_VERSION="${{ steps.version-info.outputs.is-version-trigger }}"
TRIGGER_SOURCE="${{ steps.version-info.outputs.trigger-source }}"
REF_NAME="${{ steps.version-info.outputs.ref-name }}"
TRIGGER_VERSION="${{ steps.version-info.outputs.trigger-version }}"
EVENT_NAME="${{ github.event_name }}"
echo "========== 构建策略分析 =========="
echo "事件类型: $EVENT_NAME"
echo "引用名称: $REF_NAME"
echo "是否版本触发: $IS_VERSION"
echo "触发源: $TRIGGER_SOURCE"
echo "版本号: $TRIGGER_VERSION"
# 确定是否构建
if [[ "$EVENT_NAME" == "pull_request" ]]; then
echo "should-build=true" >> $GITHUB_OUTPUT
echo "should-test=true" >> $GITHUB_OUTPUT
echo "should-deploy-dev=false" >> $GITHUB_OUTPUT
echo "should-deploy-staging=false" >> $GITHUB_OUTPUT
echo "should-deploy-prod=false" >> $GITHUB_OUTPUT
echo "image-tag=pr-${{ github.event.number }}" >> $GITHUB_OUTPUT
echo "📝 PR 构建策略:仅构建和测试"
elif [[ "$IS_VERSION" == "true" && "$TRIGGER_SOURCE" == "tag" ]]; then
# 版本标签触发 - 完整流程
echo "should-build=true" >> $GITHUB_OUTPUT
echo "should-test=true" >> $GITHUB_OUTPUT
echo "should-deploy-dev=false" >> $GITHUB_OUTPUT
echo "should-deploy-staging=true" >> $GITHUB_OUTPUT
echo "should-deploy-prod=true" >> $GITHUB_OUTPUT
echo "image-tag=v$TRIGGER_VERSION" >> $GITHUB_OUTPUT
echo "🚀 版本发布策略:完整 CI/CD 流程"
elif [[ "$REF_NAME" == "main" ]]; then
# 主分支推送
echo "should-build=true" >> $GITHUB_OUTPUT
echo "should-test=true" >> $GITHUB_OUTPUT
echo "should-deploy-dev=true" >> $GITHUB_OUTPUT
echo "should-deploy-staging=true" >> $GITHUB_OUTPUT
echo "should-deploy-prod=false" >> $GITHUB_OUTPUT
echo "image-tag=main-${{ github.sha }}" >> $GITHUB_OUTPUT
echo "🌟 主分支策略:构建、测试、部署到开发和测试环境"
elif [[ "$REF_NAME" == "develop" ]]; then
# 开发分支推送
echo "should-build=true" >> $GITHUB_OUTPUT
echo "should-test=true" >> $GITHUB_OUTPUT
echo "should-deploy-dev=true" >> $GITHUB_OUTPUT
echo "should-deploy-staging=false" >> $GITHUB_OUTPUT
echo "should-deploy-prod=false" >> $GITHUB_OUTPUT
echo "image-tag=develop-${{ github.sha }}" >> $GITHUB_OUTPUT
echo "🔧 开发分支策略:构建、测试、部署到开发环境"
elif [[ "$IS_VERSION" == "true" && "$TRIGGER_SOURCE" == "branch" ]]; then
# 版本分支推送
echo "should-build=true" >> $GITHUB_OUTPUT
echo "should-test=true" >> $GITHUB_OUTPUT
echo "should-deploy-dev=false" >> $GITHUB_OUTPUT
echo "should-deploy-staging=true" >> $GITHUB_OUTPUT
echo "should-deploy-prod=false" >> $GITHUB_OUTPUT
echo "image-tag=branch-$TRIGGER_VERSION" >> $GITHUB_OUTPUT
echo "🔀 版本分支策略:构建、测试、部署到测试环境"
else
# 功能分支推送
echo "should-build=true" >> $GITHUB_OUTPUT
echo "should-test=true" >> $GITHUB_OUTPUT
echo "should-deploy-dev=false" >> $GITHUB_OUTPUT
echo "should-deploy-staging=false" >> $GITHUB_OUTPUT
echo "should-deploy-prod=false" >> $GITHUB_OUTPUT
echo "image-tag=feature-${{ github.sha }}" >> $GITHUB_OUTPUT
echo "🌿 功能分支策略:仅构建和测试"
fi
echo "================================="
# 第二步:代码质量检查
lint-and-test:
needs: analyze
runs-on: ubuntu-latest
if: needs.analyze.outputs.should-test == 'true'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: 代码风格检查
run: |
echo "🔍 运行 ESLint..."
# npm run lint
- name: 类型检查
run: |
echo "📝 运行 TypeScript 检查..."
# npm run type-check
- name: 单元测试
run: |
echo "🧪 运行单元测试..."
# npm run test:unit
- name: 集成测试
run: |
echo "🔗 运行集成测试..."
# npm run test:integration
# 第三步:构建应用
build:
needs: [analyze, lint-and-test]
runs-on: ubuntu-latest
if: needs.analyze.outputs.should-build == 'true'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: 构建应用
run: |
echo "🔨 构建应用..."
echo "版本信息: ${{ needs.analyze.outputs.trigger-version || 'dev' }}"
# npm run build
- name: 构建 Docker 镜像
run: |
echo "🐳 构建 Docker 镜像..."
IMAGE_TAG="${{ needs.analyze.outputs.image-tag }}"
echo "镜像标签: $REGISTRY/$IMAGE_NAME:$IMAGE_TAG"
# docker build -t $REGISTRY/$IMAGE_NAME:$IMAGE_TAG .
- name: 推送 Docker 镜像
run: |
echo "📤 推送 Docker 镜像..."
# docker push $REGISTRY/$IMAGE_NAME:${{ needs.analyze.outputs.image-tag }}
# 第四步:部署到开发环境
deploy-dev:
needs: [analyze, build]
runs-on: ubuntu-latest
if: needs.analyze.outputs.should-deploy-dev == 'true'
environment: development
steps:
- name: 部署到开发环境
run: |
echo "🚀 部署到开发环境"
echo "镜像: $REGISTRY/$IMAGE_NAME:${{ needs.analyze.outputs.image-tag }}"
echo "分支: ${{ needs.analyze.outputs.ref-name }}"
# 部署逻辑
# 第五步:部署到测试环境
deploy-staging:
needs: [analyze, build]
runs-on: ubuntu-latest
if: needs.analyze.outputs.should-deploy-staging == 'true'
environment: staging
steps:
- name: 部署到测试环境
run: |
echo "🧪 部署到测试环境"
echo "镜像: $REGISTRY/$IMAGE_NAME:${{ needs.analyze.outputs.image-tag }}"
if [[ "${{ needs.analyze.outputs.is-version-trigger }}" == "true" ]]; then
echo "版本: ${{ needs.analyze.outputs.trigger-version }}"
fi
# 部署逻辑
- name: 运行冒烟测试
run: |
echo "🔥 运行冒烟测试..."
# 测试逻辑
# 第六步:部署到生产环境
deploy-production:
needs: [analyze, build, deploy-staging]
runs-on: ubuntu-latest
if: needs.analyze.outputs.should-deploy-prod == 'true'
environment: production
steps:
- name: 部署到生产环境
run: |
echo "🚀 部署版本 ${{ needs.analyze.outputs.trigger-version }} 到生产环境"
echo "镜像: $REGISTRY/$IMAGE_NAME:${{ needs.analyze.outputs.image-tag }}"
echo "触发源: ${{ needs.analyze.outputs.trigger-source }}"
# 生产部署逻辑
- name: 健康检查
run: |
echo "💚 执行生产环境健康检查..."
# 健康检查逻辑
- name: 创建 GitHub Release
if: needs.analyze.outputs.trigger-source == 'tag'
run: |
echo "📦 创建 GitHub Release"
echo "版本: v${{ needs.analyze.outputs.trigger-version }}"
# gh release create v${{ needs.analyze.outputs.trigger-version }} --generate-notes
# 第七步:通知和后续处理
notify:
needs: [analyze, deploy-dev, deploy-staging, deploy-production]
runs-on: ubuntu-latest
if: always() && needs.analyze.outputs.should-build == 'true'
steps:
- name: 发送部署通知
run: |
echo "📢 发送部署通知"
if [[ "${{ needs.analyze.outputs.is-version-trigger }}" == "true" ]]; then
if [[ "${{ needs.deploy-production.result }}" == "success" ]]; then
echo "🎉 版本 ${{ needs.analyze.outputs.trigger-version }} 已成功部署到生产环境"
else
echo "❌ 版本 ${{ needs.analyze.outputs.trigger-version }} 生产部署失败"
fi
else
echo " 分支 ${{ needs.analyze.outputs.ref-name }} 部署完成"
fi
# 发送到 Slack/钉钉/邮件等
- name: 更新文档
if: needs.analyze.outputs.trigger-source == 'tag'
run: |
echo "📚 更新版本文档"
# 自动更新 CHANGELOG 等