jenkins parameters动态获取文件夹列表

jenkins 参数动态获取文件夹

背景

  • 这个job是更新某个软件版本的,版本list位于服务器的某个文件夹下
  • 现在要指定一个版本,用于发布,并且确保该版本是最新的

实现

pipeline

 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
pipeline {
    agent {
        node {
            label "xxx"
        }
    }
    options {
        timestamps ()
        timeout(time: 10, unit: 'MINUTES')
        disableConcurrentBuilds()
        buildDiscarder(logRotator(numToKeepStr: '50'))
    }
    parmeters{
        string(defaultValue: 'xxxx', name: 'xxx_release', description: '版本号(请只输入日期,比如210607)')
    }

    stages {
        stage("Build") {
            steps {
                script {
                    set_result = sh label: '', returnStdout: true, script: "bash /root/xxx_release_set.sh ${params.xxx_release}"
                    println set_result
                }
            }
        }
    }
}

优化

由于要手动填版本,所以容易出错,脚本还要判断,且无法知道当前版本,于是看parameters里面是否有对应的配置 发现之前装了active parameter的插件https://plugins.jenkins.io/uno-choice/ 所以计划配置下

配置uni-choice插件

选择the projects is parameterized然后选择active choices reactive parameter,然后填入groovy script, 并且不选择沙盒运行,因为用到bash执行

1
2
3
4
releases = ["bash","-c","ssh xxxx -lroot \"ls -l /xxx/*.exe|tail -n 10\" | awk -F '/' '{print \$NF}'"].execute().text.readLines()
now_release = "当前版本:"+["bash","-c","ssh xxxx -lroot \"ls -l /xxx/*.exe|tail -n 1\" | awk -F '/'  '{print \$NF}'"].execute().text.readLines()[0]
releases.add(now_release)
return releases

需要注意如下几个方面

  • 选择不要沙盒
  • 需要管理员同意这些命令
  • 注意转移字符,否则会出不来,建议刚开始只做最简单的部分

在pipeline中怎么写呢

正决定妥协的时候,在pipe-line syntax里面还是找到了,选择properties: Set job properties就可以啦

总结

关于变量的东西生成请去properties里面找

uno-choice可以比较方便实现动态菜单的结果,在某种程度加强jenkins的交互