我有一个管道作业,它从git存储库加载Jenkinsfile。我的Jenkinsfile看起来像这样:
#!groovy
@Library('global-utils-lib') _
node("mvn") {
stage('build') {
checkout scm
}
stage('merge-request'){
mergeRequest()
}
}
global-utils-lib是从另一个具有以下结构的git仓库加载到全局管道库中的共享库
vars/mergeRequest.groovy
mergeRequest.groovy:
def call() {
sh "ip addr"
def workspacePath = env.WORKSPACE
new File(workspacePath + "/file.txt").text
}
作业针对docker容器(docker plugin)运行。
当我运行这个作业时,正确配置了docker容器并且下载了scm,但是我得到了FileNotFoundException。 看起来共享库中的代码是针对jenkins master而不是slave执行的:
如何针对奴隶运行库代码?我缺少什么?
答案 0 :(得分:3)
尝试执行new File()
之类的操作而不是使用现有的Pipeline步骤通常不是一个好主意。
您的管道脚本由Jenkins主人解释和执行,因此,正如您所看到的,尝试使用File
API并不像您预期的那样工作。
坚持管道步骤有助于确保您的管道是持久的(即幸存重启),可以使用,并且不会阻止执行线程,例如阻止并行步骤工作。
在这种情况下,可以使用现有的readFile
步骤。
我不知道Docker插件与Pipeline的交互程度(虽然我认为它应该是透明的),并且不知道哪些代理有" mvn"标签,或者您是否可以在共享库之外复制它,不清楚为什么您的sh
步骤似乎在主服务器上运行。
Docker Pipeline Plugin是为Pipeline明确设计的,因此可能会产生更好的结果。