Jenkins共享库上下文

时间:2017-02-17 20:51:12

标签: jenkins jenkins-pipeline

我有一个管道作业,它从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执行的:

  • 提出的IP来自主人
  • 当我将正确的路径传递给主服务器上的scm时,
  • 文件已正确加载

如何针对奴隶运行库代码?我缺少什么?

1 个答案:

答案 0 :(得分:3)

尝试执行new File()之类的操作而不是使用现有的Pipeline步骤通常不是一个好主意。

您的管道脚本由Jenkins主人解释和执行,因此,正如您所看到的,尝试使用File API并不像您预期​​的那样工作。

坚持管道步骤有助于确保您的管道是持久的(即幸存重启),可以使用,并且不会阻止执行线程,例如阻止并行步骤工作。

在这种情况下,可以使用现有的readFile步骤。

我不知道Docker插件与Pipeline的交互程度(虽然我认为它应该是透明的),并且不知道哪些代理有" mvn"标签,或者您是否可以在共享库之外复制它,不清楚为什么您的sh步骤似乎在主服务器上运行。

Docker Pipeline Plugin是为Pipeline明确设计的,因此可能会产生更好的结果。