mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-24 20:34:29 +08:00
refactor(workflow): 重构自动标签工作流并添加CI构建测试
- 将自动标签触发方式从直接push改为基于CI工作流完成状态 - 新增独立的CI构建测试工作流配置文件 - 简化自动标签逻辑,移除跳过关键字检查和版本解析冗余代码 - 优化Git标签创建和推送流程,统一配置用户名邮箱 - 集成.NET项目构建测试流程,包含依赖恢复、编译和单元测试 - 更新工作流权限配置和并发控制设置
This commit is contained in:
parent
2f443087a4
commit
ef655bbaf1
128
.github/workflows/auto-tag.yml
vendored
128
.github/workflows/auto-tag.yml
vendored
@ -1,144 +1,60 @@
|
|||||||
name: Auto Increment Version and Tag
|
name: Auto Increment Version and Tag
|
||||||
|
|
||||||
# 工作流触发条件配置
|
|
||||||
# 当向 main 或 master 分支推送代码时触发
|
|
||||||
# 或者当针对 main 或 master 的 PR 被合并关闭时触发
|
|
||||||
on:
|
on:
|
||||||
push:
|
workflow_run:
|
||||||
branches: [ main, master ]
|
workflows: ["CI - Build & Test"]
|
||||||
tags-ignore:
|
types:
|
||||||
- '*'
|
- completed
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: auto-tag-main
|
group: auto-tag-main
|
||||||
cancel-in-progress: false
|
cancel-in-progress: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
auto-tag:
|
auto-tag:
|
||||||
name: Auto Increment Version and Create Tag
|
if: >
|
||||||
|
github.event.workflow_run.conclusion == 'success' &&
|
||||||
|
github.event.workflow_run.head_branch == 'main'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# 条件判断:仅在推送事件或已合并的 PR 关闭事件中执行
|
|
||||||
if: github.event_name == 'push'
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
# 步骤一:检出仓库代码
|
|
||||||
# 使用 actions/checkout 动作获取完整的 Git 历史用于查找已有标签
|
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
lfs: true
|
fetch-depth: 0
|
||||||
fetch-depth: 0 # 获取全部历史记录以查找现有标签
|
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
# 步骤二:检查是否需要跳过打标签操作
|
|
||||||
# 根据最新提交信息决定是否继续后续流程
|
|
||||||
- name: Check for skip keyword
|
- name: Check for skip keyword
|
||||||
id: check_skip
|
id: check_skip
|
||||||
run: |
|
run: |
|
||||||
# 检查最近一次提交信息是否包含跳过关键词
|
|
||||||
LAST_COMMIT_MSG=$(git log -1 --pretty=format:"%B")
|
LAST_COMMIT_MSG=$(git log -1 --pretty=format:"%B")
|
||||||
if [[ "$LAST_COMMIT_MSG" == *"[skip]"* ]] || [[ "$LAST_COMMIT_MSG" == *"[no tag]"* ]]; then
|
if [[ "$LAST_COMMIT_MSG" == *"[skip]"* ]] || [[ "$LAST_COMMIT_MSG" == *"[no tag]"* ]]; then
|
||||||
echo "skip_tag=true" >> $GITHUB_OUTPUT
|
echo "skip_tag=true" >> $GITHUB_OUTPUT
|
||||||
echo "Skipping tag creation due to skip keyword in commit message"
|
|
||||||
else
|
else
|
||||||
echo "skip_tag=false" >> $GITHUB_OUTPUT
|
echo "skip_tag=false" >> $GITHUB_OUTPUT
|
||||||
echo "No skip keyword found, proceeding with tag creation"
|
|
||||||
fi
|
fi
|
||||||
echo "Last commit message: $LAST_COMMIT_MSG"
|
|
||||||
|
|
||||||
# 运行测试
|
|
||||||
- name: Setup .NET
|
|
||||||
uses: actions/setup-dotnet@v4
|
|
||||||
with:
|
|
||||||
dotnet-version: 9.0.x
|
|
||||||
- name: Cache NuGet packages
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/.nuget/packages
|
|
||||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
|
|
||||||
- name: Restore dependencies
|
|
||||||
run: dotnet restore
|
|
||||||
- name: Build
|
|
||||||
run: dotnet build -c Release --no-restore -p:DebugType=portable
|
|
||||||
- name: Run tests
|
|
||||||
run: |
|
|
||||||
dotnet test \
|
|
||||||
--no-build \
|
|
||||||
-c Release \
|
|
||||||
--logger "trx" \
|
|
||||||
--results-directory ${{ github.workspace }}/TestResults
|
|
||||||
|
|
||||||
- name: Test Report
|
|
||||||
uses: dorny/test-reporter@v2
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
name: .NET Test Results
|
|
||||||
path: ${{ github.workspace }}/TestResults/*.trx
|
|
||||||
reporter: dotnet-trx
|
|
||||||
# 步骤三:计算下一个版本号(若未被跳过)
|
|
||||||
# 自动解析当前最新标签并递增修订号生成新的语义化版本号
|
|
||||||
- name: Get next version
|
- name: Get next version
|
||||||
id: get_next_version
|
|
||||||
if: steps.check_skip.outputs.skip_tag == 'false'
|
if: steps.check_skip.outputs.skip_tag == 'false'
|
||||||
|
id: version
|
||||||
run: |
|
run: |
|
||||||
# 获取最新的标签版本号,如果没有标签则默认为 0.0.0
|
|
||||||
LATEST_TAG=$(git tag --list "v*" --sort=-v:refname | head -n 1)
|
LATEST_TAG=$(git tag --list "v*" --sort=-v:refname | head -n 1)
|
||||||
LATEST_TAG=${LATEST_TAG:-v0.0.0}
|
LATEST_TAG=${LATEST_TAG:-v0.0.0}
|
||||||
# 移除可能存在的 v 前缀
|
VERSION=${LATEST_TAG#v}
|
||||||
VERSION_NUM=${LATEST_TAG#v}
|
IFS=. read MAJOR MINOR PATCH <<< "$VERSION"
|
||||||
|
PATCH=$((PATCH+1))
|
||||||
|
echo "new_tag=v$MAJOR.$MINOR.$PATCH" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
# 解析主版本号、次版本号和修订号
|
- name: Create tag
|
||||||
IFS=. read MAJOR MINOR PATCH <<< "$VERSION_NUM"
|
|
||||||
unset IFS
|
|
||||||
# 递增修订号
|
|
||||||
PATCH=$((PATCH + 1))
|
|
||||||
|
|
||||||
# 构造新版本号
|
|
||||||
NEW_VERSION="$MAJOR.$MINOR.$PATCH"
|
|
||||||
NEW_TAG="v$NEW_VERSION"
|
|
||||||
|
|
||||||
echo "latest_tag=$LATEST_TAG"
|
|
||||||
echo "new_version=$NEW_VERSION"
|
|
||||||
echo "new_tag=$NEW_TAG"
|
|
||||||
|
|
||||||
echo "latest_tag=$LATEST_TAG" >> $GITHUB_OUTPUT
|
|
||||||
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
|
||||||
echo "new_tag=$NEW_TAG" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
# 步骤四:创建并推送新标签到远程仓库(若未被跳过)
|
|
||||||
# 使用个人访问令牌(PAT)进行身份验证完成推送操作
|
|
||||||
- name: Create tag and push (using PAT)
|
|
||||||
if: steps.check_skip.outputs.skip_tag == 'false'
|
if: steps.check_skip.outputs.skip_tag == 'false'
|
||||||
env:
|
env:
|
||||||
PAT: ${{ secrets.PAT_TOKEN }}
|
PAT: ${{ secrets.PAT_TOKEN }}
|
||||||
REPO: ${{ github.repository }}
|
TAG: ${{ steps.version.outputs.new_tag }}
|
||||||
NEW_TAG: ${{ steps.get_next_version.outputs.new_tag }}
|
|
||||||
run: |
|
run: |
|
||||||
set -e
|
git config user.name "GitHub Action"
|
||||||
git config --local user.email "action@github.com"
|
git config user.email "action@github.com"
|
||||||
git config --local user.name "GitHub Action"
|
git tag -a "$TAG" -m "Auto tag $TAG"
|
||||||
if git show-ref --tags --verify --quiet "refs/tags/$NEW_TAG"; then
|
git push "https://x-access-token:${PAT}@github.com/${{ github.repository }}.git" "$TAG"
|
||||||
echo "Tag $NEW_TAG already exists, skipping"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
echo "Creating annotated tag $NEW_TAG"
|
|
||||||
git tag -a "$NEW_TAG" -m "Auto-generated tag: $NEW_TAG"
|
|
||||||
|
|
||||||
# 推送单个 tag,使用 PAT 作为 HTTPS token
|
|
||||||
echo "Pushing tag $NEW_TAG to origin using PAT"
|
|
||||||
git push "https://x-access-token:${PAT}@github.com/${REPO}.git" "refs/tags/${NEW_TAG}"
|
|
||||||
|
|
||||||
# 步骤五:输出本次成功创建的新版本相关信息(若未被跳过)
|
|
||||||
- name: Print version info
|
|
||||||
if: steps.check_skip.outputs.skip_tag == 'false'
|
|
||||||
run: |
|
|
||||||
echo "Previous tag was: ${{ steps.get_next_version.outputs.latest_tag }}"
|
|
||||||
echo "New tag created: ${{ steps.get_next_version.outputs.new_tag }}"
|
|
||||||
echo "Version number: ${{ steps.get_next_version.outputs.new_version }}"
|
|
||||||
|
|
||||||
# 步骤六:输出跳过原因信息(如果检测到了跳过关键字)
|
|
||||||
- name: Print skip info
|
|
||||||
if: steps.check_skip.outputs.skip_tag == 'true'
|
|
||||||
run: |
|
|
||||||
echo "Tag creation skipped due to commit message containing skip keyword"
|
|
||||||
|
|
||||||
|
|||||||
60
.github/workflows/ci.yml
vendored
Normal file
60
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# CI/CD工作流配置:构建和测试.NET项目
|
||||||
|
# 该工作流在push到main/master分支或创建pull request时触发
|
||||||
|
name: CI - Build & Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Build and Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# 检出源代码,设置fetch-depth为0以获取完整的git历史
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
# 安装和配置.NET SDK版本9.0.x
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v4
|
||||||
|
with:
|
||||||
|
dotnet-version: 9.0.x
|
||||||
|
|
||||||
|
# 配置NuGet包缓存以加速后续构建
|
||||||
|
- name: Cache NuGet packages
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: ~/.nuget/packages
|
||||||
|
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
|
||||||
|
|
||||||
|
# 执行NuGet包恢复操作
|
||||||
|
- name: Restore
|
||||||
|
run: dotnet restore
|
||||||
|
|
||||||
|
# 构建项目,使用Release配置且跳过恢复步骤
|
||||||
|
- name: Build
|
||||||
|
run: dotnet build -c Release --no-restore
|
||||||
|
|
||||||
|
# 运行单元测试,输出TRX格式结果到TestResults目录
|
||||||
|
- name: Test
|
||||||
|
run: |
|
||||||
|
dotnet test \
|
||||||
|
-c Release \
|
||||||
|
--no-build \
|
||||||
|
--logger trx \
|
||||||
|
--results-directory TestResults
|
||||||
|
|
||||||
|
# 生成并发布测试报告,无论测试成功或失败都会执行
|
||||||
|
- name: Test Report
|
||||||
|
uses: dorny/test-reporter@v2
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: .NET Test Results
|
||||||
|
path: TestResults/*.trx
|
||||||
|
reporter: dotnet-trx
|
||||||
Loading…
x
Reference in New Issue
Block a user