..
Jenkins 选择指定镜像部署
背景需求: 项目的编译和部署是分离的,每次编译完成以后把镜像推送到镜像仓库,然后由部署人员拉取镜像进行部署。部署人员需要再 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""
}]
创建自由风格软件项目
我们在添加参数,选择 choice 类型 然后写 groovy 脚本获取镜像的版本信息, 下面的脚本就会动态获取版本列表了(Jenkins 上注意开放一下执行权限),这个脚本还能优化一下,传递一个 limit 参数,限制返回的版本数量,这样下拉框的选项会少很多。 代码如下:
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"
}