nightly_build.sh 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #!/bin/sh
  2. GIT_PROJECT="plc-utils"
  3. if [ $# -eq 1 ]; then
  4. GIT_PROJECT="${1}"
  5. fi
  6. if [ $# -gt 1 ]; then
  7. echo "usage: ${0} [project_name]"
  8. exit 1
  9. fi
  10. GIT_BINARY="/usr/local/bin/git"
  11. GIT_ROOT="ssh://appslinux01.qca.qualcomm.com/home/git/${GIT_PROJECT}"
  12. FAILURE_EMAIL_LIST="nhoughto@qca.qualcomm.com cmaier@qca.qualcomm.com michmonr@qca.qualcomm.com"
  13. SUCCESS_EMAIL_LIST="nhoughto@qca.qualcomm.com cmaier@qca.qualcomm.com michmonr@qca.qualcomm.com"
  14. NOCHANGE_EMAIL_LIST="nhoughto@qca.qualcomm.com"
  15. DEST_ROOT="${HOME}/nightly_build/${GIT_PROJECT}"
  16. DEST_SOURCE="${DEST_ROOT}/source/"
  17. DEST_BINARY="${DEST_ROOT}/binary/"
  18. NIGHTLY_LOG="${DEST_ROOT}/nightly.log"
  19. REPORT_FILE="${DEST_ROOT}/report.log"
  20. LAST_BUILD_FILE="${DEST_ROOT}/last_build"
  21. if [ -z "$(uname -a | grep BSD)" ]; then
  22. MAKE_PROGRAM="make"
  23. else
  24. MAKE_PROGRAM="gmake"
  25. fi
  26. if [ -z "$(uname -a | grep "Cygwin")" ]; then
  27. CYGWIN=0
  28. else
  29. CYGWIN=1
  30. GIT_BINARY="/usr/bin/git"
  31. fi
  32. heading()
  33. {
  34. echo
  35. echo "===> ${1}"
  36. echo
  37. }
  38. nightly_setup()
  39. {
  40. mkdir -p "${DEST_SOURCE}" "${DEST_BINARY}"
  41. if [ $? -ne 0 ]; then
  42. echo "Could not create nightly build directories."
  43. exit 1
  44. fi
  45. }
  46. nightly_update()
  47. {
  48. cd "${DEST_SOURCE}"
  49. if [ $? -ne 0 ]; then
  50. echo "Could not change into directory ${DEST_SOURCE}."
  51. exit 1
  52. fi
  53. if [ ! -e .git ]; then
  54. # initial clone of source
  55. heading "Cloning git repository..."
  56. "${GIT_BINARY}" clone "${GIT_ROOT}" .
  57. if [ $? -ne 0 ]; then
  58. echo "Failed to clone ${GIT_ROOT}."
  59. exit 1
  60. fi
  61. else
  62. # clean the updated source tree.
  63. heading "Cleaning git repository..."
  64. "${GIT_BINARY}" checkout . &&
  65. "${GIT_BINARY}" clean -dxf
  66. if [ $? -ne 0 ]; then
  67. echo "Failed to clean git repository."
  68. exit 1
  69. fi
  70. # update the source
  71. heading "Updating git repository..."
  72. "${GIT_BINARY}" pull
  73. if [ $? -ne 0 ]; then
  74. echo "Failed to pull from ${GIT_ROOT}."
  75. exit 1
  76. fi
  77. fi
  78. if [ ! -e "${LAST_BUILD_FILE}" ]; then
  79. echo "N/A" > "${LAST_BUILD_FILE}"
  80. fi
  81. LAST_BUILD_COMMIT="$(cat "${LAST_BUILD_FILE}")"
  82. CURRENT_COMMIT="$("${GIT_BINARY}" log --pretty="format:%H" HEAD...HEAD~1 | head -1)"
  83. if [ "${CURRENT_COMMIT}" = "${LAST_BUILD_COMMIT}" ]; then
  84. exit 2
  85. else
  86. heading "Changes detected."
  87. echo "Last built commit: ${LAST_BUILD_COMMIT}"
  88. echo "Current commit: ${CURRENT_COMMIT}"
  89. fi
  90. }
  91. nightly_compile()
  92. {
  93. heading "Compiling..."
  94. if [ ${CYGWIN} -eq 0 ]; then
  95. "${MAKE_PROGRAM}"
  96. if [ $? -ne 0 ]; then
  97. echo "${GIT_PROJECT} build failed."
  98. exit 1
  99. fi
  100. else
  101. (unset tmp; unset temp; cd VisualStudioNET && ./vs2010.bat devenv.com plc-utils-2010.sln /build)
  102. if [ $? -ne 0 ]; then
  103. echo "${GIT_PROJECT} build failed."
  104. exit 1
  105. fi
  106. fi
  107. }
  108. nightly_install()
  109. {
  110. if [ ${CYGWIN} -eq 0 ]; then
  111. heading "Installing..."
  112. "${MAKE_PROGRAM}" BIN="${DEST_BINARY}" OWNER="$(id -u)" GROUP="$(id -g)" SUID_PERM="0555" install
  113. if [ $? -ne 0 ]; then
  114. echo "${GIT_PROJECT} install failed."
  115. exit 1
  116. fi
  117. fi
  118. # update last build file.
  119. echo -n "${CURRENT_COMMIT}" > "${LAST_BUILD_FILE}"
  120. if [ $? -ne 0 ]; then
  121. echo "Failed to update last build file."
  122. exit 1
  123. fi
  124. }
  125. nightly_build()
  126. {
  127. nightly_update && nightly_compile && nightly_install
  128. return ${?}
  129. }
  130. nightly_report_start()
  131. {
  132. rm -f "${NIGHTLY_LOG}"
  133. rm -f "${REPORT_FILE}"
  134. START_TIME="$(date +%s)"
  135. }
  136. nightly_report_end()
  137. {
  138. END_TIME="$(date +%s)"
  139. ELAPSED_TIME="$((END_TIME - START_TIME)) seconds"
  140. }
  141. report_success()
  142. {
  143. echo "Nightly build succeeded."
  144. echo
  145. echo "Build Host: $(uname -a)"
  146. echo "Elapsed time: ${ELAPSED_TIME}."
  147. if [ ${CYGWIN} -eq 0 ]; then
  148. echo "Install file count: $(find "${DEST_BINARY}" -type f | wc -l | tr -d ' ')"
  149. echo "Install size: $(du -h "${DEST_BINARY}" | sed 's/\([^ ]*\).*/\1/')"
  150. fi
  151. echo
  152. echo "Log:"
  153. echo
  154. cat "${NIGHTLY_LOG}"
  155. }
  156. report_failure()
  157. {
  158. echo "Nightly build FAILED."
  159. echo
  160. echo "Build Host: $(uname -a)"
  161. echo "Elapsed time: ${ELAPSED_TIME}."
  162. echo
  163. echo "Log:"
  164. echo
  165. cat "${NIGHTLY_LOG}"
  166. }
  167. report_up2date()
  168. {
  169. echo "No changes detected, skipping compile / install."
  170. echo
  171. echo "Build Host: $(uname -a)"
  172. echo "Elapsed time: ${ELAPSED_TIME}."
  173. }
  174. report_unknown()
  175. {
  176. echo "Unknown error."
  177. echo
  178. echo "Build Host: $(uname -a)"
  179. echo "Elapsed time: ${ELAPSED_TIME}."
  180. }
  181. nightly_report()
  182. {
  183. local BUILD_STATUS="$1"
  184. heading "Project: ${GIT_PROJECT}"
  185. case ${BUILD_STATUS} in
  186. 0)
  187. report_success
  188. REPORT_STRING="Success"
  189. EMAIL_LIST="${SUCCESS_EMAIL_LIST}"
  190. ;;
  191. 1)
  192. report_failure
  193. REPORT_STRING="Failure"
  194. EMAIL_LIST="${FAILURE_EMAIL_LIST}"
  195. ;;
  196. 2)
  197. report_up2date
  198. REPORT_STRING="Up to Date"
  199. EMAIL_LIST="${NOCHANGE_EMAIL_LIST}"
  200. ;;
  201. *)
  202. report_unknown
  203. REPORT_STRING="Unknown Error"
  204. EMAIL_LIST="${FAILURE_EMAIL_LIST}"
  205. ;;
  206. esac
  207. }
  208. nightly_setup
  209. nightly_report_start
  210. (nightly_build) > "${NIGHTLY_LOG}" 2>&1
  211. BUILD_STATUS="$?"
  212. nightly_report_end
  213. # generate nightly report
  214. nightly_report ${BUILD_STATUS} > "${REPORT_FILE}" 2>&1
  215. EMAIL_SUBJECT="[${GIT_PROJECT}] Nightly Build - ${REPORT_STRING}"
  216. # email the report file.
  217. if [ ${CYGWIN} -eq 0 ]; then
  218. mail -s "${EMAIL_SUBJECT}" ${EMAIL_LIST} < "${REPORT_FILE}"
  219. else
  220. (cat <<EOF
  221. From: nightly_build@qca.qualcomm.com
  222. To: ${EMAIL_LIST}
  223. Subject: ${EMAIL_SUBJECT}
  224. EOF
  225. cat "${REPORT_FILE}") | /usr/sbin/ssmtp ${EMAIL_LIST}
  226. fi