问题描述
我正在尝试引用一个秘密文件,以便像newman一样在工作区的子目录下运行:
String integrationFile = "src/test/postman/integration.json"
String environmentFile = "src/test/postman/environment-dev.json"
String reportFile = "integrationReport.xml"
String reportArgs = "--reporters cli,junit --reporter-junit-export ${reportFile}"
node {
withCredentials([file(credentialsId: "${env.FILE_KEY}",variable: "FILE_PATH")]) {
String dataFile = "${env.FILE_PATH}"
dir('sub-dir') {
git branch: 'master',credentialsId: "${config.GitHubKeyId}",url: 'https://github.com/xxx/repo.git'
withEnv(["PATH=${tool 'nodejs-12.8.0'}/bin:${env.PATH}"]) {
try {
sh ("newman run \"${integrationFile}\" -e \"${environmentFile}\" --global-var \"baseUrl=${route}\" -d ${dataFile} ${reportArgs}")
} catch (error) {
throw error
} finally {
junit "${reportFile}"
}
}
}
}
}
}
但是当我运行上面的代码时,詹金斯抛出一个错误:
error: iteration data could not be loaded
ENOENT: no such file or directory,open '/var/jenkins_home/workspace/Platform'
该路径似乎被截断,因为当我在节点关闭运行之前运行pwd命令时,工作空间应为:
/var/jenkins_home/workspace/Platform Management/JJob@2
我的问题是,詹金斯为什么要这样做?我是否需要以其他方式格式化机密的变量?还是应该以不同的方式引用它?
- 我知道该文件存在是因为在另一个没有子目录(dir(“”))的Jenkins管道中,它工作正常。
- 我从Jenkins关于withCredentials的文档中看到,当您在目录之间移动时,如何引用文件变得很棘手,请参见:https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
这是我尝试过的事情:
$ {env.FILE_PATH}
$ {FILE_PATH}
$ FILE_PATH
(以上所有内容均在sh命令中用双引号和单引号引起来)
感谢您的帮助, 谢谢!
解决方法
好吧-在玩了很多之后,我最终在变量周围添加了双引号以保留空格。这样的结果帮助了我:Jenkins coping with spaces in batch file arguments
在newman命令行脚本中,我只是在参数args中添加了双引号,如下所示:
sh ("newman run \"${integrationFile}\" -e \"${environmentFile}\" --global-var \"baseUrl=${route}\" -d \"${dataFile}\" ${reportArgs}")