1. 程式人生 > >Jenkins與gitlib實現自動化部署2

Jenkins與gitlib實現自動化部署2

GC 項目 不能 IV ebr lse -c tor ada

新建發布項目:實現構建時觸發腳本執行分批次上線

vim /etc/sudoers    授權
    #Defaults   requiretty  不能開啟tty端
    www     ALL=(ALL)       ALL
    jenkins ALL=(ALL)       NOPASSWD: /usr/bin/ssh
su - www        切換用戶
ssh-copy-id [email protected]   設置web和jenkins的基於key的認證
ssh-copy-id [email protected]
cat .ssh/id_rsa.pub     查看www用戶的公鑰
cat /home/www/.ssh/id_rsa.pub
vim /home/www/.ssh/authorized_keys  基於key的認證,保證自己可以無密碼連接特定
機器,防止有時腳本不在本機的情況;
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCUNGt15DFFW7fqbI7vn2z6G289GQE2TJhrgrZe4qQna4VQhRKoVsdc/vdbqcmSKn41cwcGFt0w14eiALD5OBH/NvP9zOvHj1KAhJ6Z8SySWWD26WONOSWmFLpCCwZy9WeET1teNKC+N6Gf4BtKQeR543Keh4TtCJF+ThumxJpSxn3NG9mzaMS8XeJcJX5ZvKdQgPxFRpx4OcPsfRXUTY+FhfxBkvjdUBGC+BSr/WhDhCEI86CBl9Rp0vCfyup8cPNGovKklyrpPVkVW6Bh6SBCr3gp8diSd6KRyfKmMdxbYaRdUVjCkzcDMITXKWd4jlpMln9tA37klE8BAip6vXuj www@jenkins-server
exit    回到root用戶
cat /root/.ssh/id_rsa.pub       查看root公鑰
vim /home/www/.ssh/authorized_keys
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFgBrdYH5bxp+WURV/gbLRkwbIzI5a1yj1Vuss5xf5noImDQ+aOll/9PIZIZYukIBhCM4le5aZK8cXI1fImMTx8OQv3vFaDwhgRkSZe4bDzhzmpg2MfXrnR4AfXP6eQGjWumqLI8MrgI4dUdiv2KMQp2eNwq6zMaEoInCfiMXuxYwWKI7KBcEIBG2H1ZvxDJ4VotYC7ZvLMzudmI7c7EXU3d5O7fDJVGksG14b4UINUlWImHETGEs/lC1v0CaoOxwrLkBBK1X7yJlbLBni6VYVfe0QY6eceozAnXrtKvY3mAR8uMW2wzPyVLh2GviQv+eYK2pVW55CvNOY83CgwJrP root@jenkins-server

