push.sh 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/bin/bash
  2. RED='\033[0;31m'
  3. GREEN='\033[0;32m'
  4. YELLOW='\033[0;33m'
  5. MAGENTA='\033[0;35m'
  6. RESET='\033[0m'
  7. function execute_command() {
  8. command="$1"
  9. message="$2"
  10. exit_on_failure=${3:-true}
  11. echo "${GREEN}执行命令:${command}${RESET}"
  12. eval "${command}"
  13. status=$?
  14. if [[ ${status} -ne 0 ]]; then
  15. echo "${RED}错误:${message}${RESET}"
  16. if [[ "$exit_on_failure" == "true" ]]; then
  17. exit ${status}
  18. else
  19. return ${status}
  20. fi
  21. fi
  22. }
  23. while getopts "p:e:" opt; do
  24. case $opt in
  25. p)
  26. product_code="${OPTARG}"
  27. ;;
  28. e)
  29. env="${OPTARG}"
  30. ;;
  31. *)
  32. echo "用法:$0 -p 产品code [-e 发布环境]"
  33. exit 1
  34. ;;
  35. esac
  36. done
  37. if [ -z "$product_code" ]; then
  38. echo "错误:必须指定产品 code (-p)"
  39. echo "用法:$0 -p 产品code [-e 发布环境]"
  40. exit 1
  41. fi
  42. env=${env:-test}
  43. echo "${MAGENTA}正在合并代码到 ${product_code}-test 分支...${RESET}"
  44. # 切换并拉取 master 分支
  45. execute_command "git checkout master" "切换至 master 分支失败"
  46. execute_command "git pull" "拉取 master 分支最新内容失败"
  47. # 合并 master 到 ${product_code}-test
  48. execute_command "git checkout ${product_code}-test" "切换至 ${product_code}-test 分支失败"
  49. execute_command "git pull" "拉取 ${product_code}-test 分支最新内容失败"
  50. execute_command "git merge master" "合并 master 到 ${product_code}-test 分支失败" "false"
  51. merge_m2t_status=$?
  52. if [ $merge_m2t_status -ne 0 ]; then
  53. # 检查是否有冲突
  54. if [[ $(git ls-files -u | wc -l) -gt 0 ]]; then
  55. echo "${YELLOW}检测到合并冲突,请手动解决冲突...${RESET}"
  56. echo "${YELLOW}解决冲突后,按任意键继续...${RESET}"
  57. read -n 1 -s -r -p ""
  58. if [[ $(git ls-files -u | wc -l) -gt 0 ]]; then
  59. echo "${RED}错误:仍存在未解决的冲突,请处理后再继续${RESET}"
  60. exit 1
  61. fi
  62. execute_command "git commit -m 'chore(merge): 解决冲突'" "提交冲突解决方案失败"
  63. else
  64. exit ${merge_m2t_status}
  65. fi
  66. fi
  67. execute_command "git push" "推送 ${product_code}-test 分支失败"
  68. # 合并 ${product_code}-test 到 ${product_code}-prod
  69. if [ "$env" = "prod" ]; then
  70. echo "${MAGENTA}正在合并代码到 ${product_code}-prod 分支...${RESET}"
  71. execute_command "git checkout ${product_code}-prod" "切换至 ${product_code}-prod 分支失败"
  72. execute_command "git pull" "拉取 ${product_code}-prod 分支最新内容失败"
  73. execute_command "git merge ${product_code}-test" "合并 ${product_code}-test 到 ${product_code}-prod 分支失败" "false"
  74. merge_t2p_status=$?
  75. if [ $merge_t2p_status -ne 0 ]; then
  76. # 检查是否有冲突
  77. if [[ $(git ls-files -u | wc -l) -gt 0 ]]; then
  78. echo "${YELLOW}检测到合并冲突,请手动解决冲突...${RESET}"
  79. echo "${YELLOW}解决冲突后,按任意键继续...${RESET}"
  80. read -n 1 -s -r -p ""
  81. if [[ $(git ls-files -u | wc -l) -gt 0 ]]; then
  82. echo "${RED}错误:仍存在未解决的冲突,请处理后再继续${RESET}"
  83. exit 1
  84. fi
  85. execute_command "git commit -m 'chore(merge): 解决冲突'" "提交冲突解决方案失败"
  86. else
  87. exit ${merge_t2p_status}
  88. fi
  89. fi
  90. execute_command "git push" "推送 ${product_code}-prod 分支失败"
  91. fi
  92. # 切换到 xiaom 分支
  93. execute_command "git checkout xiaom" "切换至 xiaom 分支失败"