tool-trunk-checker.sh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #!/bin/bash
  2. # 自动运行代码质量检查
  3. # 显示使用说明
  4. show_usage() {
  5. echo "用法: $0 [选项] [文件或目录...]"
  6. echo "选项:"
  7. echo " -a, --all 检查所有文件"
  8. echo " -g, --git [默认] 只检查git相关的文件(已修改、已暂存、未跟踪)"
  9. echo " -f, --file FILE 指定要检查的特定文件"
  10. echo " -d, --dir DIR 指定要检查的目录"
  11. echo " --help 显示此帮助信息"
  12. echo ""
  13. echo "示例:"
  14. echo " $0 # 检查所有git相关文件(默认)"
  15. echo " $0 -f file1.go -f file2.py # 检查指定文件"
  16. echo " $0 -d src/ -d tests/ # 检查指定目录"
  17. echo " $0 file1.go src/ tests/ # 混合指定文件和目录"
  18. }
  19. # 默认模式:检查git相关文件
  20. MODE="git"
  21. # 解析命令行参数
  22. declare -a USER_FILES_ARRAY=()
  23. while [[ $# -gt 0 ]]; do
  24. case $1 in
  25. -a | --all)
  26. MODE="all"
  27. shift
  28. ;;
  29. -g | --git)
  30. MODE="git"
  31. shift
  32. ;;
  33. -f | --file)
  34. if [ -f "$2" ]; then
  35. USER_FILES_ARRAY+=("$2")
  36. else
  37. echo "警告:文件 '$2' 不存在,跳过"
  38. fi
  39. shift 2
  40. ;;
  41. -d | --dir)
  42. if [ -d "$2" ]; then
  43. # 查找目录下的所有文件并添加到数组
  44. while IFS= read -r file; do
  45. [ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && USER_FILES_ARRAY+=("${file}")
  46. done < <(find "$2" -type f 2>/dev/null | grep -v '/\.' || true)
  47. else
  48. echo "警告:目录 '$2' 不存在,跳过"
  49. fi
  50. shift 2
  51. ;;
  52. --help)
  53. show_usage
  54. exit 0
  55. ;;
  56. -*)
  57. echo "错误:未知选项 '$1'"
  58. show_usage
  59. exit 1
  60. ;;
  61. *)
  62. # 处理直接指定的文件或目录
  63. if [ -f "$1" ]; then
  64. USER_FILES_ARRAY+=("$1")
  65. elif [ -d "$1" ]; then
  66. # 查找目录下的所有文件并添加到数组
  67. while IFS= read -r file; do
  68. [ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && USER_FILES_ARRAY+=("${file}")
  69. done < <(find "$1" -type f 2>/dev/null | grep -v '/\.' || true)
  70. else
  71. echo "警告:'$1' 不是文件或目录,跳过"
  72. fi
  73. shift
  74. ;;
  75. esac
  76. done
  77. # 将数组转换为换行分隔的字符串
  78. if [ ${#USER_FILES_ARRAY[@]} -gt 0 ]; then
  79. USER_FILES=$(printf "%s\n" "${USER_FILES_ARRAY[@]}")
  80. else
  81. USER_FILES=""
  82. fi
  83. echo ""
  84. echo "🚀 正在运行代码质量检查..."
  85. echo "========================================"
  86. echo "模式: ${MODE}"
  87. # 切换到工作目录
  88. cd /workspace || exit
  89. # 检查trunk工具是否可用
  90. if ! command -v ./trunk &>/dev/null; then
  91. echo "❌ trunk工具未找到,请确保已正确安装"
  92. exit 1
  93. fi
  94. # 根据模式获取需要检查的文件
  95. if [ "${MODE}" = "all" ]; then
  96. # 检查所有文件
  97. ALL_FILES=$(find . -type f 2>/dev/null | grep -v '/\.' | grep -v '^/\.' | sort | uniq || true)
  98. elif [ -n "${USER_FILES}" ]; then
  99. # 使用用户指定的文件
  100. ALL_FILES="${USER_FILES}"
  101. else
  102. # 默认:检查git相关文件
  103. STAGED_FILES=$(git diff --name-only --diff-filter=d 2>/dev/null || true)
  104. NEW_FILES=$(git diff --cached --name-only --diff-filter=A 2>/dev/null || true)
  105. UNTRACKED_FILES=$(git ls-files --others --exclude-standard 2>/dev/null || true)
  106. # 使用数组安全地合并文件列表
  107. declare -a ALL_FILES_ARRAY=()
  108. # 添加已修改的文件
  109. if [ -n "${STAGED_FILES}" ]; then
  110. while IFS= read -r file; do
  111. [ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && ALL_FILES_ARRAY+=("${file}")
  112. done <<<"${STAGED_FILES}"
  113. fi
  114. # 添加新暂存的文件
  115. if [ -n "${NEW_FILES}" ]; then
  116. while IFS= read -r file; do
  117. [ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && ALL_FILES_ARRAY+=("${file}")
  118. done <<<"${NEW_FILES}"
  119. fi
  120. # 添加未跟踪的文件
  121. if [ -n "${UNTRACKED_FILES}" ]; then
  122. while IFS= read -r file; do
  123. [ -n "${file}" ] && [[ ${file} != */.* ]] && [[ ${file} != .* ]] && ALL_FILES_ARRAY+=("${file}")
  124. done <<<"${UNTRACKED_FILES}"
  125. fi
  126. # 去重并生成最终文件列表
  127. if [ ${#ALL_FILES_ARRAY[@]} -gt 0 ]; then
  128. ALL_FILES=$(printf "%s\n" "${ALL_FILES_ARRAY[@]}" | sort | uniq || true)
  129. else
  130. ALL_FILES=""
  131. fi
  132. fi
  133. # 去重并过滤空行和隐藏文件(针对非数组模式)
  134. if [ "${MODE}" = "all" ] || [ -n "${USER_FILES}" ]; then
  135. ALL_FILES=$(echo "${ALL_FILES}" | grep -v '^$' | grep -v '/\.' | grep -v '^/\.' | sort | uniq || true)
  136. fi
  137. if [ -z "${ALL_FILES}" ]; then
  138. echo "ℹ️ 没有找到需要检查的文件"
  139. exit 0
  140. fi
  141. # 检查文件数量
  142. FILE_COUNT=$(echo "${ALL_FILES}" | wc -l)
  143. echo ""
  144. echo "📊 共发现 ${FILE_COUNT} 个需要检查的文件:"
  145. echo "${ALL_FILES}"
  146. echo ""
  147. # 运行trunk check检查代码质量
  148. echo ""
  149. echo "🔍 正在运行代码质量检查..."
  150. if ! ./trunk check ${ALL_FILES}; then
  151. echo ""
  152. echo "❌ 代码质量检查失败!"
  153. echo ""
  154. echo "请修复上述问题后再提交"
  155. echo ""
  156. exit 1
  157. fi
  158. # 检查安全漏洞
  159. echo ""
  160. echo "🔒 正在检查安全漏洞..."
  161. if ! ./trunk check --filter=trivy ${ALL_FILES}; then
  162. echo ""
  163. echo "⚠️ 发现安全相关问题,建议检查后再推送"
  164. echo ""
  165. exit 1
  166. fi
  167. echo ""
  168. echo "✅ 代码质量检查通过!可以安全提交。"
  169. echo "========================================"
  170. echo ""
  171. exit 0