Advertisement
Guest User

Untitled

a guest
May 24th, 2015
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.86 KB | None | 0 0
  1. #!/bin/sh
  2.  
  3. # Toolkit script for git repos build and distribute release.
  4. # Author: Allex Wang (allex.wxn@gmail.com)
  5. # GistID: fbe05460d1f4005047ad
  6.  
  7. dir=`cd $(dirname $0); pwd -P`
  8. source=$dir/source
  9. [ -d $source ] || { echo >&2 "source dir not exists." && exit 404; }
  10.  
  11. out=$dir/out
  12. lockfile=$out/.lock
  13. verfile=$out/.version
  14. rebuild=1
  15. force=0
  16. publish=0
  17. exclude=( ".svn" ".git" "events" )
  18.  
  19. while getopts ":u:b:m:d:e:fi" opt; do
  20. case $opt in
  21. u) repo_url=$OPTARG ;;
  22. b) branch=$OPTARG ;;
  23. m) IFS="," read -ra mods <<< "$OPTARG"
  24. has_topic=0
  25. for i in "${mods[@]}"; do
  26. [ "$i" == "topic" ] && { has_topic=1; break; }
  27. done
  28. [ $has_topic -eq 1 ] || exclude+=("*topic/*")
  29. unset mods
  30. ;;
  31. d) IFS="," read -ra server <<< "$OPTARG" ;;
  32. f) force=1 ;;
  33. i) rebuild=0 ;;
  34. e) [ "$OPTARG" == "pro" ] && publish=1 ;;
  35. :) echo >&2 "Option -$OPTARG requires an argument."
  36. exit 500
  37. ;;
  38. esac
  39. done
  40.  
  41. if [ -f $lockfile ]; then
  42. if [ $force -eq 1 ]; then
  43. kill -9 `cat $lockfile`
  44. rm -f $lockfile;
  45. else
  46. pid=`cat $lockfile`
  47. if ps -p $pid > /dev/null
  48. then
  49. user=`ps aux|awk -v PID=$pid '$2 == PID { print $1 }'`
  50. echo >&2 "[$user] build is running... (exit 1)" && exit 406;
  51. fi
  52. fi
  53. fi
  54.  
  55. if [ -d $source/.git ]; then
  56. branch=$(cd $source && git rev-parse --abbrev-ref HEAD)
  57. echo "Branch: $branch"
  58. if [ $rebuild -eq 1 ]; then
  59. eval "cd $source && git fetch origin && git reset --hard origin/$branch"
  60. fi
  61. rev=`cd $source && git rev-parse --short HEAD`
  62. fi
  63.  
  64. VERSION=""
  65. ts=${rev}.$(date +%s)
  66. tarball="/tmp/build_${ts}.tgz"
  67. exclude_pattern=""
  68.  
  69. init() {
  70. for i in "${exclude[@]}"; do
  71. exclude_pattern+=" --exclude \"$i\""
  72. done
  73. trap eof SIGINT SIGTERM
  74. echo $$ >$lockfile
  75. }
  76.  
  77. eof() {
  78. [ -f $tarball ] && rm -rf $tarball
  79. [ -f $lockfile ] && rm -rf $lockfile
  80. exit 1;
  81. }
  82.  
  83. dist() {
  84. [ -f $tarball ] || { eval "cd $out && tar czf $tarball $exclude_pattern ./"; }
  85. local list=()
  86. local mode=0
  87. if [ -n "$server" ]; then
  88. list=( ${server[@]} )
  89. mode=1
  90. else
  91. IFS=","; read -t 40 -p "Enter the server name to distribute (q to exit): "
  92. local ex=$?
  93. local ip=$REPLY
  94. # timeout exit.
  95. [ $ex -eq 0 ] || return $ex
  96. [ "$ip" != "q" ] || return 1;
  97. list=( $ip )
  98. fi
  99. if [ -n "${list}" ]; then
  100. # distribute release
  101. remote_dir="/apps/data/web/working/static5.bubugao.com/"
  102. for i in "${list[@]}"
  103. do
  104. target=${i}:${remote_dir}
  105. echo "Releasing to ${target} ..."
  106. if ssh -q -o StrictHostKeyChecking=no -o BatchMode=yes $i true; then
  107. scp -rpq $tarball "apps@$i:$tarball" && ssh apps@$i "mkdir -p \"$remote_dir\"; tar xzf $tarball -C \"$remote_dir\"; rm -f $tarball" && echo "Done. (build: $ts)"
  108. else
  109. echo >&2 "Host key verification failed."
  110. fi
  111. done
  112. fi
  113. [ $mode -eq 1 ] || dist;
  114. }
  115.  
  116. cleanup_dist() {
  117. if [ -d $out/.svn ]; then
  118. cd $out;
  119. svn revert . -R >/dev/null
  120. svn st | grep '^?' | awk '{print $2}' | xargs rm -rf
  121. svn up $out
  122. cd -- >/dev/null
  123. fi
  124. }
  125.  
  126. commit_out() {
  127. if [ -d $out/.svn ]; then
  128. local st=`svn status $out`
  129. if [ -n "$st" ]; then
  130. echo $st |sed -e '/^?/!d' -e 's/^? *//' |xargs -I{} svn add '{}@' >/dev/null 2>&1
  131. echo $st |sed -e '/^!/!d' -e 's/^! *//' |xargs -I{} svn rm '{}@' >/dev/null 2>&1
  132. fi
  133. fi
  134. echo
  135. }
  136.  
  137. prompt_version() {
  138. local ver=""
  139. local git="$1"
  140. # get version by user input
  141. read -t 20 -p "Please enter the version for release (eg: v0.0.1): " ver
  142. local ex=$?
  143. [ $ex -eq 0 ] || return $ex
  144. if [ -z "$ver" ]; then
  145. prompt_version;
  146. else
  147. if ! [[ "$ver" =~ ^v[0-9]+.[0-9]+.[0-9]+ ]]; then
  148. echo "Not a valid version."
  149. prompt_version && return;
  150. fi
  151. VERSION="${ver}"
  152. if $git rev-parse ${VERSION} >/dev/null 2>&1; then
  153. echo "tag exist (${VERSION})."
  154. prompt_version;
  155. fi
  156. fi
  157. }
  158.  
  159. build() {
  160. if [ $publish -eq 1 ]; then
  161. cleanup_dist
  162. fi
  163. if [ $rebuild -ne 0 ]; then
  164. args="$@"
  165. if [[ ! "$args" =~ "-f " ]]; then
  166. args="${args} -c $dir/config.json"
  167. fi
  168. if [[ ! "$args" =~ "-o " ]]; then
  169. args="${args} -o $out"
  170. fi
  171. node $dir/bin/build.js $args
  172. echo $ts >$verfile
  173. fi
  174. }
  175.  
  176. # commit release
  177. release() {
  178. if [ $publish -eq 1 ]; then
  179. commit_out
  180. read -t 20 -p "$(tput setaf 1)Commit to release branche? [y|n]$(tput sgr0) "
  181. if [ "$REPLY" = "y" ]; then
  182. local git='git --git-dir=${source}/.git --work-tree=${source}'
  183. $git fetch --tags &>/dev/null
  184. prompt_version "$git"
  185. if [ -n "$VERSION" ]; then
  186. local msg="Release $VERSION"
  187. svn ci $out -m "$msg" --force-log
  188. [ $? -eq 0 ] && $git tag "${VERSION}" -m "Release $msg" && $git push origin --tags
  189. echo "$msg, done"
  190. else
  191. echo "Release build cancelled."
  192. fi
  193. fi
  194. fi
  195. }
  196.  
  197. init
  198. build "$@"
  199. dist
  200. release
  201.  
  202. eof
  203. # vim: set fdm=manual ts=2 sw=2 sts=2 tw=85 et :
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement