小编给大家分享一下如何通过Git WebHooks+脚本实现自动更新发布代码,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
脚本如下:
#!/usr/bin/env bash # Public header # ============================================================================================================================= # Check that we are root ... so non-root users stop here [ `id -u` -eq "0" ] || exit 4 # resolve links - $0 may be a symbolic link PRG="$0" while [ -h "$PRG" ]; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`/"$link" fi done # Get standard environment variables PRGDIR=`dirname "$PRG"` # echo color function function cecho { # Usage: # cecho -red sometext #Error, Failed # cecho -green sometext # Success # cecho -yellow sometext # Warning # cecho -blue sometext # Debug # cecho -white sometext # info # cecho -n # new line # end while [ "$1" ]; do case "$1" in -normal) color="\033[00m" ;; # -black) color="\033[30;01m" ;; -red) color="\033[31;01m" ;; -green) color="\033[32;01m" ;; -yellow) color="\033[33;01m" ;; -blue) color="\033[34;01m" ;; # -magenta) color="\033[35;01m" ;; # -cyan) color="\033[36;01m" ;; -white) color="\033[37;01m" ;; -n) one_line=1; shift ; continue ;; *) echo -n "$1"; shift ; continue ;; esac shift echo -en "$color" echo -en "$1" echo -en "\033[00m" shift done if [ ! $one_line ]; then echo fi } # end echo color function # echo color function, smarter function echo_r () { #Error, Failed [ $# -ne 1 ] && return 0 echo -e "\033[31m$1\033[0m" } function echo_g () { # Success [ $# -ne 1 ] && return 0 echo -e "\033[32m$1\033[0m" } function echo_y () { # Warning [ $# -ne 1 ] && return 0 echo -e "\033[33m$1\033[0m" } function echo_b () {\ # Debug [ $# -ne 1 ] && return 0 echo -e "\033[34m$1\033[0m" } # end echo color function, smarter WORKDIR=$PRGDIR # end public header # ============================================================================================================================= # begin customization for special case # project directory to waiting for update config_project_dir=example_projects # resources directory which contain config file and update files config_resources_dir=example_resources config_config_file=$config_resources_dir/config_update.conf config_backup_dir=example_backup_dir # log options config_this_logfile=$WORKDIR/.update_backup.log # end function check_dependencies(){ echo_b "Checking dependencies for update procedure. " if [ -z $config_project_dir ]; then echo_r "Error: config_project_dir is undefined! " exit 1 fi if [ ! -d $config_resources_dir ]; then echo_r "Error: config_resources_dir is undefined! " fi if [ -z $config_config_file ]; then echo_r "Error: config_config_file is undefined! " exit 1 fi left_disk_space=`df $config_backup_dir | tail -n1 | awk '{print $(NF -2)}'` # set 2097152 to project directory size if [ -z $config_project_dir -o ! -d $config_project_dir ]; then project_file_space_usage=$(du -s /root | awk '{print $1}') required_size=$(expr $project_file_space_usage \* 2) fi if [[ $left_disk_space -lt $required_size ]]; then echo_r "Disk space of $config_backup_dir is smaller than $required_size. " exit 1 fi echo_g "All required dependencies check pass! " } function test_self(){ # How to use this function: # First execute "$0 test_self", then execute "$0 update" echo_b "Test purpose begin. " # clean old test example echo_b "Clean old test example. " [ -d $WORKDIR/example_projects ] && rm -rf $WORKDIR/example_projects [ -d $WORKDIR/example_resources ] && rm -rf $WORKDIR/example_resources [ -d $WORKDIR/example_backup_dir ] && rm -rf $WORKDIR/example_backup_dir # make an example project directory if [ -z $config_project_dir -o ! -d $config_project_dir ]; then echo_b "Making an example project directory. " mkdir $WORKDIR/example_projects config_project_dir=example_projects # Padding example_projects directory touch $config_project_dir/example_filename mkdir $config_project_dir/example_directory fi # make an example resources directory if [ -z $config_resources_dir -o ! -d $config_resources_dir ]; then echo_b "Making an example resources directory. " mkdir $WORKDIR/example_resources config_resources_dir=$WORKDIR/example_resources fi # make an example config_update.conf if [ -z $config_config_file -o ! -f $config_config_file ]; then echo_b "Making an example config_update.conf file. " touch $config_resources_dir/config_update.conf config_config_file=$config_resources_dir/config_update.conf # Padding config_update.conf file cat >$config_config_file <<eof file filename1 add file filename2 remove file filename3 update file filename4 add config cleancachea enable config cleancacheb disable config restartservicea enable config restartserviceb disable target 192.168.1.241 ssh target 192.168.1.242 ssh eof files=`awk -F '[ ]+' '/^file/ { print $2 }' $config_config_file` echo_b "Making an example files(patches) refer to $config_config_file. " for names in $files; do [ ! -f $config_resources_dir/$names ] && touch $config_resources_dir/$names done fi # TODO # test network and ssh for remote call # make an example backup directory if [ -z $config_backup_dir -o ! -d $config_backup_dir ]; then echo_b "Making an example backup directory" mkdir $WORKDIR/example_backup_dir config_backup_dir=$WORKDIR/example_backup_dir fi echo_g "Test purpose is finished and successfully! " } #function parse_config_file(){ # # unbanned action # files=`awk -F '[ ]+' '/^file/ { print $2 }' $config_config_file` # configs=`awk -F '[ ]+' '/^config/ { print $2 }' $config_config_file` #} function do_cp(){ SOURCE=$1 # echo "var: $SOURCE" # echo "result: $(dirname $SOURCE | grep ^\/ | awk '{print substr($1,1,1)}' )" # exit 0 if test "$(dirname $SOURCE | grep ^\/ | awk '{print substr($1,1,1)}')" == ""; then echo_b "Execute copy action. " DEST=$config_project_dir/$SOURCE \cp $SOURCE $DEST else echo_y "Self test purpose found! But we can do this action! " [ ! -d $config_project_dir/$(dirname $SOURCE) ] && mkdir -p $config_project_dir/$(dirname $SOURCE) \cp $SOURCE $config_project_dir/$(dirname $SOURCE) fi } function do_remove(){ FILE=$1 if test "$(dirname $SOURCE | awk -F '/' '{print $1}')" == ""; then rm -rf $config_project_dir/$FILE else echo_y "Self test purpose found! This can NOT do remove action on self test purpose, skipping..." return fi } # TODO # for remote call #function do_remote_cp(){} #function fo_remote_remove(){} function file_operation(){ echo_b "Begin files operations" files=`awk -F '[ ]+' '/^file/ { print $2 }' $config_config_file` for names in $files; do if grep $names $config_config_file | grep add >/dev/null 2>&1 ; then # do_cp do_cp $names elif grep $names $config_config_file | grep update >/dev/null 2>&1 ;then # do_cp do_cp $names elif grep $names $config_config_file | grep remove >/dev/null 2>&1 ;then # do_remove do_remove $names else exit 1 fi done echo_g "Files operations finished successfully! " } # TODO # no example here, please refer to your real production environment #function do_clean_cache(){} #function do_restart_service(){} function service_operation(){ echo_b "Begin services operations" configs=`awk -F '[ ]+' '/^config/ { print $2 }' $config_config_file` for names in $configs; do if grep $names $config_config_file | grep cleancache | grep enable >/dev/null 2>&1 ; then # do_clean_cache echo do_clean_cache $names elif grep $names $config_config_file | grep cleancache | grep disable >/dev/null 2>&1 ; then # echo a warning echo_y "Warning: disable action is NOT recommended, $names skipped." elif grep $names $config_config_file | grep restartservice | grep enable >/dev/null 2>&1 ; then # do_restart_service echo do_restart_service $names elif grep $names $config_config_file | grep restartservice | grep disable >/dev/null 2>&1 ; then # echo a warning echo_y "Warning: disable action is NOT recommended, $names skipped." else echo $names echo_r "Error: Wrong config file $config_config_file, please check it. " exit 1 fi done echo_g "Services operations finished successfully! " } function check_remote_server_status(){ # TODO # for remote call echo } function backup(){ echo_b "Backup files before update" # backup_filename=backup_$(date +%F_%H_%M_%S).tgz backup_filename=backup_$(date +%Y_%m_%d_%H_%M_%S).tgz tar --create --gzip --absolute-names --file=$config_backup_dir/$backup_filename $config_project_dir if [ $? -eq 0 ]; then echo_g "Backup files before update finished and successfully! " echo "restore_least_file=$config_backup_dir/$backup_filename" > $config_this_logfile else echo_r "Error: Backup files before update failed! Please alter to administrator. " exit 1 fi } function restore(){ echo_b "Restore files for rollback" if [ -f $config_this_logfile ]; then . $config_this_logfile fi restore_least_file=${restore_least_file:-1} if [ -s $restore_least_file ]; then tar -C $config_project_dir/.. -zxf $restore_least_file if [ $? -eq 0 ]; then echo_g "Restore files finished and successfully! " else echo_r "Restore files failed! Please alter to administrator. " exit 1 fi else echo_r "Can NOT find backup files in $config_backup_dir, backup once indeed? " exit 1 fi } # TODO # for remote call # function remote_backup(){} # function remote_restore(){} function rollback(){ echo_b "rollback after update failed" $0 restore echo_g "rollback finished and successfully! " } function update_status(){ # TODO # no example here, please refer to your real production environment # check if update success or failure echo update_status # if failure, do rollback action # service_operation } function update(){ # TODO # thinking carefully with all exit status, which is not good for automatic update check_dependencies backup file_operation service_operation update_status } function destroy() { # echo a warning message echo_y "Warning: This action will destroy all this project, and this is unrecoverable! " answer="n" echo_y "Do you want to destroy this project? " read -p "(Default no,if you want please input: y ,if not please press the enter button):" answer case "$answer" in y|Y|Yes|YES|yes|yES|yEs|YeS|yeS ) # delete all file expect for this script self # find: warning: Unix filenames usually don't contain slashes (though pathnames do). That means that '-name `./deploy.sh'' will probably evaluate to false all the time on this system. You might find the '-wholename' test more useful, or perhaps '-samefile'. Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ `./deploy.sh''. # echo $WORKDIR/ #find -L $WORKDIR -type f ! -name "$(basename $0)" -exec ls --color=auto -al {} \; # find -L . -type f ! -name "deploy.sh" -exec ls --color=auto -al {} \; # find -L . -type d -exec ls --color=auto -al {} \; # find -L ./ -maxdepth 1 ! -name "deploy.sh" ! -wholename "./" # ls | grep -v "fielname" |xargs rm -rf find -L $WORKDIR -maxdepth 1 ! -name "$(basename $0)" ! -wholename "$WORKDIR" -exec rm -rf {} \; if [ $? -eq 0 ];then echo_g "Destory this project successfully! Now will exit with status 0. " exit 0 else echo_r "Error: something go wrong! Please check or alter to Admin user! " exit 1 fi ;; n|N|No|NO|no|nO) echo_g "destroy action is cancel" exit 0 ;; *) echo_r "Are you kidding me? You are a bad kid! " exit 1 ;; esac } case $1 in update) update ;; backup) backup ;; restore) restore ;; rollback) rollback ;; destroy) destroy ;; help|*) echo "Usage: $0 {update|backup|restore|rollback|destroy} with $0 itself" exit 1 ;; esac # This is not essential with 'case .. esac' handled no args excutions # replace "exit 0" with ":" #exit 0 :
以上是“如何通过Git WebHooks+脚本实现自动更新发布代码”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。