一尘不染

Jenkins声明式管道,在从属代理上运行groovy脚本

jenkins

我有一个在Jenkins主服务器上运行过的Jenkins声明式管道,并且运行良好。但是,既然我已经尝试在从属节点上执行此操作,则在管道中调用的常规脚本无法访问工作空间中的文件。

我的jenkinsfile看起来像这样…

pipeline {

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

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

我可以在从站上看到它正在创建工作区,从git进行检出并正确执行脚本。但是,如果脚本中的某些内容尝试与工作空间中的文件进行交互,它将失败。

如果我有这样简单的事情…

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>
}

…它说找不到指定的文件。它为我提供了它正在寻找的路径,并且我可以确认该文件存在,并且该代码仅在主数据库上构建时运行。

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

谢谢。


阅读 287

收藏
2020-07-25

共1个答案

一尘不染

原来,Groovy
File命令被认为是不安全的,尽管它们将在主服务器上运行,但不会在从属服务器上运行。如果您从将代理设置为另一个节点的脚本中调用它们,它将仍然可以在主节点上而不是在代理上执行命令。这是文章发布的摘录https://support.cloudbees.com/hc/en-
us/articles/230922508-Pipeline-Files-
manipulation


File类的操作在master上运行,因此仅当build在master上运行时才起作用,在此示例中,我创建了一个文件,并检查是否可以在存在方法的节点上访问它,该文件不存在,因为new File(file)在主机,要对此进行检查,我将搜索Users主机上存在但节点中不存在的文件夹。

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
}
2020-07-25