0

我刚刚开始研究与 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'
                    }
                }
            }
}

这一切都因问题顶部的错误而失败,但是当 ssh 到构建服务器时,我可以在指定的位置找到该文件。

我不明白为什么詹金斯找不到它并执行它。

4

1 回答 1

0

问题如下:当使用 javaFile对象时,它总是会引用 Jenkins master 上的某个位置。当然,它通常不能在沙箱内运行。

另一方面,readFileandwriteFile方法总是引用构建代理上的某个路径,该路径由node封装调用的块保留。

长话短说:不要使用File类。不幸的是,您需要手动创建临时路径。但这不应该太难。

于 2018-08-24T07:42:24.367 回答