0x0 背景
基于文档jenkins构建docker镜像的问题,现在有了进一步的需求,在构建镜像的时候需要定制oem版本的包,或者后续可能会有多个版本,那么每个版本都新增一个jenkins任务维护起来太过于麻烦,所以需要有办法能提供一个通用的打包任务
0x1 问题
要能够通用的打包任务,重点在于以下:
- 打包的时候来提交参数,war的地址/war的版本来定制,其他的代码文件与之前的固定版本一致即可
- 基于上面这个问题,要么jenkins任务的时候弹窗给出参数,要么使用接口来触发任务了
0x2 解决
以上第一个问题是没有问题的,当前固定版本的构建也是通过脚本获取了war文件和war版本信息,后续的操作跟文件无关了,所以这部分代码通用。第二个问题选择使用jenkins api的方式触发构建
0x3 jenkins api
jenkins api需要token鉴权,所以使用一个普通用户创建一个token即可(保证安全),登录jenkins后点击用户名,再选择configure,最后选择show Legacy API Token,即可复制出有效token,之后再按照jenkins api文档给出的示例调用方式,这里还有一个重点问题,因为需要提供参数,所以接口要选择'/buildWithParameters',但使用下面调用请求返回报错:
curl -XPOST http://jenkins.succez.com/job/镜像-common/buildWithParameters --user yuctest:xxxxx4a25f85629a846ba7285d7xxxxx --data war=ftp://192.168.xx.xx/xxx/xxx/123.war --data version=cccccc
前端的报错内容很模糊,无参考价值,但jenkins后台日志提示如下:
java.lang.IllegalStateException: This build is not parameterized!
基本上可以推断出我们使用的传参接口,但是创建的任务却没有启用相关的功能,所以应该要修改以下任务。
在任务配置的通用栏下,可以看到选项'This project is parameterized',勾选后还要继续设置传送哪种参数,否则是无法保存的,我们这里需要传送两个参数,并且都是字符串,所以选择了string类型,并且设置名称,值可以不设置,之后变可以在后面的执行步骤中获取这两个变量了
0x4 最后
使用接口测试就没有问题了,余下的步骤也参考之前的固定版本就行
20220609 在jenkins中点击构建的时候会弹到参数页面,输入给定的参数就行了,不是一定需要通过api调用