如何在从属服务器而非主服务器上执行Jenkins共享库函数?

时间:2019-05-06 07:36:07

标签: jenkins shared-libraries

我需要编写一个共享库,该库在构建工作区中读取文件,并且共享库函数无法读取文件,因为管道位于从属服务器上,而共享库则在主服务器中执行。有什么办法可以改变库函数的执行上下文?

3 个答案:

答案 0 :(得分:0)

找出答案。您可以读取库文件并将文件交给writeFile管道步骤

writeFile(file:"foo.groovy", text: libraryResource("bar.groovy"))
"groovy foo.groovy"

writeFile将两个参数都作为命名参数,因此https://issues.jenkins-ci.org/browse/JENKINS-54646中给出的答案并不完全正确。

答案 1 :(得分:0)

您实际上可以在没有writeFile的情况下执行此共享库代码,该代码将在Master中执行,但是它将使用RemoteDignostic执行从属命令 在工作节点上执行uname -a

import hudson.util.RemotingDiagnostics
import jenkins.model.Jenkins


class test_exec{
  def env
  def propertiesFilePath
  @NonCPS
    def call(cmd) {
          def trial_script = """
                   println "uname -a".execute().text
            """.trim()
        String result
  
Jenkins.instance.slaves.find { agent ->
    agent.name == "${env.NODE_NAME}"
}.with { agent ->
    result = RemotingDiagnostics.executeGroovy(trial_script, agent.channel)
}
      return result
}

}

在您的管道中

steps{
println(new test_exec().call())
}

答案 2 :(得分:0)

在 slave 而不是 master 上执行 Jenkins 共享库函数。您可以在调用中实现 de argument node("slaveName") :

def call(Map config=[:], Closure body) {
 
def  label = 'slave'
node("${label}") {  
    
    pipeline { 

            stage('Sonarqube') {
              
                  script {
                  withSonarQubeEnv('Sonar8') {
                    withMaven(maven: 'apache-maven') { 
                            sh 'mvn sonar:sonar -Dmaven.test.skip=true -Dsonar.java.binaries=./target' 
                    }
                  }
                  }
             }//pipeline

} // 调用