Jenkins管道:在加载外部Jenkins管道脚本时重用工作区

时间:2016-05-13 11:54:43

标签: workspace jenkins-workflow jenkins-pipeline

我有以下用例:

  1. 使用书面管道脚本来签出/拉出某个Git修订版 (我需要这个,因为我动态检索修订版)

  2. 从该修订版中,加载Jenkins-pipeline文件,该文件位于先前签出的文件中

  3. 此文件将依赖于同一检出的修订版本中的文件 (因此,来自相同的工作区)

  4. 问题:加载的Jenkins-pipeline文件在 new 工作区中执行。但它是空的。我需要该文件在相同的旧工作区中执行。

    我想,也许是因为周围的node,因为node关键字会创建工作区,如文档中所述。但当我试图将加载到 node之外时,Jenkins因为“离开沙箱”而禁止使用它。

    注意:找到jenkins-pipeline-file并且真正执行。在执行期间,问题是

    请查看示例代码:

    内联管道脚本

    node('master') {
      def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt'
    
      checkout poll:false,
       scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]],
       doGenerateSubmoduleConfigurations:false,
       extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[],
        userRemoteConfigs:[[credentialsId:'...', url:'...']]]
    
      load 'further-script-logic.jenkins'
    }
    

    文件:Further-script-logic.jenkins

    node('master') {
       // make use of certain files
       // assumption: pwd() is the *same* workspace which were checked-out before
       // problem: it's not, it's a new empty workspace
    }
    

1 个答案:

答案 0 :(得分:2)

一种解决方法是 described here

  1. 您必须在来电者脚本
  2. 的末尾使用{...}()个大括号
  3. 您必须重写调用脚本以返回闭包(lambda)
    {-> /* former code */ }
  4. 这样,你就不会放弃"程序流程控制到执行的脚本。相反,你使用它返回的闭包和"自己调用它#34;。这可以防止Jenkins创建更多工作区。

    可悲的是,我不知道,这个解决方案是否允许在调用者脚本和/或被调用脚本中声明多个节点。

    我已将这些更改合并到您的示例代码中 查找标有"<--- CHANGE"的行。

    内联管道脚本

    node('master') {
      def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt'
    
      checkout poll:false,
       scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]],
       doGenerateSubmoduleConfigurations:false,
       extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[],
        userRemoteConfigs:[[credentialsId:'...', url:'...']]]
    
      load 'further-script-logic.jenkins'
    }()   // <--- CHANGE 1
    

    文件:Further-script-logic.jenkins

    {->   // <--- CHANGE 2
      node('master') {
        // .....
      }
    }