通用部署框架universal-jk-deploy

universal-jk-deploy

項目連接
此項目的初衷是基於JenkinsAnsible提供一套能兼容大多數應用場景的部署方案,提供一個統一的“配置界面”來完成大多數項目的部署工作,而無需關注底層腳本的實現。

具體一點來講:將打包或編譯,服務的啓停,服務在反向代理的摘除和重新加入等操作在底層腳本中予以組合,但是底層腳本不涉及到具體的服務啓停命令或取值等,只提供邏輯框架。而描述項目部署的各種信息均在jenkins作業的配置界面中予以設置(這是在Jenkins中設置部署作業的最外層也是最直接看到的地方)。

依賴

當然是Jenkins和Ansible

大致可以將應用部署分爲兩類

  1. 經過反向代理的後端服務,例如:java或者python以及php等
    流程:從反向代理中踢除待更新後端 ----> 關閉後端 ----> 更新代碼 ----> 啓動後端 ----> url探活 ----> 後端重新加入反向代理
  2. 不經過反向代理,靜態文件或者通過npm打包生成靜態文件的項目
    流程:關閉後端[可選] ----> 更新代碼 ----> 啓動後端[可選]

注:本套腳本目前僅支持採用nginx作爲反向代理的場景

示例:

先來看一下部署界面
通用部署框架universal-jk-deploy

下面是一個以jar包運行並經過nginx反向代理的java應用在jenkins上通過此套腳本的配置示例
示例中將本套腳本的父目錄定爲了“/op-work/deploy/scripts”

  1. 由於腳本中包含了編譯打包等邏輯,所以這裏只需要創建“自由風格的軟件項目”即可
  2. 接下來爲構建增加參數,下圖是dest_envbranch參數部分
    通用部署框架universal-jk-deploy
  3. 接下來是actionbatch以及rollback_version參數示例
    通用部署框架universal-jk-deploy
    通用部署框架universal-jk-deploy
    通用部署框架universal-jk-deploy
  4. 接下來是主要部分,直接跳到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
  5. [可選]在Post-build Actions部分或者在第4步腳本的最後,可以增加發送更新通知的邏輯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章