众所周知,我们在敏捷开发模式里一项很重要的工作就是搭建持续集成(CI)环境,将项目源码工程的编译,打包,测试,部署像流水线一样自动化地进行,整个操作过程无须人工介入,从而提高版本部署的质量,提高版本发布的效率,这是因为简单重复的工作人工操作非常容易出错,而机器通常不会
如果你负责测试的项目中这一块还是空白,那么这篇文章通过一次实践正好带你入门,让你了解 CI 的基础
我们采用业界最流行的框架 Jenkins 来实现 CI,它可以在 Windows,Mac,多种 Linux 系统上安装,本文是在 Windows 侧进行安装的
它的安装方式非常简单,可以到官网下载安装包,也可以使用 Docker,这里提供一个官网 Windows 的下载路径
https://www.jenkins.io/download/thank-you-downloading-windows-installer-stable/
安装过程不是本文重点,网上的安装帖子非常多,大家可自行搜索
安装完毕通过浏览器就可以启动 Jenkins 的页面了
没错,装完就可以实践了。Jenkins 很多工作依赖其插件,所以先配置好插件这一块的参数
假设我们配置的访问端口号是 8080,进入插件管理页,url 的相对路径是 pluginManager/advanced
我们把升级站点
的 URL 修改为
http://mirror.esuni.jp/jenkins/updates/update-center.json
这里使用的是国内镜像的路径,下载插件速度和成功率就更高
通常我们遇到的项目是 Maven 编译和 Gradle 编译,在插件管理页中下载插件
Maven Integration
Gradle Plugin
由于本次实践通过 FTP 将构建文件发布到服务器,所以把 FTP 插件也下载
Publish Over FTP
Jenkins 任务的流程基本上是以下几个步骤构成:
1)源码管理,2)构建触发器,3)构建环境,4)Build 前置操作,5)Build,6)Build 后置操作,7)构建后操作
总结起来思路是,下载源码,执行构建,发布构建文件
按这个思路,我们在首页点击 新建Item
,开始任务的创建。第一个实践任务是构建一个maven项目
这里我使用 Git 来下载源码,点击添加按钮将你的 Git 账号密码写进去,这样 Jenkins 才有权限访问到仓库
一般我们用 ssh 方式登录到 git 服务器,所以添加的凭据类型是 SSH Username with private key
留意描述和 Username 在图中的填写说明
private key 这里将计算机上 ssh 的私钥文件里全部内容复制贴进来
回到创建任务的界面,凭证选择刚刚添加的即可
接下来在 Build
部分,执行 clean package 命令去构建
保存设置以后,回到上一页
访问全局配置页面,url 相对路径是 configure
将 Maven 项目配置中全局 MAVEN_OPTS
配置为,等号右边是你本地仓库的路径
-Dmaven.repo.local=C:\Users\xxx\.m2\repository
这个配置是指定 Maven 编译时的本地仓库路径,如果不指定,Jenkins 会重新下载 pom 文件中的依赖到某个路径下,适用于本地已经有依赖仓库的情况
将全局属性
的 Environment variables
打开,设置几个环境变量,这在编译时会被使用到
JAVA_HOME,M2_HOME,PATH+EXTRA
进入全局工具配置页面,url 相对路径是 configureTools
配置 JDK,Git,Maven 的安装路径
一般建议自己在本地安装好上述工具以后,在这里指定路径,而不使用自动下载的方式
回到刚刚的 Item 页,左侧列表点击 Build Now 即开始任务执行
下方的构建历史会增加一行,查看控制台输出,可以浏览任务执行过程的日志信息
到这里,有的人可能会构建失败或者出现其他问题,就会产生疑问,我写一个批处理或者 shell 脚本不也可以达到这个目的吗,而且更简单
其实不然,眼光需放长远一点,Jenkins 会将每次构建进行记录,保存构建历史,便于回溯检查。而脚本执行完就结束了,后续回头查问题就别想了
现在我们将构建文件发布到 FTP 上,当然,也可以发布到其他类型服务器,利用 Jenkins 的插件就可以实现
进入全局配置页面,找到 Publish over FTP,添加一个 FTP 服务器地址
回到刚刚的任务页面,点击任务的配置
按钮进行修改,在Post Steps
添加 Send Files over FTP
名词解释:
Source files:需要发送到 FTP 的文件或者目录,可以填相对路径,会基于当前任务在本地创建的目录为根目录。可以用通配符指定。比如:target\* 表示将 target 目录下所有文件及子目录发送;target\build.jar 表示发送 build.jar
Remove prefix:如果不指定这个参数,那么会将 target 目录在 FTP 上也创建出来,于是这里指定为 target\ ,就只会将 build.jar 发布到 FTP,而不会创建 target 目录
Remote directory:要发送到 FTP 上相对根目录的路径
配置好以后,重新 Build 一次,如果构建成功,在 FTP 上相应目录就可以看到构建文件被发布上来了
这一次的实践,让我们了解 Jenkins 是什么,以及它的基本操作流程。实际上它的强大远不止这些,各位看官可以自行研究其玩法,后续我也会再根据实践分享它的其他构建方式