universal-jk-deploy
項目連接
此項目的初衷是基於Jenkins和Ansible提供一套能兼容大多數應用場景的部署方案,提供一個統一的“配置界面”來完成大多數項目的部署工作,而無需關注底層腳本的實現。
具體一點來講:將打包或編譯,服務的啓停,服務在反向代理的摘除和重新加入等操作在底層腳本中予以組合,但是底層腳本不涉及到具體的服務啓停命令或取值等,只提供邏輯框架。而描述項目部署的各種信息均在jenkins作業的配置界面中予以設置(這是在Jenkins中設置部署作業的最外層也是最直接看到的地方)。
依賴
當然是Jenkins和Ansible
大致可以將應用部署分爲兩類
- 經過反向代理的後端服務,例如:java或者python以及php等
流程:從反向代理中踢除待更新後端 ----> 關閉後端 ----> 更新代碼 ----> 啓動後端 ----> url探活 ----> 後端重新加入反向代理 - 不經過反向代理,靜態文件或者通過npm打包生成靜態文件的項目
流程:關閉後端[可選] ----> 更新代碼 ----> 啓動後端[可選]
注:本套腳本目前僅支持採用nginx作爲反向代理的場景
示例:
先來看一下部署界面
下面是一個以jar包運行並經過nginx反向代理的java應用在jenkins上通過此套腳本的配置示例
示例中將本套腳本的父目錄定爲了“/op-work/deploy/scripts”
- 由於腳本中包含了編譯打包等邏輯,所以這裏只需要創建“自由風格的軟件項目”即可
- 接下來爲構建增加參數,下圖是
dest_env
和branch
參數部分 - 接下來是
action
和batch
以及rollback_version
參數示例 -
接下來是主要部分,直接跳到Jenkins作業設置界面的
Build
部分,選擇執行shell
。這裏也即上文體到的“配置界面”,該項目的目標是將(描述一次項目部署)所有變的東西都定義在此處。# 遠程倉庫名 export repository="[email protected]:my_group/my_project.git" # 構建物是單個包文件的取文件名; 不是單文件的以及不需打包的[可置空] export package_name="my_project.jar" # 構建工具生成的存放構建物的目錄(相對於項目根目錄),可爲'.'; 不需要構建[可置空] export build_target="target" # 打包命令,不需要打包的置空(目錄上下文關係由下層腳本處理)[可置空] export build_cmd="mvn clean package -B -P $dest_env" # 程序或者web服務器監聽的端口 export project_port=8888 # 遠程目錄: 需要打包的爲包文件(或包目錄)的父目錄; 不需要打包的,爲項目根目錄 export dest_dir="/usr/local/my_project/" # ansible inventory文件中該服務的反向代理nginx主機(組,按ansible中提供主機的方式)[可置空] export nginx_hosts_group="nginx01,nginx02" # nginx_upstream配置文件在本地和目標nginx的位置, 沒用到upstream的(即單臺後端)的[可置空] export nginx_upstream_conf_local=/op-work/nginx_conf/upstream.conf export nginx_upstream_conf_remote=/usr/local/nginx/conf/upstream.conf # 備份的主目錄(下級目錄爲項目名, 由程序自動添加) export base_backup_dir="/op-work/deploy/package_backup" # 停止和啓動後端服務的命令及運行用戶,不需要重啓後端的(如靜態頁面等)[可置空] export stop_command="ps aux | grep "$package_name" | grep -v grep | awk '{print \$2}'|xargs kill" export start_command="nohup java -Xmx512M -Xms512M -jar $dest_dir/$package_name &> $dest_dir/stdout.log &" export run_user="work" # 探活url,確保後端能正常響應後再將其加回nginx upstream中 export check_url="/isok" export check_url_timeout=30 export check_url_interval=3 # 來自jenkins的變量 export dest_env export action export batch export workspace=$WORKSPACE export branch=$(echo $branch|sed 's/"//g') export rollback_version=$(echo $rollback_version|sed 's/"//g') # 根據構建參數靈活設定相關參數(對應的主機/組,按ansible中提供主機的方式) if [ "$dest_env" == "pro" ];then export dest_hosts="app01,app02" elif [ "$dest_env" == "pre" ];then export dest_hosts="app-pre" fi sh /op-work/deploy/scripts/main.sh
- [可選]在
Post-build Actions
部分或者在第4步腳本的最後,可以增加發送更新通知的邏輯