二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Nexus系列文章

  • Jenkins系列文章

    • Jenkins入门系列笔记汇总整理
    • 前言与介绍
    • Jenkins初始部署与简单配置
    • Jenkins各配置选项介绍
    • Jenkins中一个项目的构建
    • Jenkins配置项目构建的钉钉通知
    • Jenkins忘记管理员密码怎么办
    • Jenkins与gitlab的交互探微
    • Jenkins根目录详解
    • Jenkins插件之显示构建时间
    • Jenkins插件之批量修改配置
    • Jenkins配置简单构建邮件推送
    • Jenkins复杂邮件推送配置详解
    • Jenkins配置复杂构建邮件推送
    • Jenkins构建安卓项目之前的一些唠叨
    • Jenkins构建安卓项目配置
    • Jenkins与Gitlab分支的交互
    • Jenkins构建nodejs项目
    • 使用docker部署Jenkins及初始配置
    • 配置gitlab提交代码Jenkins自动构建
    • Jenkins回滚方案探微
    • Jenkins角色控制(小黄锁)探微
    • Jenkins构建的应用配置问题解决探微
    • Jenkins构建中tag的应用
    • Jenkins插件之Ansicolor(神器)
    • 最基础核心的Jenkins功能部署一个java应用
    • Jenkins+sonar构建代码扫描
    • Jenkins+docker+gitlab将应用部署到docker
    • Jenkins参数化构建犀利插件Active-Choices-Plugin
    • 记一次将代码中参数外显到构建历史中的操作
    • Jenkins升级与迁移的经验分享
    • pipeline笔记之从一个简单的项目构建开始
    • Jenkinsfile声明式语法详解
    • 自动构建的原始配置以及pipeline中的用法
    • 多分支构建的实践与思考
    • 使用Jenkinsfile类前端项目的部署与回滚
    • 如何在Jenkinsfile中定义一个全局的时间戳变量
    • Jenkins中自由风格回滚方案的最佳实践
    • Jenkins中pipeline风格回滚方案的最佳实践
    • pipeline结合ansible剧本进行批量的部署与回滚配置
    • 最近配置安卓iOS打包本地化流程中一些值得记录的内容
    • pipeline中如何在environment环节声明一个含有通配符的变量
    • git-Parameter插件在pipeline共享库中的实践详解
    • jenkins作为ci检测代码是否合并的实践
    • 将Jenkins共享库的Jenkinsfile放到ci静态检测的实践
    • Jenkins的pipeline实践之GitSCM参数配置项详解
    • Jenkins中pipeline对接CMDB接口获取主机列表的发布实践
    • Jenkins有任务无法kill提示即将关闭
    • Jenkins基于Share Library共享库的最佳实践探索
    • Jenkins结合MySql Database插件的平台化实践思路
    • Jenkins-Groovy中三元表达式的用法
    • Jenkins-Groovy中Switch的高阶用法
    • Jenkins-pipeline之利用activity choice插件对接查询MySQL数据实现动态参数化的功能
      • 前言
      • 环境
      • 准备数据
      • 代码
      • 核心代码踩坑
      • 效果呈现
      • 最后
    • CentOS通过yum快速安装Jenkins
    • Jenkins-pipeline语法之错误处理详解(文末有干货)
    • Jenkins常用插件汇总以及简单介绍
    • Jenkins所遇报错汇总及解决
    • Jenkins管理维护运维规范
  • ELK笔记

  • Kubernetes笔记

  • LLM专题

  • 系列专题
  • Jenkins系列文章
二丫讲梵
2023-09-09
目录

Jenkins-pipeline之利用activity choice插件对接查询MySQL数据实现动态参数化的功能

文章发布较早,内容可能过时,阅读注意甄别。

# 前言

之前写过一篇文章介绍通过接口获取到数据来渲染构建过程中的动态参数,详见:Jenkins 中 pipeline 对接 CMDB 接口获取主机列表的发布实践 (opens new window)。那么既然能够通过接口渲染数据,是否可以直接在 activity choice 参数的 groovy 脚本中直接通过 MySQL 来实现动态参数的需求呢。

答案是可以的,只不过,一开始我没有料想到,这条路走的是如此曲折。

前后折腾了两次,花费了很多精力去寻找解决方案,最后终于算是摸索出来了一条可行的路。

赶快分享,不在话下!

# 环境

也许不同的 Jenkins 版本,或者插件版本在使用此功能的时候,会遇到与我不一样的问题,或者甚至压根儿不会遇到问题,这都说不准,具体你还要根据你的实际现状来测试,来验证,来观测。

那么我使用的环境基本信息如下:

  • Jenkins 版本:2.411
  • 插件:
    • Active Choices Plug-in (opens new window):2.7.2
  • 数据库:5.7

我习惯使用 Tomcat 部署 war 包的形式来部署 Jenkins。

# 准备数据

因为需要与数据库交互,因此这里需要先有一个数据库,并准备一些基础数据。

创建数据库:

CREATE DATABASE IF NOT EXISTS jkdata DEFAULT CHARACTER SET utf8mb4;
1

创建用户表:

CREATE TABLE jkdata.users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    department VARCHAR(50)
);
1
2
3
4
5

