首页 文章

Jenkins Declarative Pipeline,在slave代理上运行groovy脚本

提问于
浏览
3

我有一个詹金斯声明性管道,我一直在詹金斯大师上运行,它工作正常 . 但是,现在我已经开始尝试在从属节点上执行此操作,在管道中调用的groovy脚本无法访问工作空间中的文件 .

我的jenkinsfile看起来像这样......

pipeline {

agent {
  label {
        label "windows"
        customWorkspace "WS-${env.BRANCH_NAME}"
  }
}

stages {
  stage('InitialSetup') {
   steps {
     "${env.WORKSPACE}/JenkinsScripts/myScript.groovy"
    }
  }
}

我可以在slave上看到它正在创建工作区,从git执行checkout并正确执行脚本 . 但是,如果脚本中的某些内容尝试与工作区中的文件进行交互,则会失败 .

如果我有这样的简单......

def updateFile(String filename) {
  echo env.NODE_NAME
  filename = "${env.WORKSPACE}/path/to/file"
  def myFile = new File(filename)
  <do other things with the file>
}

...它说找不到指定的文件 . 它为我提供了它正在寻找的路径,我可以确认该文件存在,并且代码在构建主服务器时运行 .

为什么脚本在主节点上运行时无法以这种方式找到文件?我将“echo env.NODE_NAME”命令添加到我的groovy文件中,它说脚本正在正确的节点上执行 .

谢谢 .

3 回答

  • 0

    结果Groovy文件命令被认为是不安全的,虽然它们将在主服务器上运行,但不会在从服务器上运行 . 如果从将代理程序设置为另一个节点的脚本中调用它们,它仍然会在主节点上执行命令,而不是代理程序 . 这是一篇文章摘录在这里https://support.cloudbees.com/hc/en-us/articles/230922508-Pipeline-Files-manipulation


    使用File类的操作是在master上运行的,所以只有在master上运行build时才有效,在本例中我创建了一个文件并检查我是否可以在方法存在的节点上访问它,它不存在因为“new”文件(文件)“在主服务器上执行,为了检查这一点我搜索我的主服务器上但不存在于节点中的文件夹”用户“ .

    stage 'file move wrong way'
    
      //it only works on master
      node('slave') {
    
        def ws = pwd()
        def context  = ws + "/testArtifact"
        def file = ws + '/file'
        sh 'touch ' + file
        sh 'ls ' + ws
    
        echo 'File on node : ' + new File(file).exists()
        echo 'Users : ' + new File('/Users').exists()
    
        sh 'mv ' + file + ' ' + context
        sh 'ls ' + ws
      }
    

    要执行文件操作命令,我们建议使用本机命令 .

    这是shell中操作的一个简单示例

    stage 'Create file'
      sh 'touch test.txt'
    
    stage 'download file'
      def out='$(pwd)/download/maven.tgz'
      sh 'mkdir -p ./download'
      sh 'curl -L http://ftp.cixug.es/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -o ' + out
    
    stage 'move/rename'
      def newName = 'mvn.tgz'
      sh 'mkdir -p $(pwd)/other'
      sh 'mv ' + out + ' ' + newName
      sh 'cp ' + newName + ' ' + out
    }
    
  • 6

    要使用从属工作区上的文件,请使用readFile,writeFile,findFiles等步骤 .

    或者如果它们很大,因为FloatingCoder说使用原生工具;这可能是一个groovy脚本 .

  • 1

    解决方法是在Jenkinsfile中通过sh命令加载库 . 所以,如果你在Jenkinsfile中使用:

    sh 'groovy libraryName.groovy'
    

    您可以在本地加载lib,这样就可以在从属节点上存储File .

相关问题