我刚刚开始研究与jenkins的共享库,以便将跨几乎相同的多个存储库的脚本和管道负载组合在一起。
我已经加载并运行了共享库,但是在尝试执行脚本时,资源文件夹中我却一直找不到错误:
../releaseTagging-EO2DMYOPJ6JGB6JT5Q2RSFJWJWWPALA7F25H7CQNYBEV4ITTEB6Q@tmp/build.sh: not found
我正在使用以下方法创建文件的副本:
createTempLocation(String path) {
String tmpDir = pwd tmp: true
return tmpDir + File.separator + new File(path).getName()
}
和
copyGlobalLibraryScriptcall(String srcPath, String destPath = null) {
destPath = destPath ?: createTempLocation(srcPath)
writeFile file: destPath, text: libraryResource(srcPath)
echo "copyGlobalLibraryScript: copied ${srcPath} to ${destPath}"
sh "chmod +x ${destPath}"
echo "added executable permissions to ${destPath}"
return destPath
}
然后我这样调用最后一个函数:
runBuild(Map config) {
def script = copyGlobalLibraryScript('build.sh')
sh script
}
(我意识到我可以将上述功能折叠成一行)
然后依次通过调用(将整个文件修剪到相关部分):
pipeline {
agent any
stages {
stage('Build') {
steps {
timestamps {
checkout scm
bbNotify( key: buildKey, name: BuildName) {
runBuild()
}
stash includes: '**', name: 'RelToSTAN'
}
}
}
}
这一切都失败了,并在问题的顶部出现了错误,但是,当切换到构建服务器时,我可以在指定位置找到该文件。
我不明白为什么詹金斯无法找到并执行它。
答案 0 :(得分:0)
问题将是以下原因:
使用Java File
对象时,它将始终引用Jenkins主对象上的某个位置。当然,它通常不能在沙箱中运行。
另一方面,readFile
和writeFile
方法始终引用由node
块保留的,将调用封装的构建代理上的某个路径。
长话短说:不要使用File
类。不幸的是,您需要手动创建临时路径。但这不应该太难。