..

Jenkins 动态参数配合 http 请求

背景需求: 项目的编译和部署是分离的,每次编译完成以后把镜像推送到镜像仓库,然后由部署人员拉取镜像进行部署。部署人员需要再 Jenkins 上选择需要部署的版本,然后点击确认进行部署。难点是,在 Jenkins 上如何获取指定镜像的所有版本,然后样用户选择?

解决方案: 每次编译完成以后把镜像推送到镜像仓库以后,同步触发一个 webhook 事件,将镜像的版本信息推送到一个第三方系统,让后下次部署的时候,从第三方系统的接口查询镜像的版本信息,然后用户选择。

这里的第三方系统代码我已经实现好了,代码在 github 上 aq,每次 webhook 发送 POST 请求

curl -X POST http://localhost:9090/image/{name}:{tag}

服务器会记录版本信息,然后下次部署的时候查询接口

curl -X GET http://localhost:9090/image/{name}

就能返回一个版本列表

[{
   "name": "xxx",
   "tag":"xxx""
}]

创建自由风格软件项目 p1

我们在添加参数,选择 choice 类型 p1 然后写 groovy 脚本获取镜像的版本信息, 下面的脚本就会动态获取版本列表了(Jenkins 上注意开放一下执行权限),这个脚本还能优化一下,传递一个 limit 参数,限制返回的版本数量,这样下拉框的选项会少很多。 p1 代码如下:

import groovy.json.JsonSlurper
try {
    List<String> artifacts = new ArrayList<String>()
    def artifactsUrl = "http://localhost:9999/image/{name}"
    def artifactsObjectRaw = ["curl", "-s",'-X','GET', "-H", "accept: application/json", "-k", "--url", "${artifactsUrl}"].execute().text
    def jsonSlurper = new JsonSlurper()
    def artifactsJsonObject = jsonSlurper.parseText(artifactsObjectRaw)
    def dataArray = artifactsJsonObject
    for(item in dataArray){
        artifacts.add( item.tag)
    }
    print artifacts.toString()
    return artifacts
} catch (Exception e) {
    print e.printStackTrace()
    print "There was a problem fetching the artifacts"
}