问题描述
在 Jenkins 中,Job 将在各个 Agent 中运行,同时这些 Job 又依赖于各种构建工具及命令,这就要求我们在 Agent 中安装各种工具;
但是,鉴于 Jenkins Agent 众多,在各个 Agent 中进程安装是不现实的,而且不同 Job 又依赖于不同版本的工具(增加节点维护难度);
该笔记将记录:在 Jenkins 中,如何维护管理和使用各种工具,以及常见问题的解决办法;
解决方案
在 Jenkins 中:
1)其提供 Manage Jenkins => Global Tool Configuration 功能,使得我们能够配置各种工具;
2)而后,在 Job 中,选择需要使用的工具及版本,在构建时 Jenkins 将自动进行工具的安装及配置;
配置多版本 NodeJS 构建环境
前端开发人员使用多种版本 NodeJS 环境进行开发,并使用 NVM 自如切换版本。在使用 Jenkins 构建时,也应该使用对应版本进行构建。本文将介绍在 Jenkins Pipeline 中,如何使用不同 NodeJS 版本进行构建任务;
第一步、安装插件
可以使用 NodeJS 插件,网络教程详尽,不再赘述;
第二步、配置版本
Manage Jenkins => Global Tool Configuration => NodeJS => NodeJS installations… => Add NodeJS
记住Name字段,它用于标识 NodeJS 环境,需要在流水脚本中使用。其他字段按照提示填写信息即可,不再赘述;
第三步、(可选)定义 npmrc 文件
Manage Jenkins => Managed files => Add a new Config => Npm config file
记住ID字段(可自定义),它用于标识配置文件,需要在流水脚本中使用。其他字段按照提示填写即可,不再赘述;
第四步、在流水中使用
nodejs(nodeJSInstallationName: '<Name>', configId: '<ID>') { sh 'npm config ls' }
其他方法
通过 nvm-wrapper 插件
也可以使用 nvm-wrapper 插件,使用方法可以参考插件主页;
我们并没有成功,后来我们使用 NodeJS 插件。可能是因为我们全局设置 PATH 环境变量,导致无法加载 NVM 设置的 PATH 变量;
相比之下,我们还是选用 NodeJS 插件:(1)可以加载任意 npmrc 文件;(2)与 Jenkins 结合紧密,封装少,项目相对活跃;(3)功能丰富,可全局安装模块;
Pipeline Maven Integration Plugin
Pipeline Maven Integration Plugin
maven – Jenkins Declarative Pipeline with custom settings.xml
该插件用于 Maven 环境管理;
使用案例:
... withMaven(maven: 'M3', mavenSettingsConfig: 'mvn-setting-xml') { sh "mvn clean install " } ...
Custom Tools:自定义工具
除了常见的工具(NodeJS Maven NPM Grade)外,Jenkins 还支持用户自定义工具。
安装 Jenkins plugin/Custom Tools 插件
配置位置:Manage Jenkins => Global Tool Configuration => Custom tool
相关配置参数
关于 Subdirectory of extracted archive 参数:当工具的压缩文件包含子目录,并且命令在该子目录中时,需要指定该参数,其值为命令所在路径。否则 tool 仅能返回工具所解压的目录;
关于 Exported paths 参数:虽然文档(Custom Tools)说该参数用于指定添加到 PATH 变量的额外路径,但是我们发现工具路径并没有添加到 PATH 路径(或许是我们配置的不对,所以我们才使用 environment 来手动添加);
在 Pipeline 中,加载自定义工具
Declarative pipeline support for tools: CMake, custom tools
[JENKINS-50718] append tool HOME to PATH in declarative Pipeline
在 Freestyle Job 中,经过验证,通过正确配置,则能够使得命令路径自动加载到 PATH 环境变量中,
但是,在 Jenkins Pipeline 中,我们发现其未自动添加到 PATH 环境变量中(获取是我们配置不对)。
我们尝试使用 tools 命令来加载工具,虽然能够安装,但是命令并不在 PATH 路径中:
pipeline { agent any tools { com.cloudbees.jenkins.plugins.customtools.CustomTool "helm 3.9.x" } stages { stage('deploy') { steps { sh 'helm version' } } } }
经过查阅,我们尝试使用如下方式来手动处理:
pipeline { agent any environment { HELM_PATH = tool name: 'helm 3.9.x', type: 'com.cloudbees.jenkins.plugins.customtools.CustomTool' PATH = "${HELM_PATH}:${PATH}" // PATH = "${jx_path};${PATH}" // on windows } stages { stage('deploy') { steps { sh 'helm version' } } } }