项目链接
此项目的初衷是基于Jenkins和Ansible提供一套能兼容大多数应用场景的部署方案,提供一个统一的“配置界面”来完成大多数项目的部署工做,而无需关注底层脚本的实现。php
具体一点来说:将打包或编译,服务的启停,服务在反向代理的摘除和从新加入等操做在底层脚本中予以组合,可是底层脚本不涉及到具体的服务启停命令或取值等,只提供逻辑框架。而描述项目部署的各类信息均在jenkins做业的配置界面中予以设置(这是在Jenkins中设置部署做业的最外层也是最直接看到的地方)。java
固然是Jenkins和Ansiblepython
注:本套脚本目前仅支持采用nginx做为反向代理的场景nginx
先来看一下部署界面 git
下面是一个以jar包运行并通过nginx反向代理的java应用在jenkins上经过此套脚本的配置示例
示例中将本套脚本的父目录定为了“/op-work/deploy/scripts”github
dest_env
和branch
参数部分action
和batch
以及rollback_version
参数示例接下来是主要部分,直接跳到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
Post-build Actions
部分或者在第4步脚本的最后,能够增长发送更新通知的逻辑