feige996 9 месяцев назад
Родитель
Сommit
08fc885b77
3 измененных файлов с 248 добавлено и 0 удалено
  1. 31 0
      .github/release.yml
  2. 98 0
      .github/workflows/auto-merge.yml
  3. 119 0
      .github/workflows/release-log.yml

+ 31 - 0
.github/release.yml

@@ -0,0 +1,31 @@
+categories:
+  - title: 🚀 新功能
+    labels: [feat, feature]
+  - title: 🛠️ 修复
+    labels: [fix, bugfix]
+  - title: 💅 样式
+    labels: [style]
+  - title: 📄 文档
+    labels: [docs]
+  - title: ⚡️ 性能
+    labels: [perf]
+  - title: 🧪 测试
+    labels: [test]
+  - title: ♻️ 重构
+    labels: [refactor]
+  - title: 📦 构建
+    labels: [build]
+  - title: 🚨 补丁
+    labels: [patch, hotfix]
+  - title: 🌐 发布
+    labels: [release, publish]
+  - title: 🔧 流程
+    labels: [ci, cd, workflow]
+  - title: ⚙️ 配置
+    labels: [config, chore]
+  - title: 📁 文件
+    labels: [file]
+  - title: 🎨 格式化
+    labels: [format]
+  - title: 🔀 其他
+    labels: [other, misc]

+ 98 - 0
.github/workflows/auto-merge.yml

@@ -0,0 +1,98 @@
+name: Auto Merge Main to Other Branches
+
+on:
+  push:
+    branches:
+      - main
+  workflow_dispatch: # 手动触发
+
+jobs:
+  merge-to-release:
+    name: Merge main into release
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          token: ${{ secrets.GH_TOKEN_AUTO_MERGE }}
+
+      - name: Merge main into release
+        run: |
+          git config user.name "GitHub Actions"
+          git config user.email "actions@github.com"
+          git checkout release
+          git merge main --no-ff -m "Auto merge main into release"
+          git push origin release
+
+  merge-to-i18n:
+    name: Merge main into i18n
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          token: ${{ secrets.GH_TOKEN_AUTO_MERGE }}
+
+      - name: Merge main into i18n
+        run: |
+          git config user.name "GitHub Actions"
+          git config user.email "actions@github.com"
+          git checkout i18n
+          git merge main --no-ff -m "Auto merge main into i18n"
+          git push origin i18n
+
+  merge-to-base-sard-ui:
+    name: Merge main into base-sard-ui
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          token: ${{ secrets.GH_TOKEN_AUTO_MERGE }}
+
+      - name: Merge main into base-sard-ui
+        run: |
+          git config user.name "GitHub Actions"
+          git config user.email "actions@github.com"
+          git checkout base-sard-ui
+          git merge main --no-ff -m "Auto merge main into base-sard-ui"
+          git push origin base-sard-ui
+
+  merge-to-base-uv-ui:
+    name: Merge main into base-uv-ui
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          token: ${{ secrets.GH_TOKEN_AUTO_MERGE }}
+
+      - name: Merge main into base-uv-ui
+        run: |
+          git config user.name "GitHub Actions"
+          git config user.email "actions@github.com"
+          git checkout base-uv-ui
+          git merge main --no-ff -m "Auto merge main into base-uv-ui"
+          git push origin base-uv-ui
+
+  merge-to-base-uview-plus:
+    name: Merge main into base-uview-plus
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          token: ${{ secrets.GH_TOKEN_AUTO_MERGE }}
+
+      - name: Merge main into base-uview-plus
+        run: |
+          git config user.name "GitHub Actions"
+          git config user.email "actions@github.com"
+          git checkout base-uview-plus
+          git merge main --no-ff -m "Auto merge main into base-uview-plus"
+          git push origin base-uview-plus

+ 119 - 0
.github/workflows/release-log.yml

