前言
在没有CI&CD相关的软件出现之前,我们是如何完成代码部署的呢?手动去服务器创建目录,本地打包压缩、scp上传到指定服务器目录、手动解压缩包这样一些列一顿操作猛如虎的繁琐步骤。修改一个标点符号还要再来一遍这样的繁琐的操作,而且一旦某个环节出现错误,半天都定位不到问题,测试环境还好,如果是线上部署,可想而知会带来多大的麻烦跟后果。时代在变,我们也一直在进步着,人类一直在努力让我们的代码构建流程变得简单且高效可靠起来,jenkins就是一个不错的发明。
Jenkins是什么?
- Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
- Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
流程图:
接下来要实现的功能
- git钩子功能
- webhook自动化部署
- 部署邮件发送
- 通过钉钉机器人将部署信息发送到钉钉群里,并通知相关人员
前期准备
- 一台云服务器(自己电脑也可以,能访问外网就行)
- Linux基础命令
- git基本命令
- nginx
- jenkins
- github项目
Jenkins安装与启动
安装java
Jenkins依赖Java,如果你的系统没有安装的话,需要先安装Java。
yum install java
查看java版本
java -version
如果显示如下信息,表明安装成功。
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
安装Jenkins
获取jenkins依赖库
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
查看Jenkins安装目录
rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
查看Jenkins端口
cat /etc/sysconfig/jenkins | more
Jenkins默认端口为8080,如果是使用云主机来安装jenkins的话需要到控制台安全组里添加8080访问端口,我这边使用默认端口来访问。
启动Jenkins
sysctemctl start jenkins
访问Jenkins
打开浏览器输入ip:8080,出现如下界面:
查看密码
cat /var/lib/jenkins/secrets/initialAdminPassword
选择安装自定义插件即可
插件安装(初始化插件安装有点慢,需要二十分钟左右)
创建账号
保存完成之后进入下个页面,点击准备就绪即可
创建任务
- 点击新建任务
- 给任务取一个名称
git钩子功能
想要的结果:本地push代码到github成功之后,jenkins就自动开始构建部署。
思考:jenkins怎么知道我们向github仓库提交了代码?
- 打开刚才创建的任务,添加github远程仓库地址,配置登录名跟密码。
2.安装Generic Webhook Trigger Plugin插件
系统管理 -> 插件管理 -> filter(可选插件)
3.添加触发器
这个插件的可以根据自己的需求来个性化配置,比如我提交某个test1分支的代码,需要执行单元测试,然后构建合并到另外一个test2分支上。当我提交master分支的代码时候,只进行部署构建工作,其他都不做。我这边默认选择的时候提交master分支代码,自动部署。
4.github仓库配置webhook
流程
- GitHub上配置Jenkins的webhook地址
- 在GitHub上创建一个access token,Jenkins做一些需要权限的操作的时候就用这个access token去鉴权;
- Jenkins安装GitHub Plugin插件;
- Jenkins配置GitHub访问权限;
- url为jenkins启动的ip地址
- Content type选择application/json
- Secret为jenkins添加hook的密码
5.测试钩子
本地push测试代码
jenkins自动触发构建
构建成功,查看工作空间,代码部署更新成功。
Jenkins完成静态打包
通常我们本地打包静态是通过npm script再借助webpack插件来完成打包。那么我们通过本地git push钩子一旦触发之后,jenkins又是如何实现我们本地打包的一系列流程呢?
一般有三个步骤:
- npm install
- npm run test
- npm run build
- 首先,和本地运行npm script一样,我们要想在jenkins里面执行npm命令,先要在jenkins里面配置node的环境,可以通过配置环境变量的方式引入node,也可以通过安装插件的方式,这里使用了插件的方式,安装一下nvm wrapper这个插件。
2.配置里构建环境,勾选如下Run the build in an NVM managed environment,通过nvm来管理我们的node版本,这里我选择的是v10.16.0版本
3.添加构建shell
shell执行顺序
- set npm镜像,我这里选择taobao的镜像,你也可以选择npm官方镜像
- npm install安装依赖
- 执行npm run build打包
4.执行本地push,jenkins自动执行脚本构建静态。
通过SSH实现服务器远程自动化部署
- 先在Jenkins上装一个插件Publish Over SSH,我们将通过这个工具实现服务器部署功能。
- 在要部署代码的服务器上创建一个文件夹用于接收Jenkins传过来的代码,我在服务器上建了一个Jenkins的文件夹。
- Jenkins想要往服务器上部署代码必须登录服务器才可以,这里有两种登录验证方式,一种是ssh验证,一种是密码验证,就像你自己登录你的服务器,你可以使用ssh免密登录,也可以每次输密码登录,系统管理-系统设置里找到Publish over SSH这一项。 重点参数说明:
Passphrase:密码(key的密码,没设置就是空)
Path to key:key文件(私钥)的路径
Key:将私钥复制到这个框中(path to key和key写一个即可)
SSH Servers的配置:
SSH Server Name:标识的名字(随便你取什么)
Hostname:需要连接ssh的主机名或ip地址(建议ip)
Username:用户名
Remote Directory:远程目录(上面第二步建的testjenkins文件夹的路径)
4.针对上述步骤添加两条打包命令,将jenkins服务器上打包生成的dist目录打成压缩包,目的是上传到我们在服务器上新建的Jenkins目录里。
cd dist
tar -zcvf dist.tar.gz *
5.点击构建后操作,增加构建后操作步骤,选择send build artificial over SSH
Name:选择一个你配好的ssh服务器
Source files :写你要传输的文件路径
Remove prefix :要去掉的前缀,不写远程服务器的目录结构将和Source files写的一致
Remote directory :写你要部署在远程服务器的那个目录地址下,不写就是SSH Servers配置里默认远程目录
Exec command :传输完了要执行的命令,我这里执行了解压缩和解压缩完成后删除压缩包2个命令
6.我们本地做测试代码的修改,然后push,此时等jenkins完成自动打包以后,再去服务器上我们新建的Jenkins目录查看一下,发现服务器的目录已经更新成最新的了,然后通过域名访问发现刚才本地修改的代码已经生效了。
到这里,我们通过webhook、github、SSh配合jenkins完成了整个自动化构建部署的流程。
构建后邮件发送
当我们在上述的构建过程中出现构建失败,或者构建异常终止的情况,作为开发或者测试同学我们想及时知道我们每一次的构建结果怎么办呢?
这里我使用了定制化更强的Extended E-mail Notification插件,使用之前我一样先需要安装这个插件,完成后重启jenkins即可。
1.系统管理->系统配置->Extended E-mail Notification,在配置这里之前一定要先配置Jenkins Location系统管理员邮件地址,否则发送邮箱不会起作用。另外这里有个小坑,填写的邮箱必须要先确认是否开通过smtp服务,如果没有开通也是无法发送邮件的!!!
2.打开创建的webapck4-construct任务,配置里添加构建后的操作
3.我们本地再次发起一个git push,jenkins自动完成构建部署以后,会自动发送一封邮件到我们的邮箱里。
这里我使用的是自定义的邮件格式,官方的邮件格式过于简单,不便于定位构建问题。
通过钉钉机器人像群组发送构建消息
1.钉钉内创建群组,添加机器人
2.获取自定义机器人webhook
3.安装dingTalk插件
4.打开构建任务,genral配置中
输入通知人,通知内容也可以自定义。
5.构建成功测试
结束
1.通过上述的小案例,我们简单的实现了一套自动化构建的工作流,只要本地发起git push,云服务端就可以实现自动构建部署,部署结果还可以通过邮件发送、钉钉机器人推送等工具来让我们的部署操作变得更加简便。
2.我们实际的工作场景要远远比上述的案例的CL复杂的多,当然再复杂的CL流程,只要我们掌握并理解jenkins的基础理念,相信只要多折腾,多思考,Everything will become simple。
3.jenkins还有很多强大的特性,像Pipeline、slave以及一些你意想不到的插件。之后会尝试通过编写Pipeline脚本的方式来完成更加复杂的Cl场景。