自動化部署腳本

使用shell腳本實現java灰度發佈

腳本使用環境:php

一、操做系統:centos 6.5 64位前端

二、代碼使用gitlab進行管理java

三、代碼每次上線經過tag控制linux

四、前端使用haproxy實現負載均衡,使用haproxy socat實現RS的平滑上下線git

五、WEB container使用tomcat實現web

六、項目構建使用mavenshell

使用腳本注意事項:
一、 發佈機器須要可以解析web服務器主機名,而且配置ssh通訊
二、 變量中的目錄以及用戶等信息須要本身建立,腳本沒有作判斷本身建立。我這裏web服務器是使用ansible進行部署的,相關目錄和用戶都會自動建立。
三、代碼的部署使用tag,可是代碼的更新使用軟鏈接來控制,回滾則切換到上一個軟鏈接
四、因爲java是編譯型語言,咱們使用maven來進行編譯,因此須要安裝maven環境。
五、關於環境配置文件:配置文件爲本身手動維護,每次都是刪除git倉庫拉取下來的配置文件,把對應環境的代碼文件複製進編譯目錄進行編譯。centos

腳本代碼大概的步驟以下:api

#!/bin/bash

# 設置時間變量
CTIME=$(date "+%Y-%m-%d-%H-%M")
# 項目名稱,建議和gitlab倉庫名稱一致
project=
# 本地代碼目錄(gitlab拉取代碼後存放目錄)
CODE_DIR=/data/gitlab/"$project"
# 臨時代碼目錄,用來修改配置文件和編譯打包代碼
TMP_DIR=/data/tmp/"$project"
# 用來存放war包
WAR_DIR=/data/war/"$project"
# 對應環境配置文件
deploy_conf=/data/conf/pro/"$project"/*
# 代碼中的配置文件路徑
local_conf=$TMP_DIR/src/main/resources/config
# 遠程主機名稱
REMOTE_HOST="tomcat-01 tomcat-02"
# 遠程主機代碼目錄
REMOTE_CODE_DIR=/data/webapps/"$project"
# 遠程主機用戶
REMOTE_USER=root
# 遠程主機war包存放目錄
REMOTE_WAR_DIR=/data/war/
# 代碼臨時目錄
CODE_TMP=/data/code_tmp/
# 上線日誌
DEPKOY_LOG=/data/log/pro_log.log

# 腳本使用幫助
usage(){
echo $"Usage: $0 [deploy tag | rollback_list | rollback_pro ver]"
}

# 拉取代碼
git_pro(){
if [ $# -lt 1 ];then
echo "請傳入tag"
exit 1
fi
tag=$1
cd $CODE_DIR && git checkout master && git pull && git checkout $1
if [ $? != 0 ];then
echo "拉取代碼失敗"
exit 10
fi
cd $CODE_DIR && git pull 2>/dev/null >/dev/null
# 推送代碼到臨時目錄
rsync -avz --delete $CODE_DIR/ $TMP_DIR/ 2>/dev/null >/dev/null
}

# 設置代碼的配置文件
config_pro(){
echo "設置代碼配置文件"
rm -f $local_conf/config.properties
.........
}

# 打包代碼
tar_pro(){
echo "本地打包代碼"
cd $TMP_DIR && /usr/local/maven/bin/mvn clean compile war:war && cp target/"$project".war "$WAR_DIR"/"$project"_"$tag"_"$CTIME".war
}

# 推送war包到遠端服務器
rsync_pro(){
echo "推送war包到遠端服務器"
for host in $REMOTE_HOST;do
scp "$WAR_DIR"/"$project"_"$tag"_"$CTIME".war $REMOTE_USER@$host:$REMOTE_WAR_DIR
done
}

# 解壓代碼包
solution_pro(){
echo "解壓代碼包"
for host in $REMOTE_HOST;do
ssh $REMOTE_USER@$host "unzip "$REMOTE_WAR_DIR""$project"_"$tag"_"$CTIME".war -d "$CODE_TMP""$project"_"$tag"_"$CTIME"" 2>/dev/null >/dev/null
done
}

# api測試
test_pro(){
# 運行api測試腳本,若是api測試有問題,則退出部署
if [ $? != 0 ];then
echo "API測試存在問題,退出部署"
exit 10
fi
}


# 部署代碼
deploy_pro(){
echo "部署代碼"
...................
sleep 3
# 執行api測試
test_pro
ssh haproxy "echo "enable server $project/$host" | /usr/bin/socat /var/lib/haproxy/stats stdio"
done
}
# 列出能夠回滾的版本
rollback_list(){
echo "------------可回滾版本-------------"
ssh $REMOTE_USER@$REMOTE_HOST "ls -r "$CODE_TMP" | grep -o $project.*"
}

# 回滾代碼
rollback_pro(){
   echo "回滾中"
   for host in $REMOTE_HOST;do
   .............................
   sleep 3
   ssh haproxy "echo "enable server $project/$host" | /usr/bin/socat /var/lib/haproxy/stats stdio"
   done
}

# 記錄日誌
record_log(){
   echo "$CTIME 主機:$REMOTE_HOST 項目:$project tag:$1" >> $DEPKOY_LOG
}

# 代碼執行選項設置
main(){
   case $1 in
    deploy)
    git_pro $2;
    config_pro;
    tar_pro;
    rsync_pro;
    solution_pro;
    deploy_pro;
    record_log $2;
    ;;
    rollback_list)
    rollback_list;
    ;;
    rollback_pro)
    rollback_pro $2;
    record_log;
    ;;
    *)
    usage;
    esac
}
main $1 $2

使用shell實現php代碼自動發佈tomcat

腳本適應環境:

一、操做系統:centos 6.5 64位

二、代碼使用gitlab進行管理

三、代碼每次上線和回滾經過tag控制

補充:若是須要在你的企業使用個人這種部署方式,還須要有相應環境規範以及git分支管理規範。

使用腳本注意事項:
一、 發佈機器須要可以解析web服務器主機名,而且配置ssh通訊
二、 變量中的目錄以及用戶等信息須要本身建立,腳本沒有作判斷本身建立。我這裏web服務器是使用ansible進行部署的,相關目錄和用戶都會自動建立。
三、代碼的部署使用tag,回滾原則爲回滾到上個tag版本,因此部署腳本自己沒有備份代碼。
四、若是須要過濾一些臨時目錄或者日誌目錄,能夠在rsync推送代碼的時候使用–exclude選項進行過濾,示例腳本中過濾了.git目錄和config.php文件是不會部署的。

#!/bin/bash

# 設置時間相關變量
CTIME=$(date "+%Y-%m-%d-%H-%M")
# 項目名稱,建議和gitlab倉庫名稱一致
project=test
# 本地代碼目錄(gitlab拉取代碼後存放目錄)
CODE_DIR=/data/gitlab/pro/$project/
# 遠程主機
REMOTE_HOST="LNMP-01.fblinux.com LNMP-02.fblinux.com"
# 遠程主機代碼目錄
REMOTE_DIR=/data/www/fblinux/
# 遠程主機用戶
REMOTE_USER=root
# 遠程主機代碼執行用戶
CODE_USER=php
# 上線日誌
DEPKOY_LOG=/data/log/pro_log.log

#腳本使用幫助
usage(){
echo $"Usage: $0 [deploy tag]"
}

#拉取代碼
git_pro(){
if [ $# -lt 1 ];then
echo "請傳入tag"
exit 1
fi
echo "拉取代碼"
cd $CODE_DIR && git checkout master && git pull && git checkout $1
if [ $? != 0 ];then
echo "拉取代碼失敗"
exit 10
fi
cd $CODE_DIR && git pull
}

#推送代碼服務器
rsync_pro(){
for host in $REMOTE_HOST;do
echo "推送代碼到服務器$host"
rsync -rPv -P --delete --exclude="config.php" --exclude=".git" $CODE_DIR -e 'ssh -p 22' $REMOTE_USER@$host:$REMOTE_DIR
if [ $? != 0 ];then
echo "推送代碼失敗"
exit 10
fi
echo "代碼受權"
ssh $REMOTE_USER@$host "chown -R $CODE_USER $REMOTE_DIR"
if [ $? != 0 ];then
echo "代碼受權失敗"
exit 10
fi
done
}

#記錄日誌
record_log(){
echo "$CTIME 主機:$REMOTE_HOST 項目:$project tag:$1" >> $DEPKOY_LOG
}

main(){
case $1 in
deploy)
git_pro $2;
rsync_pro;
record_log $2;
;;
*)
usage;
esac
}
main $1 $2
相關文章
相關標籤/搜索