Jenkins 2.x实践指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.2 构建工具

构建是指将源码转换成一个可使用的二进制程序的过程。这个过程可以包括但不限于这几个环节:下载依赖、编译、打包。构建过程的输出——比如一个zip包,我们称之为制品(有些书籍也称之为产出物)。而管理制品的仓库,称为制品库。关于制品的管理,我们在第10章中进行详细介绍。

在没有Jenkins的情况下,构建过程通常发生在某个程序员的电脑上,甚至只能发生在某台特定的电脑上。这会给软件的质量带来很大的不确定性。想想软件的可靠性(最终是老板的生意)依赖于能进行构建的这台电脑的好坏,就觉得很可怕。

解决这一问题的办法就是让构建每一步都是可重复的,尽量与机器无关。所以,构建工具的安装、设置也应该是自动化的、可重复的。

虽然Jenkins只负责执行构建工具提供的命令,本身没有实现任何构建功能,但是它提供了构建工具的自动安装功能。

4.2.1 构建工具的选择

对构建工具的选择,很大一部分因素取决于你所使用的语言。比如构建 Scala 使用 SBT,JavaScript的Babel、Browserify、Webpack、Grunt以及Gulp等。当然,也有通用的构建工具,比如Gradle,它不仅支持Java、Groovy、Kotlin等语言,通过插件的方式还可以实现对更多语言的支持。

对构建工具的选择,还取决于团队对工具本身的接受程度。笔者的建议是,团队中同一技术栈的所有项目都使用同一个构建工具。

4.2.2 tools指令介绍

tools指令能帮助我们自动下载并安装所指定的构建工具,并将其加入PATH变量中。这样,我们就可以在sh步骤里直接使用了。但在agent none的情况下不会生效。

tools指令默认支持3种工具:JDK、Maven、Gradle。通过安装插件,tools指令还可以支持更多的工具。接下来,我们介绍几种常用的构建环境的搭建。

4.2.3 JDK环境搭建

自动安装JDK

设置自动安装Oracle JDK时有一些特殊,因为下载Oracle JDK时需要输入用户名和密码。

进入Manage Jenkins→Global Tool Configuration→JDK页,单击“Add JDK”按钮,就可以设置自动安装JDK,如图4-2所示。

图4-2 设置自动安装Oracle JDK

单击图4-2中所示的“Please enter your username/password”链接,在弹出的对话框中输入你在Oracle官网上的用户名和密码。

这时,Jenkins并不会马上下载JDK,而是当pipeline使用到时才会直接执行下载操作。

指定JDK路径

基于安全的考虑,公司的网络可能无法直接访问外网,所以无法使用自动下载。这时就需要在Jenkins agent上自行安装JDK,然后在Manage Jenkins→Global Tool Configuration→JDK页中指定名称和JAVA_HOME路径,如图4-3所示。

图4-3 手动指定JAVA_HOME路径

注意,“自行安装”的意思并不是指手动安装,我们应该写自动化脚本,自动化安装JDK。

4.2.4 Maven

使用Maven进行构建

Jenkins pipeline的tools指令默认就支持Maven。所以,使用Maven只需要两步。

(1)进入Manage Jenkins→Global Tool Configuration→Maven页,设置如图4-4所示。

请注意Name的值为mvn-3.5.4。接下来会用到这个值。“Install from Apache”下的Version可以选择Maven版本。

(2)在Jenkinsfile中指定Maven版本,并使用mvn命令。

图4-4 自动安装Maven

这样,当执行到tools指令时,Jenkins会自动下载并安装Maven。将mvn命令加入环境变量中,可以使我们在pipeline中直接执行mvn命令。

使用Managed files设置Maven

Maven默认使用的是其官方仓库,国内下载速度很慢。所以,我们通常会使用国内的Maven镜像仓库。这时就需要修改 Maven 的配置文件 settings.xml。settings.xml 文件的默认路径为${M2 HOME}/conf/settings.xml。但是,我们是不可能登录上Jenkins的机器,然后手动修改这个文件的。

Config File Provider插件(https://plugins.jenkins.io/config-file-provider)能很好地解决这个问题。只需要在Jenkins的界面上填入settings.xml的内容,然后在pipeline中指定settings.xml就可以了。也就是说,对于不同的pipeline,可以使用不同的settings.xml。

具体实现方法如下:

(1)安装Config File Provider插件。

(2)进入Manage Jenkins页面,就可以看到多出一个“Managed files”菜单,如图4-5所示。

(3)单击“Managed files”进入,在左侧菜单栏中选择“Add a new Config”,就会看到该插件支持很多种配置文件的格式及方式,如图4-6所示。

图4-5 “Managed files”菜单

图4-6 选择配置文件格式

我们看到列表中有多个重复的选项,看来Config File Provider插件2.18版本在Jenkins 2.121.1下有Bug。但是依然可以设置,不会报错。

(4)选择“Global Maven settings.xml”选项。因为我们的设置是全局的。填写“ID”字段,Jenkins pipeline会引用此变量名。假如使用的ID为maven-global-settings。

(5)单击“Submit”按钮提交后,就看到编辑页了。将自定义的Maven settings.xml的内容粘贴到“Content”字段中,单击“Submit”按钮即添加完成,如图4-7所示。

图4-7 编辑配置文件

(6)在Jenkins pipeline中使用的方法如下:

4.2.5 Go语言环境搭建

Jenkins支持Golang的构建,只需要以下几步。

(1)安装Go插件(https://plugins.jenkins.io/golang)。

(2)进入Manage Jenkins→Global Tool Configuration→Go页,设置如图4-8所示。

(3)在pipeline中加入tools部分。

此时,在环境变量中会增加一个GOROOT变量。

图4-8 设置自动安装Go编译器

(4)设置GOPATH。了解Go语言开发的读者都会知道,编译时需要设置GOPATH环境变量。直接在environment指令中添加就可以了。

完整代码如下:

4.2.6 Python环境搭建

Python环境很容易产生Python版本冲突、第三方库冲突等问题。所以,Python开发通常会进行工程级别的环境隔离,也就是每个Python工程使用一个Python环境。

在Jenkins环境下,我们使用Pyenv Pipeline插件(https://plugins.jenkins.io/pyenv-pipeline)可以轻松地实现。

首先,准备Python基础环境。

(1)在Jenkins机器上安装python、pip、virtualenv。

• pip:Python的包管理工具。

• virtualenv:Python中的虚拟环境管理工具。

(2)安装Pyenv Pipeline插件。

然后,在pipeline中使用Pyenv Pipeline插件提供的withPythonEnv方法。

withPythonEnv方法会根据第一个参数——可执行python路径——在当前工作空间下创建一个virtualenv环境。

withPythonEnv方法的第二个参数是一个闭包。闭包内的代码就执行在新建的virtualenv环境下。