需求:
使用Jenkins跑CI/CD任务时,由于生产环境主机数量及配置频繁变动,现需要实现Jenkins自动加载已有节点信息的功能(而不是每次都手动修改pipeline代码),加载后在Web界面(点击“构建”后)以单选或多选框的形式显示出来。
实现思路:
- 执行shell命令,拿到相关节点信息
grep -E '^Host ' /var/lib/jenkins/.ssh/test.conf | awk '{print \$2}' | tr '\\n' ','
- 借助getHosts函数返回一个数组或字符串给Jenkins parameters,choice可以接收数组类型,extendedChoice的value只支持接收字符串。
单选框实现代码:
// 从 /var/lib/jenkins/.ssh/test.conf 获取所有配置的主机名
def getHosts() {
// 在 node 块中调用 sh 步骤
node {
// 执行获取主机列表的脚本,并将其输出转换为 List
def hosts = sh(script: "grep -E '^Host ' /var/lib/jenkins/.ssh/test.conf | awk '{print \$2}' | tr '\\n' ','", returnStdout: true).trim()
return hosts.split(',') as List // 将返回值转换为 List 类型
}
}
pipeline {
agent any
parameters {
choice(
name: 'HOST',
choices: getHosts(),
description: 'Select one server'
)
}
stages {
stage('Compile') {
steps {
script {
echo "Start to compile ..."
}
}
}
stage('Release') {
steps {
script {
echo "Start to Release ..."
echo "Selected Hosts: ${params.HOST}"
}
}
}
}
}
多选框实现代码:
// 从 /var/lib/jenkins/.ssh/test.conf 获取所有配置的主机名
def getHosts() {
// 在 node 块中调用 sh 步骤
node {
// 执行获取主机列表的脚本,并将其输出转换为 List
def hosts = sh(script: "grep -E '^Host ' /var/lib/jenkins/.ssh/test.conf | awk '{print \$2}' | tr '\\n' ','", returnStdout: true).trim()
return hosts.split(',').join(',') // 将列表转换为逗号分隔的字符串
}
}
pipeline {
agent any
parameters {
extendedChoice(
name: 'HOST',
description: 'Select one or more servers',
multiSelectDelimiter: ',',
visibleItemCount: 10,
quoteValue: false,
saveJSONParameterToFile: false,
type: 'PT_CHECKBOX', // 单选是PT_SINGLE_SELECT
defaultValue: '',
value: getHosts()
)
}
stages {
stage('Compile') {
steps {
script {
echo "Start to compile ..."
}
}
}
stage('Release') {
steps {
script {
echo "Start to Release ..."
echo "Selected Hosts: ${params.HOST}"
}
}
}
}
}