通用部署框架universal-jk-deploy

universal-jk-deploy

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

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

依賴

固然是Jenkins和Ansiblepython

大體能夠將應用部署分爲兩類

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

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

示例:

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

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

  1. 因爲腳本中包含了編譯打包等邏輯,因此這裏只須要建立「自由風格的軟件項目」便可
  2. 接下來爲構建增長參數,下圖是dest_envbranch參數部分
    通用部署框架universal-jk-deploy
  3. 接下來是actionbatch以及rollback_version參數示例
    通用部署框架universal-jk-deploy
    通用部署框架universal-jk-deploy
    通用部署框架universal-jk-deploy
  4. 接下來是主要部分,直接跳到Jenkins做業設置界面的Build部分,選擇執行shell。這裏也即上文體到的「配置界面」,該項目的目標是將(描述一次項目部署)全部變的東西都定義在此處。web

    # 遠程倉庫名
    export repository="git@gitlab.xxxxx.com: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步腳本的最後,能夠增長髮送更新通知的邏輯
相關文章
相關標籤/搜索