「JENKINS-PIPELINE」- 构建工具管理:NodeJS Maven NPM

  CREATED BY JENKINSBOT

问题描述

在 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'
            }
        }
    }
}