上一篇文章我向大家展示了如何提取工程的构建参数,尤其是当构建是被上级工程触发的时候,怎么得到参数列表。文章的最后原本想向大家展示下如何使用Jenkinsapi库去远程触发构建。但发现这里也有问题,所以在这篇里去研究解决这个问题。
问题展示
我们使用invoke方法去触发任务时,当工程没有配置参数时,实际工程并未收到参数,参数区域只能看到个已经配置的test1参数。下方环境变量里面也没有,这个参数被完全丢弃了。
job.invoke(build_params={'test4':123435456})
解决思路
比较简单的方法就是我们在这个工程的配置里添加上这个参数
这个时候再去执行代码就能看到这个参数了。
那么有没有一种方式可以不需要配置就能用上呢?
参数启动工程原理
查阅相关源代码,这个invoke方法实际是调用了build_triggerurl来触发工程,这个和Jenkins本身的工程启动其实是几乎一致的,所以在现成函数中找到一种方法来带额外参数启动显然是不可能的。
build_triggerurl可以通过这段代码job.get_build_triggerurl()得到,这是个类似于 http:// 127.0.0.1 :8080/job/priority_with_1/buildWithParameters的链接。
启动过程类似于以下命令:
curl http:// 127.0.0.1 :8080/job/priority_with_1/buildWithParameters --user bob:110c70ea8f41063e377aca53007a1ca2e4 --data test4=123 --data test5=123456
所以过滤参数是Jenkins自身的行为,并非库的缺陷,毕竟你在页面上rebuild子工程,也不会带上上级工程传下来的额外参数。
工程设计
既然既有功能不能满足要求,那么就需要自己去设计实现。
前面我向大家介绍过如何在代码中修改任务的配置文件,那么结合上一篇的文章中获取全部参数的功能,我们可以这样实现这个功能:
1. 取得job的配置
2. 准备这一次运行传入的参数
3. 读取job配置中的参数区域,对比缺少的参数
4. 将缺少的参数加入配置区域内,更新配置
5. 执行本次参数工程
6. 恢复原有配置
其中第三步的取得参数可以通过以下代码实现:
params = job.get_params()
for param in params:
print(param)
得到的是参数详情,或者通过
print(job.get_params_list())
直接得到参数名称列表
这样我们就能实现任意参数启动任务了。