Jenkinsfile运行shell的find命令查找指定后缀文件报错如何解决
Jenkins流水线find命令转义错误解决方案
报错根因
- Groovy作为Jenkins流水线的解析引擎,会先对
"""包裹的多行字符串做转义处理:你写的单个反斜杠\会被Groovy识别为转义符直接消耗,不会传递到最终执行的shell脚本中,因此触发了unexpected char: '\'的编译错误。 - 你写的find命令外层额外包裹了多余的双引号,也会导致shell执行时命令解析异常。
修复方案
你需要对shell中所有需要保留的反斜杠做双重转义(写为\\),同时去掉find命令外层的多余引号,修改后的完整stage代码如下:
stage("SCA Check"){ node("default"){ checkout scm conf.findAll { key, value -> key.contains("token.") }.each { key, value -> tokens << string(credentialsId: value, variable: key.replace('token.','')) } withEnv(vars) { withCredentials(tokens){ dir(dirpath) { dir(AppName) { git url: gitURL, credentialsId: 'bitbucket-https-url-rdonly', branch: branchName } sh """#!/bin/bash set echo '${scaInfo}' python --version cp Action.py '${AppName}' && cd '${AppName}' && mkdir -p scan find . -regex '.*\\.\\(sql\\|conf\\|py\\|csv\\|coveragerc\\|css\\|eot\\|etlconf\\|hql\\|html\\|idx\\|ini\\|js\\|json\\|log\\|map\\|md\\|pack\\|pdf\\|sample\\|sh\\|svg\\|ttf\\|txt\\|woff\\|woff2\\)$' -exec cp {} scan/ \\; echo find cd scan && zip scan.zip * && mv scan.zip .. && cd .. python Action.py '${scaInfo}' """ } } } } }
可选优化说明
如果你的项目不同目录下存在重名的指定后缀文件,直接拷贝到scan目录会出现覆盖问题,可以调整find命令保留目录结构,例如使用cp --parents {} scan/,这样拷贝时会自动在scan目录下创建和原路径一致的目录结构,避免文件覆盖。
内容的提问来源于stack exchange,提问作者Simply Anks
相关产品推荐
相关产品推荐