@@ -0,0 +1,119 @@
+name: Auto Release
+
+on:
+  push:
+    tags:
+      - 'v*'
+
+permissions:
+  contents: write
+  pull-requests: read
+  issues: read
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          token: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Install yq
+        run: sudo snap install yq
+
+      - name: Generate changelog
+        id: changelog
+        env:
+          CONFIG_FILE: .github/release.yml
+        run: |
+          # 解析配置文件
+          declare -A category_map
+          while IFS=";" read -r title labels; do
+              for label in $labels; do
+                  category_map[$label]="$title"
+              done
+          done < <(yq -o=tsv '.categories[] | [.title, (.labels | join(" "))] | join(";")' $CONFIG_FILE)
+          # 获取版本范围
+          mapfile -t tags < <(git tag -l --sort=-version:refname)
+          current_tag=${tags[0]}
+          previous_tag=${tags[1]:-}
+          if [[ -z "$previous_tag" ]]; then
+              commit_range="$current_tag"
+              echo "首次发布版本: $current_tag"
+          else
+              commit_range="$previous_tag..$current_tag"
+              echo "版本范围: $commit_range"
+          fi
+          # 获取所有符合规范的提交
+          commits=$(git log --pretty=format:"%s|%h" "$commit_range")
+          # 生成分类日志
+          declare -A log_entries
+          while IFS="|" read -r subject hash; do
+              # type=$(echo "$subject" | cut -d':' -f1 | tr -d ' ')
+              type=$(echo "$subject" | sed -E 's/^([[:alnum:]]+)(\(.*\))?:.*/\1/' | tr -d ' ')
+              found=0
+              for label in "${!category_map[@]}"; do
+                  if [[ "$type" == "$label" ]]; then
+                      entry="- ${subject} (${hash:0:7})"
+                      log_entries[${category_map[$label]}]+="$entry"$'\n'
+                      found=1
+                      break
+                  fi
+              done
+              if [[ $found -eq 0 ]]; then
+                  entry="- ${subject} (${hash:0:7})"
+                  log_entries["其他"]+="$entry"$'\n'
+              fi
+          done <<< "$commits"
+
+          # 统计提交数量
+          commit_count=$(git log --oneline "$commit_range" | wc -l)
+          # 统计受影响的文件数量
+          file_count=$(git diff --name-only "$commit_range" | wc -l)
+          # 统计贡献者信息
+          contributor_stats=$(git shortlog -sn "$commit_range")
+          contributor_notes=""
+          while IFS= read -r line; do
+              commits=$(echo "$line" | awk '{print $1}')
+              name=$(echo "$line" | awk '{$1=""; print $0}' | sed 's/^ //')
+              contributor_notes+="- @${name} (${commits} commits)\n"
+          done <<< "$contributor_stats"
+          # 构建输出内容
+          release_notes="## 版本更新日志 ($current_tag)\n\n"
+          while IFS= read -r category; do
+              if [[ -n "${log_entries[$category]}" ]]; then
+                  release_notes+="### $category\n${log_entries[$category]}\n"
+              fi
+          done < <(yq '.categories[].title' $CONFIG_FILE)
+          # 构建输出内容
+          release_notes="## 版本更新日志 ($current_tag)\n\n"
+          current_date=$(date +"%Y-%m-%d")
+          # 添加发布日期和下载统计信息
+          release_notes+=" ### 📅 发布日期: ${current_date}\n"
+          while IFS= read -r category; do
+              if [[ -n "${log_entries[$category]}" ]]; then
+                  release_notes+="### $category\n${log_entries[$category]}\n"
+              fi
+          done < <(yq '.categories[].title' $CONFIG_FILE)
+
+          # 添加统计信息
+          release_notes+="### 📊 统计信息\n"
+          release_notes+="- 本次发布包含 ${commit_count} 个提交\n"
+          release_notes+="- 影响 ${file_count} 个文件\n\n"
+          # 添加贡献者信息
+          release_notes+="### 👥 贡献者\n"
+          release_notes+="感谢这些优秀的贡献者(按提交次数排序):\n"
+          release_notes+="${contributor_notes}\n"
+          release_notes+="---\n"
+          # 写入文件
+          echo -e "$release_notes" > changelog.md
+          echo "生成日志内容:"
+          cat changelog.md
+      - name: Create Release
+        uses: ncipollo/release-action@v1
+        with:
+          generateReleaseNotes: false
+          bodyFile: changelog.md
+          tag: ${{ github.ref_name }}