vim deploy1.sh  修改腳本
    #!/bin/bash
    #文件與目錄變量
    MOBILE_FILE=SmaMobile.war.zip
    MOBILE_NAME=SmaMobile
    PC_FILE=CustomerApp.war.zip
    PC_NAME=CustomerApp
    S_DIRETORY=/data/ftpsite/xiaoguan
    D_DIRETORY=/apps/tomcat_appdir

    #日誌日期和時間變量
    LOG_CDATE=`date "+%Y-%m-%d"` #如果執行的話後面執行的時間都一樣,因此此時間是不固定的,這是用於記錄日誌生成的>時間
    LOG_CTIME=`date  "+%H-%M-%S"`

    #代碼打包時間變量
    CDATE=$(date "+%Y-%m-%d")
    CTIME=$(date "+%H-%M-%S")
    echo ${CDATE}_${CTIME}

    #獲取Jenkins傳遞的參數
    METHOD=$1   #方法是部署還是回滾
    GROUP_LIST=$2   #後端服務器列表
    VERSION=$3  #控制版本

    #通過jenkins傳遞參數定義PC端服務器列表
    if [[ ${GROUP_LIST} == "1" ]];then
            PC_LIST="172.18.62.62"
            echo "第一次上線,上線服務器為${PC_LIST},線上HA負載在線服務器為${PC_LIST}"
            sleep 2
    elif [[ ${GROUP_LIST} == "2" ]];then
            PC_LIST="172.18.62.63"
            echo "第二次上線,上線服務器為${PC_LIST},線上HA負載在線服務器為${PC_LIST}"
    elif [[ ${GROUP_LIST} == "3" ]];then
            PC_LIST="172.18.62.63 172.18.62.62"
            echo "第二次上線,上線服務器為${PC_LIST},線上HA負載在線服務器為${PC_LIST}"
            sleep 2
    else
            echo "參數 error"
            #exit 3
    fi

    copy_file(){
            if test -f /data/ftpsite/xiaoguan/CustomerApp.war.zip;then
                    PKG_NAME="${PC_NAME}"_"${CDATE}"_"${CTIME}"
                    echo "開始復制銷管系統上線文件......"
                    mv ${S_DIRETORY}/${PC_FILE}  ${S_DIRETORY}/${PKG_NAME}.war.zip
                    for node in ${PC_LIST};do #循環服務器節點列表
                            scp ${S_DIRETORY}/${PKG_NAME}.war.zip  www@$node:/apps/tomcat_appdir  #將壓縮後的代碼包復制到web>服務器的/opt/webroot
                            ssh ${node} "cd /apps/tomcat_appdir && unzip  ${PKG_NAME}.war.zip -d /apps/tomcat_webdir/${PKG_NAME} && rm -rf  /apps/tomcat/webapps/CustomerApp && ln -sv /apps/tomcat_webdir/${PKG_NAME}  /apps/tomcat/webapps/CustomerApp"
                    if [ $? -eq 0 ];then
                            echo "銷管項目移動端端服務器${node}上線文件復制完成"
                            echo "發送郵件中。。。"
                            echo "銷管項目移動端端服務器${node}文件復制並發部署完成" |  mail -s "復制文件完成" [email protected]
                    else
                            echo "銷管項目移動端端服務器${node} 部署失敗" |  mail -s "部署失敗" [email protected]
                    fi
                    done
            else
                    echo "上線文件CustomerApp.war.zip不存在"
                    exit 3
            fi
    }

    stop_service(){
            if [ ${METHOD} == "deploy" ];then #假如是上線部署
                    if test -f /data/ftpsite/xiaoguan/CustomerApp.war.zip;then #先判斷上線文件是不是存在
                            for node in ${PC_LIST};do #循環服務器節點列表
                            ssh www@${node} "/etc/init.d/tomcat stop"
                            done
                    else
                         echo "CustomerApp.war.zip文件不存在"
                         exit 4
                    fi
            else
                    for node in ${PC_LIST};do #假如不是上線,即是回滾和任意版本的回滾,就先循環服務器節點列表停服務
                    ssh www@${node} "/etc/init.d/tomcat stop"
                    done
            fi
    }

    start_service(){
            for node in ${PC_LIST};do #循環服務器節點列表
            ssh www@${node} "/etc/init.d/tomcat start"
            done
    }

    #回滾到指定版本
    rollback_designated(){
            for node in ${PC_LIST};do
                    ssh www@${node} "rm -rf /apps/tomcat/webapps/CustomerApp  && ln -sv /apps/tomcat_webdir/${VERSION} /apps/tomcat/webapps/CustomerApp  && echo "${node} 回滾到指定版本成功!""
            done
    }

    #一鍵回滾到上一版本
    rollback_last_version(){
            for node in ${PC_LIST};do
                    NAME=`ssh www@${node}  ""/bin/ls -l  -rt /apps/tomcat_webdir | awk ‘{print $9}‘ | tail -n 2 | head -n1""`
                    ssh www@${node}  "rm -rf /apps/tomcat/webapps/CustomerApp && ln -sv /apps/tomcat_webdir/${NAME} /apps/tomcat/webapps/CustomerApp && echo "${node} 一鍵回滾到上一版本成功""
            done
    }

    main(){
            DEPLOY_METHOD=$1
            ROLLBACK_VER=$3
                    case ${DEPLOY_METHOD}  in
                    deploy)
                            stop_service;
                            copy_file;
                            start_service;
                            ;;
                    rollback_designated)
                            stop_service;
                            rollback_designated;
                            start_service;
                            ;;
                    rollback_lastversion)
                            stop_service;
                            rollback_last_version;
                            start_service;
                            ;;
                    *)
                            usage;
                    esac;
    }
    main $1 $2 $3

./deploy1.sh deploy 2   傳參測試腳本的可用性
 yum install mailx -y   腳本中用到了mail命令發郵件,故而需要安裝包,root用戶才能安裝
./deploy1.sh deploy 2   測試腳本
su  - www   切換www用戶
mkdir /data/ftpsite/xiaoguan -pv    保證屬組和屬主為www
chown www.www ftpsite/ -R       如果不是www用戶創建的此目錄,就使用此命令保證權限
vim index.html
     <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
yum install zip 
zip CustomerAp.war.zip index.html   壓縮為腳本指定格式的代碼文件
./deploy1.sh deploy 1   測試
su - www        記得切換www用戶
mkdir tomcat_webdir 在/apps下創建目錄,web1和web2上,存放解壓後的文件
mkdir tomcat_appdir 存放復制過來的壓縮文件,註意屬主和屬組
yum install unzip -y        安裝unzip包,web1和web2上,以將復制到達的壓縮包解壓
測試腳本沒問題後,進行jenkins的項目部署:

技術分享圖片

可以在main函數中找$1方法
ll   /apps/tomcat_webdir        可以看到不同的版本

技術分享圖片

進行構建,實現調用腳本的項目分批次部署:

技術分享圖片

Jenkins與gitlib實現自動化部署2