download.sh 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. #! /bin/sh
  2. # 源码地址;
  3. ARG_CODE_URL=''
  4. # 源码存储方式:SVN、GIT
  5. ARG_CODE_REPOS='SVN'
  6. # 源码版本;
  7. ARG_CODE_REVISION=''
  8. # 源码本地路径;
  9. ARG_CODE_WORK_PATH=''
  10. # 日期;
  11. CURR_TIME=$(date +"%Y-%m-%d %T")
  12. #LOG_FILE=/home/data/ApkAutoCompile/shell/log/download_$(date '+%d-%H%M%S').log
  13. LOG_FILE=/home/data/ApkAutoCompile/shell/log/download.log
  14. StrIsSubstring()
  15. {
  16. local x=1
  17. case "$2" in
  18. *$1*) x=0;;
  19. esac
  20. echo $x
  21. }
  22. SwitchIntranet()
  23. {
  24. echo -e "\r\r---------------切换到内网---------------"
  25. route del default gw 10.201.40.1
  26. sleep 2s
  27. route del default gw 10.201.40.1
  28. sleep 1s
  29. route add default gw 10.201.40.1
  30. sleep 2s
  31. route add default gw 10.201.40.1
  32. }
  33. svn_clean()
  34. {
  35. SVN_PATH=$1
  36. if [ -d ${SVN_PATH} ];then
  37. cd ${SVN_PATH}
  38. # 清空;
  39. msg=$(svn cleanup .)
  40. # 查找未提交的文件;
  41. filelist=$(svn status 2>&1)
  42. echo -e "未提交的文件="${filelist}
  43. # 以"? "分组字符串;
  44. filearray=(${filelist//? /})
  45. for File in ${filearray[@]}
  46. do
  47. # 文件是否存在;
  48. if [ -f ${File} ];then
  49. rm -f ${File}
  50. echo -e "已删除文件=${File}"
  51. elif [ -d ${File} ];then
  52. rm -rf ${File}
  53. echo -e "已删除路径=${File}"
  54. fi
  55. done
  56. else
  57. echo -e "svn clean: 路径不存在${SVN_PATH}\n"
  58. fi
  59. }
  60. git_clean()
  61. {
  62. echo ""
  63. }
  64. svn_download()
  65. {
  66. local Opt=$1
  67. echo ${CURR_TIME}
  68. echo -e "shell_log===>Download start---------\n"
  69. echo "AndroidSvnPath=${ARG_CODE_URL}"
  70. echo "AndroidSvnRevision=${ARG_CODE_REVISION}"
  71. echo -e "AndroidCachePath=${ARG_CODE_WORK_PATH}\n"
  72. if [ $Opt -eq 1 ];then
  73. echo -e "删除重新下载Code"
  74. rm -rf ${ARG_CODE_WORK_PATH}
  75. fi
  76. # 如果路径名是个文件,删除;
  77. if [ -f ${ARG_CODE_WORK_PATH} ];then
  78. echo -e "删除已有路径[${ARG_CODE_WORK_PATH}]代码\n"
  79. rm -rf ${ARG_CODE_WORK_PATH}
  80. sleep 1s
  81. fi
  82. # 如果路径存在,只更新;
  83. if [ -d ${ARG_CODE_WORK_PATH} ];then
  84. # clean清空;
  85. svn_clean ${ARG_CODE_WORK_PATH}
  86. cd ${ARG_CODE_WORK_PATH}
  87. echo -e "svn cleanup msg="${msg}"\n"
  88. if [ ${ARG_CODE_REVISION} != "" -a ${ARG_CODE_REVISION} != "0" ];then
  89. echo -e "update the specified version!\n"
  90. msg=$(svn up -r ${ARG_CODE_REVISION} --force 2>&1)
  91. else
  92. echo -e "update the latest version!\n"
  93. msg=$(svn up --force 2>&1)
  94. fi
  95. else #### 如果路径不存在,checkout;
  96. if [ ${ARG_CODE_REVISION} != "" -a ${ARG_CODE_REVISION} != "0" ];then
  97. echo -e "download the specified version!\n"
  98. msg=$(svn co -r ${ARG_CODE_REVISION} --force ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
  99. else
  100. echo -e "download the latest version!\n"
  101. msg=$(svn co --force ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
  102. fi
  103. fi
  104. echo -e "svn msg=${msg}\n"
  105. # 修改update_modules.sh权限;
  106. if [ ! -d ${ARG_CODE_WORK_PATH} ];then
  107. echo -e "下载代码[${ARG_CODE_URL}]失败"
  108. else
  109. cd ${ARG_CODE_WORK_PATH}
  110. update_modules
  111. fi
  112. echo -e "\nshell_log===>Download end------------"
  113. }
  114. git_download()
  115. {
  116. local Opt=$1
  117. echo ${CURR_TIME}
  118. echo "shell_log===>Download start---------"
  119. echo "AndroidSvnPath=${ARG_CODE_URL}"
  120. echo "AndroidSvnRevision=${ARG_CODE_REVISION}"
  121. echo "AndroidCachePath=${ARG_CODE_WORK_PATH}"
  122. if [ ${Opt} -eq 1 ]; then
  123. echo -e "删除重新下载Code"
  124. rm -rf ${ARG_CODE_WORK_PATH}
  125. # 重新下载代码;
  126. msg=$(git clone ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
  127. echo "git clone msg: $msg\n"
  128. if [[ $msg != *"Total "* ]]; then
  129. echo -e "1.下载代码[${ARG_CODE_URL}]失败"
  130. exit
  131. fi
  132. else
  133. # 更新代码;
  134. if [ -d ${ARG_CODE_WORK_PATH} ];then
  135. cd ${ARG_CODE_WORK_PATH}
  136. msg=$(git pull origin master 2>&1)
  137. echo -e "git pull msg=${msg}\n"
  138. if [[ $msg != *"Already up to date."* ]]; then
  139. echo -e "1.更新代码[${ARG_CODE_URL}]失败"
  140. exit
  141. fi
  142. else
  143. # 重新下载代码;
  144. msg=$(git clone ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
  145. echo "git clone msg: $msg\n"
  146. if [[ $msg != *"Total "* ]]; then
  147. echo -e "2.下载代码[${ARG_CODE_URL}]失败"
  148. exit
  149. fi
  150. fi
  151. fi
  152. if [ ${ARG_CODE_REVISION} != "" -a ${ARG_CODE_REVISION} != "0" ];then
  153. echo "download the specified version!"
  154. # 切换到指定commit id;
  155. msg=$(git checkout -b master ${ARG_CODE_REVISION} 2>&1)
  156. echo "git checkout msg: $msg\n"
  157. else
  158. echo "download the latest version!"
  159. fi
  160. if [ ! -d ${ARG_CODE_WORK_PATH} ];then
  161. echo -e "2.下载代码[${ARG_CODE_URL}]失败"
  162. else
  163. cd ${ARG_CODE_WORK_PATH}
  164. update_modules
  165. fi
  166. echo "shell_log===>Download end------------"
  167. }
  168. update_svn_modules()
  169. {
  170. local name=$1 # 模块名称;
  171. local url=$2 # 模块地址;
  172. local revision=$3 # 模块版本;
  173. echo -e "on func:update_svn_modules:${name},${url},${revision}\n"
  174. # 判断模块名文件夹是否存在;
  175. if [ -d ${name} ];then
  176. echo -e "${name}->存在\n"
  177. if [ ${revision} != "" -a ${revision} != "0" ];then
  178. echo -e "update the specified version!\n"
  179. msg=$(svn up -r ${revision} --force 2>&1)
  180. else
  181. echo -e "update the latest version!\n"
  182. msg=$(svn up --force 2>&1)
  183. fi
  184. echo -e "svn up msg=${msg}\n"
  185. else
  186. echo -e "${name}->不存在\n"
  187. if [ ${revision} != "" -a ${revision} != "0" ];then
  188. echo -e "download the specified version!\n"
  189. msg=$(svn co -r ${revision} --force ${url} ${name} 2>&1)
  190. else
  191. echo -e "download the latest version!\n"
  192. msg=$(svn co --force ${url} ${name} 2>&1)
  193. fi
  194. echo -e "svn up msg=${msg}\n"
  195. fi
  196. }
  197. update_git_modules()
  198. {
  199. local name=$1 # 模块名称;
  200. local url=$2 # 模块地址;
  201. local revision=$3 # 模块版本;
  202. local subdir=$4 # 仓库子路径;
  203. echo -e "on func:update_git_modules:${name},${url},${revision},${subdir}\n"
  204. if [ x${subdir} == x"" ];then
  205. echo -e "git clone all repo\n"
  206. # 判断模块名文件夹是否存在;
  207. if [ -d ${name} ];then
  208. echo -e "${name}->存在\n"
  209. # 先更新;
  210. msg=$(git pull origin master 2>&1)
  211. echo "git pull msg: $msg\n"
  212. if [ ${revision} != "" -a ${revision} != "0" ];then
  213. msg=$(git checkout -b master ${revision} 2>&1)
  214. echo "git checkout msg: $msg\n"
  215. else
  216. echo -e "update the latest version!\n"
  217. fi
  218. else
  219. echo -e "${name}->不存在\n"
  220. # 先clone;
  221. msg=$(git clone ${url} ${name} 2>&1)
  222. echo "git clone msg: $msg\n"
  223. if [ ${revision} != "" -a ${revision} != "0" ];then
  224. msg=$(git checkout -b master ${revision} 2>&1)
  225. echo "git checkout msg: $msg\n"
  226. else
  227. echo -e "download the latest version!\n"
  228. fi
  229. fi
  230. else
  231. echo -e "git clone sub dir\n"
  232. if [ ! -d ${name} ];then
  233. mkdir ${name}
  234. fi
  235. cd ${name}
  236. # 初始化空仓库;
  237. git init
  238. # 拉取远程仓库;
  239. git remote add -f origin ${url}
  240. # 开启sparse clone;
  241. git config core.sparsecheckout true
  242. # 设置要pull的目录;
  243. echo ${subdir} >> .git/info/sparse-checkout
  244. more .git/info/sparse-checkout
  245. # 更新;
  246. git pull origin master
  247. fi
  248. }
  249. update_modules()
  250. {
  251. echo -e "### on func:update_modules ###\n"
  252. # 进入源码路径;
  253. cd ${ARG_CODE_WORK_PATH}
  254. # 判断modules_svn.cfg是否存在;
  255. if [ -f "modules_svn.cfg" ];then
  256. local git_user=$(git config --global --list |grep user.name|cut -d'=' -f2)
  257. local git_email=$(git config --global --list |grep user.email|cut -d'=' -f2)
  258. echo "user.name=${git_user}, user.email=${git_email}"
  259. local module_name= module_url= module_ver= module_subdir=
  260. # 读取git config --global --list内容; 从中获取到用户名、邮箱;
  261. # git clone ssh://邮箱名@10.126.16.60:29418/TIF_ATSCInput.git
  262. ###################################################################################################################
  263. # SVN的cfg文件如下;
  264. # modules_svn.cfg: [MODULE],UDP,https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/src/UDP/udp,6265
  265. ###################################################################################################################
  266. # GIT的cfg文件如下:比SVN多出的一项是该仓库下的子目录;
  267. # modules_svn.cfg: [MODULE],UDP,ssh://apk@10.126.16.60:29418/UDP,6265,udp
  268. # modules_svn.cfg: [MODULE],firebaseanalytisc,ssh://apk@10.126.16.60:29418/firebaseanalytisc,6255,firebaseanalytisc
  269. # 按行读取;
  270. while read line
  271. do
  272. val=`echo $line|sed 's/[\r\n]*$//g'`
  273. echo "行内容:$val"
  274. if [ `StrIsSubstring "[MODULE]" $val` -ne 0 ]; then
  275. echo "Warning: No Module Format in - " + $val
  276. continue
  277. fi
  278. # 获取模块名称;
  279. val=${val#*,}
  280. module_name=${val%%,*}
  281. # 获取模块地址;
  282. val=${val#*,}
  283. module_url=${val%%,*}
  284. # 判断模块存储仓库类型;
  285. if [[ $module_url = *"https://odm-design-center-hz.tclking.com"* ]];then
  286. echo "源码为svn"
  287. # 获取版本;
  288. if [ `StrIsSubstring "," $val` -eq 0 ]; then
  289. module_ver=${val#*,}
  290. else
  291. module_ver=""
  292. fi
  293. echo -e "module_name=${module_name}\nmodule_url=${module_url}\nmodule_ver=${module_ver}"
  294. update_svn_modules ${module_name} ${module_url} ${module_ver}
  295. elif [[ $module_url = *"10.126.16.60"* ]];then
  296. echo "源码为git"
  297. # 获取版本;
  298. val=${val#*,}
  299. module_ver=${val%%,*}
  300. # 获取子路径;
  301. if [ `StrIsSubstring "," $val` -eq 0 ]; then
  302. module_subdir=${val#*,}
  303. else
  304. module_subdir=""
  305. fi
  306. echo -e "module_name=${module_name}\nmodule_url=${module_url}\nmodule_ver=${module_ver}\n${module_subdir}"
  307. update_git_modules ${module_name} ${module_url} ${module_ver} ${module_subdir}
  308. fi
  309. done < "modules_svn.cfg"
  310. else
  311. echo -e "modules_svn.cfg 模块文件不存在\n"
  312. fi
  313. }
  314. main()
  315. {
  316. ARG_CODE_URL=$1
  317. ARG_CODE_REVISION=$2
  318. ARG_CODE_WORK_PATH=$3
  319. ############################## 获取APK名称 #############################################
  320. APK_NAME=$ARG_CODE_URL
  321. # 取右边第一个字符,判断是否为斜杠;
  322. if [ "${APK_NAME:0-1:1}" = "/" ];then
  323. # 若为斜杠,%号截取,删除右边第一个'/'及右边字符,保存左边字符;
  324. echo "最后为斜杠,删除斜杠"
  325. APK_NAME=${APK_NAME%/*}
  326. fi
  327. # 获取APK名称;
  328. APK_NAME=${APK_NAME##*/}
  329. # 重新定义log文件;
  330. if [ ! -d /home/data/ApkAutoCompile/shell/log/download/ ];then
  331. msg=$(mkdir /home/data/ApkAutoCompile/shell/log/download/last)
  332. fi
  333. LOG_FILE="/home/data/ApkAutoCompile/shell/log/download/${APK_NAME}.log"
  334. ############################## 获取APK名称 #############################################
  335. if [ ! -d /home/data/ApkAutoCompile/cacheAndroidSrc ];then
  336. # 递归创建目录;
  337. mkdir -p /home/data/ApkAutoCompile/cacheAndroidSrc
  338. fi
  339. SwitchIntranet
  340. if [[ $ARG_CODE_URL = *"https://odm-design-center-hz.tclking.com"* ]];then
  341. echo "源码为svn"
  342. ARG_CODE_REPOS='SVN'
  343. svn_download 1 2>&1 | tee ${LOG_FILE}
  344. # 导出svn提交账号;
  345. cd ${ARG_CODE_WORK_PATH}
  346. svn log --xml | grep "^<author" | sort -u | \awk -F '<author>' '{print $2}' | awk -F '</author>' '{print $1}' > userinfo.txt
  347. elif [[ $ARG_CODE_URL = *"10.126.16.60"* ]];then
  348. echo "源码为git"
  349. ARG_CODE_REPOS='GIT'
  350. git_download 1 2>&1 | tee ${LOG_FILE}
  351. fi
  352. }
  353. main $@