release.yml 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. name: Create Release Tag
  2. on:
  3. push:
  4. tags:
  5. - 'v*' # 推送标签,比如 v1.0, v20.15.10
  6. jobs:
  7. build:
  8. name: 创建发布
  9. runs-on: ubuntu-latest
  10. steps:
  11. - name: 检出代码
  12. uses: actions/checkout@v2
  13. - name: 获取当前和上一个标签
  14. id: get_tags
  15. run: |
  16. git fetch --prune --unshallow
  17. tags=($(git tag -l --sort=-version:refname))
  18. current_tag=${tags[0]}
  19. previous_tag=${tags[1]}
  20. echo "::set-output name=current_tag::$current_tag"
  21. echo "::set-output name=previous_tag::$previous_tag"
  22. - name: 提取并分类提交消息
  23. id: extract_commit_messages
  24. run: |
  25. set -e
  26. current_tag="${{ steps.get_tags.outputs.current_tag }}"
  27. previous_tag="${{ steps.get_tags.outputs.previous_tag }}"
  28. commit_messages=$(git log --pretty=format:"%s %h" "$previous_tag".."$current_tag" | grep -E 'feat|fix|docs|perf')
  29. feat_messages=$(echo "$commit_messages" | grep 'feat' || true)
  30. fix_messages=$(echo "$commit_messages" | grep 'fix' || true)
  31. docs_messages=$(echo "$commit_messages" | grep 'docs' || true)
  32. perf_messages=$(echo "$commit_messages" | grep 'perf' || true)
  33. echo "::set-output name=feat_messages::${feat_messages[@]}"
  34. echo "::set-output name=fix_messages::${fix_messages[@]}"
  35. echo "::set-output name=docs_messages::${docs_messages[@]}"
  36. echo "::set-output name=perf_messages::${perf_messages[@]}"
  37. - name: 获取当前分支名
  38. id: get_branch_name
  39. run: |
  40. branch_name=$(git rev-parse --abbrev-ref HEAD)
  41. echo "::set-output name=branch_name::$branch_name"
  42. - name: 发布说明
  43. id: generate_release_notes
  44. run: |
  45. # 提取提交消息分类
  46. feat_messages=("${{ steps.extract_commit_messages.outputs.feat_messages }}")
  47. fix_messages=("${{ steps.extract_commit_messages.outputs.fix_messages }}")
  48. docs_messages=("${{ steps.extract_commit_messages.outputs.docs_messages }}")
  49. perf_messages=("${{ steps.extract_commit_messages.outputs.perf_messages }}")
  50. # 生成发布说明的Markdown字符串
  51. release_notes="> 请查看 [更新日志](./CHANGELOG.md) 获取所有变更详情。 \n## 更新内容: \n"
  52. if [[ -n "$feat_messages" ]]; then
  53. release_notes="$release_notes\n### ✨ Features | 新功能: \n"
  54. for message in "${feat_messages[@]}"; do
  55. release_notes="$release_notes\n- $message"
  56. done
  57. fi
  58. if [[ -n "$fix_messages" ]]; then
  59. release_notes="$release_notes\n### 🐛 Bug Fixes | Bug 修复: \n"
  60. for message in "${fix_messages[@]}"; do
  61. release_notes="$release_notes\n- $message"
  62. done
  63. fi
  64. if [[ -n "$docs_messages" ]]; then
  65. release_notes="$release_notes\n### ✏️ Documentation | 文档: \n"
  66. for message in "${docs_messages[@]}"; do
  67. release_notes="$release_notes\n- $message"
  68. done
  69. fi
  70. if [[ -n "$perf_messages" ]]; then
  71. release_notes="$release_notes\n### ⚡ Performance Improvements | 性能优化: \n"
  72. for message in "${perf_messages[@]}"; do
  73. release_notes="$release_notes\n- $message"
  74. done
  75. fi
  76. echo "::set-output name=release_notes::$release_notes"
  77. - name: 写入生成的发布说明到 changelog.md
  78. run: |
  79. echo -e "${{ steps.generate_release_notes.outputs.release_notes }}" > changelog.md
  80. cat changelog.md
  81. - name: 创建标签的发布
  82. id: release_tag
  83. uses: ncipollo/release-action@v1
  84. with:
  85. generateReleaseNotes: "false" # 禁用自动生成发布说明
  86. bodyfile: changelog.md