Jenkins声明式流水线中不使用script标签能否调用findFiles?
Jenkins声明式流水线无script块实现通配符解压方案
你之前的代码无法直接放在script块外运行,是因为声明式流水线的steps块中不允许直接执行变量赋值这类脚本式操作,仅允许步骤调用、方法参数内的表达式执行,以下是两种免script块的实现方式:
方案1:直接嵌套方法调用(适合单次使用路径)
无需单独定义变量,直接将findFiles方法的返回值嵌入unzip的入参中,可直接放在steps块内运行:
unzip zipFile: findFiles(glob: "directory/NoConfig*.zip")[0].toString(), dir: "otherDirectory", quiet: true
方案2:通过environment块定义变量(适合路径复用)
如果后续多个步骤都需要用到该压缩包路径,可以在environment块中提前赋值,声明式流水线支持在环境变量定义时调用内置流水线方法:
pipeline { agent any environment { // 提前匹配压缩包路径存入环境变量 NO_CONFIG_ZIP = findFiles(glob: "directory/NoConfig*.zip")[0].toString() } stages { stage('解压配置包') { steps { unzip zipFile: "${NO_CONFIG_ZIP}", dir: "otherDirectory", quiet: true // 其他需要用到NO_CONFIG_ZIP的步骤可直接引用该变量 } } } }
注意事项
- 请确保
directory路径下至少存在1个符合NoConfig*.zip规则的文件,否则访问数组下标[0]会抛出索引越界异常 - 可提前添加文件存在性校验步骤避免报错,示例:
sh 'if [ $(ls directory/NoConfig*.zip 2>/dev/null | wc -l) -eq 0 ]; then echo "未找到匹配的压缩包" && exit 1; fi'
内容的提问来源于stack exchange,提问作者Lieven Cardoen
相关产品推荐
相关产品推荐

