背景概述
理解Devops
维基百科对Devops的定义是:一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
自动化运维以及持续集成部署是Devops的核心思想,当你发现自己每天花费了大量的时间在等待程序打包/上传至服务器等过程中时,你就应该思考,是否需要将这些重复性的行为交给机器去做,来解放自己花费在这部分的时间。
我为何要引入Devops
背景简介
楼主是一个常年在二三线城市小公司漂泊的苦逼程序员,小公司的特性就是一人当三人使,一个人兼做开发测试加运维,公司采用敏捷开发模式,现有平台4套,大部分都是前后端分离的系统,由于功能调整的比较快导致部署演示的频次非常高,最多会出现一天部署10次左右,再加上ssh文件上传与webpack的打包程序的运行时间较长,最快的本地打包+ssh上传+启动远程运行脚本的流程走下来也得5min左右,所以光部署这一块花费的人力成本已经不可忽略了。
应用架构简介
楼主公司的web应用主要采用SpringBoot+Vuejs前后端分离开发模式,打包后的应用由Nginx来动静内容分发,应用架构的详情可见我的另一篇博客前后端分离开发模式的实践总结,源代码获取点击这里,本文也将围绕着这个结构的工程来做自动化部署。
冲突与问题
- 等待程序打包时间过长(特别是webpack的打包),大部分时间在等待,这件事在进行中也不好做别的事情
- 重复性劳动过多,每次打包都是运行打包脚本,上传打包后的文件夹,运行远程启动脚本
- 容易出错,假设现有的环境是两套(演示与生产),那么远端运行脚本需要根据环境的不同来传递不同的环境变量,人为错误极易发生
理想环境
- 程序员提交代码至dev分支,此时触发演示环境的打包部署程序
- 技术老大提交代码至master分支,此时触发生产环境的打包部署程序
- 打包成功/失败/中断通知到钉钉工作群
Devops实践
Windows10环境搭建
- java:JDK开发环境搭建及环境变量配置
- tomcat:Windows安装和配置Tomcat
- git:Git安装教程
- jenkins
- 点此下载jenkins的war包
- 将jenkins.war复制到tomcat服务器的webapps目录下
- 配置jenkins的工作目录,在我的电脑-属性-高级系统设置-环境变量-添加系统变量JENKINS_HOME,内容是一个空的文件夹,作为jenkins的工作目录。如果不想设置系统环境变量也可以修改加载有jenkins.war的tomcat目录下的conf\context.xm文件,如下设置JENKINS_HOME
- 访问jenkins的主页http://localhost:8080/jenkins
<!-- tomcat context.xml 环境变量设置 --> |
CentOS7.3环境搭建
在CentOS7下搭建jenkins和Windows环境差不多,jenkins是一个依赖于web容易的war包,所以只要有java与tomcat环境即可
git环境
# 判断git是否已存在 打印内容则代表存在 |
jdk环境
- jdk1.8下载:点此下载
- 解压配置
mkdir /usr/java |
tomcat环境
- tomcat8下载:点此下载
- 解压配置
# 使用Xftp将下载的tomcat放到此目录 |
jenkins环境
jenkins下载:点此下载
配置
mkdir /usr/jenkins |
配置Jenkins
Jenkins的初始化
第一次进入jenkins时会要求使用初始密码解锁,按照提示操作就行了
之后会提示你安装插件,在这里我们采用默认安装必要的插件即可,其他的插件我们可以在系统内部再去安装
耐心等待插件安装完毕
初始化完成,配置管理员用户
配置jenkins实例地址,举个例子解释实例配置的地址用处
假设你做了项目打包成功或者失败的通知,jenkins构建的默认通知信息里会带有一个进入系统的链接地址,方便用户直接从邮件/钉钉等地方进入系统查看构建详情,这个地址即是此处配置的实例地址
所有配置完成后,成功进入系统
Jenkins的环境配置
环境需求分析
- 拉取远端master分支代码:Git插件
- 运行前端打包脚本:Nodejs环境
- 运行后端打包脚本:Java环境+Maven插件
- 推送装有构建代码的文件夹:SSH文件传输插件
- 运行远程启动脚本:SSH脚本运行插件
配置插件
对应jenkins/系统管理/插件管理目录,根据上述的打包流程得出插件需求,在baidu/google搜索得到jenkins上对应的插件名称,选择并安装它们。
- 插件的选择
- Publish Over SSH:基于SSH协议的文件上传插件
- Nodejs:nodejs运行环境
- Dingding:钉钉推送通知
- Maven Integration:Maven插件
- 插件的安装
- 进入jenkins-系统管理-插件管理
- 选择available(可选插件)标签
- 搜索出以上选择的插件,勾选之后点击直接安装
配置全局工具
对应jenkins/系统管理/全局工具配置目录,主要是配置打包所需的环境,如Java/Git/Maven等等,如果系统自带环境可以填写系统环境,如果没有可以采用jenkins自动安装的方式。
- JDK配置
tips:如果找不到java的安装目录可以使用 which java 查看
- Git配置
tips:如果找不到git的安装目录可以使用 which git 查看
- Maven配置
- NodeJS配置
配置文件管理
对应jenkins/系统管理/Managed files目录,主要是管理自定义的配置文件,如Maven的settings.xml,Npm的npmrc.config文件等等,我们在这主要配置一下Maven和Npm的仓库镜像,使其切换到国内的阿里云的Maven镜像和淘宝的Npm镜像。
- Maven settings.xml
新增Maven settings.xml配置文件,在mirrors标签下添加以下配置<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
- Npm config file
新增Npm config file配置文件,修改registry的配置registry=https://registry.npm.taobao.org
配置全局凭据
对应jenkins/凭据/系统/全局凭据目录,主要是用于添加如gitlab/ssh等受限访问应用的信任凭据。
其他配置
- Publish over SSH插件
该插件的配置在jenkins/系统管理/系统设置目录,主要的配置如下:
高级配置下还可以配置SSH端口,重置默认设置等等,这里不做过多讲解
- Dingding通知使用
钉钉通知的配置在任务的配置项中,配置起来较为简单(比微信通知简单太多)只需要两步操作。
(1)获取钉钉通知自定义机器人webhook的access_token,点此进入钉钉开放平台获取配置帮助
(2)在任务中配置通知
通知效果如图,点击即可进入jenkins管理平台查看详情
Jenkins的任务配置
至此基于一个前后端分离项目的自动打包配置已经基本完成,现在我们使用jenkins构建一个任务来测试配置是否成功,本次构建任务是基于我的一个开源模板项目server-front-separate来进行。
新建任务
进入jenkins根目录点击新建任务
任务新建成功
任务基础配置
本次的基础配置我们需要达到任务能够自动化打包的效果,为达到此效果我们至少需要配置以下几项内容:
- 源码管理
- 构建环境
- 后端构建步骤
- 前端构建步骤
- 源码管理
- 构建环境
- 后端构建步骤
- 前端构建步骤
linux环境下采用Shell脚本构建,换行分割指令
cd front/ |
Windows环境下采用批处理脚本构建,使用&与&&来连接指令,&代表下一条指令必定执行,&&代表当上一条指令出现错误下一条指令不执行
cd front/ & node -v & npm -v & npm i && npm run build |
构建运行
基础配置完成后,我们进入项目主页进行一次构建测试
构建成功后进入任务的工作空间,可以查看到项目已经打包成功,项目的目录结构描述详见我的另一篇博客前后端分离开发模式的实践总结
Jenkins任务自动化
至此项目已经能够通过jenkins平台来进行打包操作了,但是这还远远没达到自动化的概念,我们的目标是通过git代码提交操作来触发构建并且自动部署到生产/演示服务器上,所以接下来进行自动化的配置工作
自动构建
自动构建是指通过Git服务器的Webhooks来触发Jenkins的打包构建流程,在这里我们将实现以下流程:
- 更新代码至github项目的master分支
- jenkins开始构建代码
jenkins默认对github的webhook有支持使得这个流程的配置非常简单,jenkins的webhook触发地址为${JENKINS_URL}/github-webhook/,其中JENKINS_URL为jenkins服务在公网的根目录地址,可以在jenkins/系统管理/系统设置处修改此默认地址
得到Webhook地址后我们只需要在github的项目Settings选项卡上添加此地址即可,github默认触发Webhook的逻辑是push代码时即触发
当然,别忘记了在jenkins的任务中勾选Github hook触发构建
自动部署
自动部署是指在代码构建完成后将生成的发布代码推送到远程服务器中并启动它们,流程如下:
- 代码构建成功后上传打包目录
- 运行远程脚本重启服务
上文我们讲到Publish Over SSH这个插件能够远程推送代码并运行脚本,自动部署的功能即依赖此插件,配置如下:
# 定义脚本执行地址 |
构建通知
在这里我们使用钉钉来做通知功能,钉钉通知的配置在上文已经介绍过了,通知的的类型有四种,我们需要哪种类型的通知直接勾选即可,四种通知类型正好对应jenkins任务构建的三种状态:
- 成功:构建步骤与构建后的操作全部成功,对应构建成功时通知
- 失败:构建步骤失败,对应构建失败时通知
- 不稳定:构建步骤成功但构建后的操作存在失败的情况,对应构建中断时通知
常见问题
中文乱码
在jenkins/系统管理/系统设置中添加全局属性:
参考资料
Jenkins——应用篇——插件使用——Publish over SSH
jenkins 集成钉钉机器人
Jenkins之解决乱码问题
Jenkins与Github集成 webhook配置