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

Flo*_*der 5 jenkins jenkins-pipeline

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

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

pipeline {

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

stages {
  stage('InitialSetup') {
   steps {
     "${env.WORKSPACE}/JenkinsScripts/myScript.groovy"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以在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>
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Flo*_*der 6

结果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
  }
Run Code Online (Sandbox Code Playgroud)

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

这是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
}
Run Code Online (Sandbox Code Playgroud)