设为首页 收藏本站
查看: 807|回复: 0

[经验分享] 通过Git WebHooks+脚本实现自动更新发布代码之Shell脚本(二)

[复制链接]

尚未签到

发表于 2018-9-17 12:09:37 | 显示全部楼层 |阅读模式
#!/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 &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
  
:



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-588400-1-1.html 上篇帖子: 关于git笔记学习 下篇帖子: Linux下安装Git-ECHOHK
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表