添加几个测试用户:

INSERT INTO jkdata.users (username, department) VALUES ('zhangsan', 'ops');
INSERT INTO jkdata.users (username, department) VALUES ('lisi', 'ops');
INSERT INTO jkdata.users (username, department) VALUES ('wangwu', 'test');
INSERT INTO jkdata.users (username, department) VALUES ('zhaoliu', 'test');
1
2
3
4

我们的需求是先有一个选项参数,用于指定部门信息,然后动态参数通过查询数据库,列出对应部门的用户。

# 代码

经过一些检索实验,我这边调试后的代码如下:

properties([
    parameters([
        choice(
                name: 'department',
                choices: ['ops','test'],
                description: "ops==运维组<br>test==测试组"
        ),
        [
            $class: 'CascadeChoiceParameter',
            choiceType: 'PT_RADIO',
            name: 'username',
            description: "请选择对应的用户",
            referencedParameters: 'department',
            filterable: true,
            script:
                [
                    $class: 'GroovyScript',
                    fallbackScript: [
                        classpath: [],
                        sandbox: true,
                        script: "return['An error occured']"
                    ],
                    script: [
                        classpath: [],
                        sandbox: true,
                        script:
                            '''
import groovy.sql.Sql

def output = []

def sql = Sql.newInstance('jdbc:mysql://192.168.1.1:3306/jkdata', 'root', 'password', 'com.mysql.jdbc.Driver')
String sqlString = "SELECT DISTINCT username FROM user WHERE department = \'${department}\'"
    sql.eachRow(sqlString){ row ->
        output.push(row[0])
    }
return output
                                            '''
                    ]
                 ]
         ]
    ])
])

pipeline {
    agent any
    stages {
        stage("执行") {
            steps {
                sh '''
                    println"""
                        部门为: ${department}
                        用户为: ${username}
                    """
                '''
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

前边使用了选项参数来写死了部门信息,下边用户信息则是根据选择的部门,通过查询数据库而将符合条件的用户列出来。

# 核心代码踩坑

里边的核心代码是:

import groovy.sql.Sql

def output = []

def sql = Sql.newInstance('jdbc:mysql://192.168.1.1:3306/jkdata', 'root', 'password', 'com.mysql.jdbc.Driver')
String sqlString = "SELECT DISTINCT username FROM user WHERE department = \'${department}\'"
    sql.eachRow(sqlString){ row ->
        output.push(row[0])
    }
return output
1
2
3
4
5
6
7
8
9
10

调试的过程就是这段代码踩坑的过程。主要问题出在 MySQL 的驱动上,我们可以把如上代码,来到 Jenkins 的 系统设置 的 Script Console 中,尝试运行一下,然后就遇到了如下错误:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1420)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1228)
	at java.base/java.lang.Class.forName0(Native Method)
1
2
3
4

如下图:

就是这样一个错误,我查遍了全网,进行了大量的阅读浏览,基本上都是货不对板的解决方案,或者不够详尽。

问题似乎不复杂,无非就是 Jenkins 在运行 groovy 脚本的时候,无法正确加载到驱动,那么,如何才能解决这个驱动问题呢?

直到经过了上百个网页浏览之后,我遇到了这样一篇文章:Jenkins 工程中 SQL 语句执行的方法 (opens new window) 里边介绍了,需要下载 com.mysql.jdbc_5.1.38.jar,然后将 jar 包放到 jenkins 的 lib 目录当中。

接下来问题又来了,文章只说了下载这个包,但没有直接放下载链接,经过检索之后,我发现可以通过这个链接下载这个包: http://www.java2s.com/Code/Jar/c/Downloadcommysqljdbc515jar.htm

这个链接下载的是 com.mysql.jdbc_5.1.15.jar 版本的,不过实测仍旧能够使用。

我的 jenkins 的 lib 路径是在 /usr/local/tomcat/webapps/ROOT/WEB-INF/lib,将下载的 jar 放到这个目录下,然后 重启 Jenkins,之后再到 Script Console 运行脚本,可以看到有结果了:

# 效果呈现

当代码调试通过之后,就可以将如上 groovy 创建为项目,然后运行项目,查看效果。

嗯,舒服!!

# 最后

虽然现在跑通了,但这里边我仍有一些疑惑,如果有人找到了答案,欢迎在评论区一块儿交流:

  • 在 activity choice 插件的参数当中,有一个参数项是 classpath,看起来像是能自定义 jar 包,但我做了许多尝试,都没能成功。
  • 上边的 groovy 脚本中的部门信息是通过选项参数写死的,你如果有兴趣让这个信息也通过数据库取出,那你可以尝试改造一些 groovy 来实现。
微信 支付宝
#Jenkins
上次更新: 2025/03/06, 21:25:58
Jenkins-Groovy中Switch的高阶用法
CentOS通过yum快速安装Jenkins

← Jenkins-Groovy中Switch的高阶用法 CentOS通过yum快速安装Jenkins→

最近更新
01
睡着的人不关灯
06-12
02
学习周刊-总第215期-2025年第24周
06-12
03
学习周刊-总第214期-2025年第23周
06-05
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式