1. 程式人生 > >關於自動釋出專案的經歷總結

關於自動釋出專案的經歷總結

專案釋出

見到過的打包釋出過程

  • 目前待過幾家公司主要的釋出流程是通過jenkins實現自己打包,然後自動處理。也有本地打包上傳到tomcat下的處理(見過感覺最low的方式)。還有就是上傳相應的專案(因為不能直接連線外網down程式碼打包),然後使用自動化部署指令碼執行、啟動專案。

釋出本質

  • 不管是jenkins打包釋出的方式,還是直接上傳使用shell指令碼釋出,其實本質應當是一樣的。jenkins的打包步驟只是換成了jenkins自動打包而已。
  • 之前自己也部署過jenkins做自動化部署,在打包完成後jenkins可以執行指令碼,我一般使用的是執行shell指令碼。通過指令碼去啟動相關的web服務,快取服務等。
  • 思考:其實發布的整個過程看來,都是在做一個流程。拉取程式碼->打包->將包放到指定位置->啟動web及其相關服務(在這之前可能也會清空日誌等操作)。在這整個流程中有些步驟只是通過工具做了處理而已,其實也算是在執行shell指令碼做處理服務等。

上次釋出中的指令碼

  • 以下為專案中使用到的釋出指令碼(註釋基本還是看得懂)
#!/bin/sh

export PROJECT_HOME=/home/admin/projects/zongzhi-center
#用於建立附件的軟鏈的源目錄
export LINK_SOURCE_HOME=/home/admin/share
#專案字首
export PROJECT_PRE=center
#用於mvn打包的-P引數
export PFOFILE_ID=xxxx-prod
export APP_NAME=$PROJECT_PRE-webback
export WEB_APP_NAME=web
export SH_NAME=webback-$PFOFILE_ID.sh
export TOMCAT_NAME=tomcat8_qianwei
export TOMCAT_HOME=/home/admin/server/$TOMCAT_NAME
export TOMCAT_PORT=8080
export MEMCACHED_ADDR=/usr/local/bin/memcached
export MEMCACHED_PORT=11219
export REDIS_ADDR=/usr/local/bin/redis-server
export REDIS_PORT=6379
export REDIS_CONF=/etc/redis/redis_6379.conf
export ZK_SERVER_ADDR=/opt/zookeeper-3.4.13/bin/zkServer.sh

echo "停止$TOMCAT_NAME服務..."
$TOMCAT_HOME/bin/shutdown.sh

##殺掉tomcat程序
ps -ef|grep $TOMCAT_NAME | awk -F " " '{print $2}' | while read line
do
	kill $line
	sleep 3
	kill -9 $line
done
echo "停止$TOMCAT_NAME服務成功..."

echo "停止後臺$APP_NAME服務..."
$PROJECT_HOME/$APP_NAME/$SH_NAME stop
echo "停止後臺$APP_NAME服務成功..."

echo "重啟memcached服務"
ps -ef|grep memcached | grep $MEMCACHED_PORT | awk -F " " '{print $2}'|xargs kill -9
$MEMCACHED_ADDR -d -m 256 -u admin -p $MEMCACHED_PORT -c 1024
echo "重啟memcached服務成功"

echo "重啟redis服務"
ps -ef|grep redis | grep $REDIS_PORT | awk -F " " '{print $2}'|xargs kill -9
$REDIS_ADDR $REDIS_CONF
echo "重啟redis服務成功"

echo "啟動zookeeper..."
$ZK_SERVER_ADDR restart
echo "啟動zookeeper成功..."

echo "更新程式碼..."
cd $PROJECT_HOME
svn up
echo "更新程式碼完成..."

echo "清空日誌檔案"
rm -rf $TOMCAT_HOME/logs/*
echo "清空日誌檔案完成"

echo "建立uploadFile資料夾及軟鏈..."
#mkdir $LINK_SOURCE_HOME/$PROJECT_PRE"_"uploadFile/uploadFile
ln -s $LINK_SOURCE_HOME/$PROJECT_PRE"_"uploadFile/uploadFile $PROJECT_HOME/$WEB_APP_NAME/target/$WEB_APP_NAME
#ln -s /home/admin/share/yibin_uploadFile/uploadFile /home/admin/project/zongzhi-center/center-web/target/center-web
echo "建立uploadFile資料夾及軟鏈完成..."

echo "啟動$APP_NAME服務..."
$PROJECT_HOME/$APP_NAME/$SH_NAME start
$TOMCAT_HOME/bin/startup.sh

##監聽埠
isff=1
while [ $isff != 0 ]
do
	##睡眠2秒
	sleep 2
	rs=`netstat -an | grep $TOMCAT_PORT`
	if [ -n "$rs" ];then
		echo "啟動$APP_NAME服務成功..."
		isff=0
	else
		echo "啟動$APP_NAME服務中..."
	fi
done
  • 在以上指令碼中可以看出,主要是指定個個軟體(服務)的目錄進行啟動,通過指令碼做到人為的手動處理
  • 啟動後還是注意檢視系統日誌確認,可能出現服務啟動起來了,但是系統是錯誤情況(跳過的坑),檢視日誌儘量看全看多一點,tail -2000f xxxx 多顯示幾行,只看最新的幾行可能沒打印出來,導致以為沒問題
  • 注意定義變數實現指令碼可維護,不要將可變的東西(如地址)寫到腳本里,不好修改(萬一環境變化才好處理)和維護。

總結

  • 學習掌握shell指令碼可以更好做出自動化釋出指令碼,能一次性做好的堅決不手動處理
  • 釋出後一定要看看啟動日誌