自动化部署主要是为了解决项目多、环境多、持续集成慢、部署操作麻烦、手动操作易出错、自动化运维等问题。Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
目标
l支持多分支、多环境、多项目、多套配置文件、多编程语言
l支持一键构建、集群发布
l支持一键回滚历史版本
l快捷配置添加新的部署项目
l支持多个项目使用同一个job发布或回滚
另外:也可以根据需要加入gitlab自动触发构建、自动化测试、钉钉通知、邮箱通知等需求
技术关键词:jenkins master-slave,jenkins插件(multijob、EnvInject),rsync工具,powershell,dotnet core cli,icacls工具等等
目录
最终效果图
一键发布
一键回滚
目录设计
Jenkins相关目录设计
约定及规范
jenkins job命名
#、job名全小写,多单词用”-”分割。(eg:publish-template-onekey-deploy)
#、job命名约定:模块名-环境-功能名。(eg:publish模块,publish-test-onekey-deploy)
#、模块中组件job命名约定:模块-c-组件名。(eg:publish-c-pull-code)
#、job输入参数以”p_”为前缀
Jenkins job中的脚本命名(eg:powershell)
#、变量全小写,多单词用”_”分割
规范约定
#、代表路径的变量值,以””结尾
#、备份名字中用“#”做分隔符,还原时好取参数(eg:p_app_key#2019-1219-1503)
架构设计
#、CICD架构图
CICD过程主要在两个局域网中执行:构建服务器(开发内网)和部署服务器(生产内网)
#、项目映射配置文件设计
想要实现使用一个job,通过下拉来”发布|回滚”不同的项目,我们需要一个灵活的项目配置映射文件,类似如下:
配置文件选项含义从命名上可以识别,主要包括:环境、代码分支、部署路径、拷贝排除文件列表、项目信息(项目唯一标识、目录文件夹名、源代码路径、开发语言、集群节点信息…)等等
app_config节点下的配置,可以覆盖父节点配置,适配项目特定的部署要求。
app_config是数组节点,可以轻松添加新的部署项目,实现新项目的快速CICD。
#、一键发布job设计
“一键发布”主要经历的阶段有:组合项目相关参数>>获取最新代码>>编译打包>>推送应用文件到服务器>>应用备份>>拷贝到Temp文件夹>>发布到部署目录
为了更好的实现和控制”一键发布”这些阶段,设计了如下输入参数:
参数名
类型
默认值
说明
p_publish_model
下拉单选
reality
取值:reality、drill
发布模式reality:正常发布,发布到应用服务器应用文件夹,做真实应用发布部署
drill:演练。发布到应用服务器temp文件夹后结束
p_app_key
下拉单选
通过这个key到配置文件里面找站点的具体配置信息
p_do_code_pull
Bool
True
拉取最新代码
p_do_build_package
Bool
True
是否重新编译打包
p_do_backup
Bool
True
是否执行备份
p_publish_content
多选
取值:app-file、config
发布文件列表(多选)
app-file:应用文件(不包含config文件)
config:配置文件
p_restart_daemon_process
Bool
True
是否重启守护进程(如果是IIS,勾选则重启应用程序池,不勾选则回收应用程序池)
为避免文件被占用,发布失败,所以这里默认勾选。如果只是新增页面文件,可以不勾选
p_remark
String
备注信息
#、一键回滚job设计
实现思路:在”一键发布”时,将发布记录存到文件中,存储key为:p_app_key#2019-1219-1503。执行回滚时,选择要回滚的历史项目,先解析出p_app_key再获取项目配置信息,再回滚此项目的特定历史版本。
设计的输入参数如图:
参数名
类型
默认值
说明
p_history_item
下拉单选
每一次”一键发布”成功,都会生成一个对应的历史记录
p_restart_daemon_process
Bool
True
是否重启守护进程(如果是IIS,勾选则重启应用程序池,不勾选则回收应用程序池)
为避免文件被占用,回滚失败,所以这里默认勾选。
p_remark
String
备注信息
#、简易多环境CICD流程
一般软件公司对于软件的开发、测试、发布都有好几个环境,所以针对各个环境都会有对应的CICD流程,这边设计了一个简易的多环境CICD流程图,如下:
自动触发CICD还是手动触发CICD???我认为:
开发环境采用手动触发:因为对于开发环境,提交代码比较频繁,而且有时候提交到git也并不想触发CICD。可以采取每晚定时自动触发CICD,便于异