赵走x博客
网站访问量:151882
首页
书籍
软件
工具
古诗词
搜索
登录
34、触发pipeline执行:事件触发
33、触发pipeline执行:时间触发
32、当我们谈质量时,谈的是什么
31、Allure测试报告:更美观的测试报告
30、SonarQube:持续代码质量检查
29、性能测试
28、单元测试
27、静态代码分析
26、利用tools作用域实现多版本编译
25、利用环境变量支持更多的构建工具
24、构建工具
23、环境变量
22、小贴士
21、pipeline内置基础步骤:其他步骤
20、pipeline内置基础步骤:命令相关步骤
19、pipeline内置基础步骤:制品相关步骤
18、pipeline内置基础步骤:文件目录相关步骤
17、在声明式pipeline中使用脚本
16、配置pipeline本身
15、pipeline支持的指令
14、 post部分
13、pipeline的组成
12、必要的Groovy知识
11、使用Maven构建Java应用
10、从版本控制库拉取pipeline
9、创建第一个pipeline
8、pipeline语法的选择
7、Jenkinsfile又是什么
6、pipeline是什么
5、Jenkins与DevOps
4、Jenkins介绍
3、从另一个角度看“提高软件工程生产力”
2、前言
1、内容简介
24、构建工具
资源编号:76398
Jenkins 2.x 实战指南
微服务
热度:98
构建是指将源码转换成一个可使用的二进制程序的过程。这个过程可以包括但不限于这几个环节:下载依赖、编译、打包。构建过程的输出——比如一个zip包,我们称之为制品(有些书籍也称之为产出物)。而管理制品的仓库,称为制品库。关于制品的管理,我们在第10章中进行详细介绍。
构建是指将源码转换成一个可使用的二进制程序的过程。这个过程可以包括但不限于这几个环节:下载依赖、编译、打包。构建过程的输出——比如一个zip包,我们称之为制品(有些书籍也称之为产出物)。而管理制品的仓库,称为制品库。关于制品的管理,我们在第10章中进行详细介绍。 在没有Jenkins的情况下,构建过程通常发生在某个程序员的电脑上,甚至只能发生在某台特定的电脑上。这会给软件的质量带来很大的不确定性。想想软件的可靠性(最终是老板的生意)依赖于能进行构建的这台电脑的好坏,就觉得很可怕。 解决这一问题的办法就是让构建每一步都是可重复的,尽量与机器无关。所以,构建工具的安装、设置也应该是自动化的、可重复的。 虽然Jenkins只负责执行构建工具提供的命令,本身没有实现任何构建功能,但是它提供了构建工具的自动安装功能。 # 1、 构建工具的选择 对构建工具的选择,很大一部分因素取决于你所使用的语言。比如构建 Scala 使用 SBT,JavaScript的Babel、Browserify、Webpack、Grunt以及Gulp等。当然,也有通用的构建工具,比如Gradle,它不仅支持Java、Groovy、Kotlin等语言,通过插件的方式还可以实现对更多语言的支持。 对构建工具的选择,还取决于团队对工具本身的接受程度。笔者的建议是,团队中同一技术栈的所有项目都使用同一个构建工具。 # 2、 tools指令介绍 tools指令能帮助我们自动下载并安装所指定的构建工具,并将其加入PATH变量中。这样,我们就可以在sh步骤里直接使用了。但在agent none的情况下不会生效。 tools指令默认支持3种工具:JDK、Maven、Gradle。通过安装插件,tools指令还可以支持更多的工具。接下来,我们介绍几种常用的构建环境的搭建。 # 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、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中使用的方法如下:  # 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指令中添加就可以了。 完整代码如下:  # 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环境下。