如何在Jenkins声明式流水线中递归归档产物并排除指定子目录
Jenkins声明式流水线动态归档文件方案
核心逻辑是依托Jenkins内置的Ant风格路径匹配规则,无需硬编码动态的<BUILD_NAME>目录名即可实现过滤归档。
最高效实现方式
直接使用archiveArtifacts步骤的路径匹配+排除规则即可,无需额外执行命令获取动态目录名:
pipeline { agent any // 你的其他流水线配置 stages { // 原有构建阶段,此处省略 } post { always { // 核心归档逻辑 archiveArtifacts artifacts: 'out/*/*', excludes: 'out/*/build/**', fingerprint: true } } }
参数说明
artifacts: 'out/*/*':*通配符匹配out目录下任意一级子目录(即动态的<BUILD_NAME>目录),末尾的*匹配该目录下所有直接独立文件,不会匹配子目录内的内容;如果需要归档<BUILD_NAME>下除build之外其他子目录的内容,可以把该参数改为out/*/**excludes: 'out/*/build/**':排除所有<BUILD_NAME>目录下build子目录的全部内容fingerprint: true:可选参数,开启文件指纹校验,方便后续版本比对- 可按需添加
allowEmptyArchive: false参数,匹配不到文件时直接报错,避免出现空归档的异常情况
特殊场景兼容
如果你的Jenkins版本较旧,或者out目录下存在多个<BUILD_NAME>目录只需归档最新的一个,可以先通过shell命令获取目标目录名再归档:
stage('Archive') { steps { script { // 获取out目录下最新的子目录名 def targetBuildDir = sh(script: 'ls -dt out/*/ | head -n 1', returnStdout: true).trim() archiveArtifacts artifacts: "${targetBuildDir}*", excludes: "${targetBuildDir}build/**" } } }
内容的提问来源于stack exchange,提问作者kiryakov
相关产品推荐
相关产品推荐

