Jenkins與gitlib實現自動化部署2
阿新 • • 發佈:2018-06-22
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