当前位置: 首页 > 面试题库 >

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

屈星腾
2023-03-14
问题内容

我有一个在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”命令,它说脚本正在正确的节点上执行。

谢谢。


问题答案:

原来,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
}


 类似资料:
  • 我有一个Jenkins声明性管道,我一直在Jenkins master上运行,它工作得很好。但是,现在我已经开始尝试在从属节点上执行此操作,管道中调用的groovy脚本无法访问工作区中的文件。 我的文件看起来像这样。。。 我可以在从机上看到它正在创建工作区,从git执行签出,并正确执行脚本。但是,如果脚本中的某些内容尝试与工作区中的文件交互,则会失败。 如果我有像这样简单的东西... ...它说找

  • 问题内容: 我正在尝试将旧样式的基于项目的工作流转换为基于Jenkins的管道。在浏览文档时,我发现有两种不同的语法分别命名为和。例如最近(2016年底)发布的Jenkins网络语法。尽管有一个新的语法版本,Jenkins仍然也支持脚本语法。 现在,我不确定这两种类型的哪种情况最合适。语法将很快被弃用吗?詹金斯管道的未来会是这样吗? 任何可以分享有关这两种语法类型的想法的人。 问题答案: 最初创建

  • 当我在jenkins中运行多分支管道代码时,我收到以下的以下错误: java.lang.NoSuchMethodError:在步骤中找不到这样的DSL方法“管道”[archive,bat,build,catchError,checkout,deleteDir,dir,echo,emailext,EmailExtrecients,error,fileExists,getContext,git,inp

  • 我查看了以下文档:https://docs.sonarqube.org/display/scan/analysy+with+sonarqube+scanner+for+jenkins 然而,我不能让它工作。首先,文档似乎需要更新,因为示例中的语法是错误的。在最新版本的声明性管道中,在-tag中是必需的。此外,-关键字只有在-标记中才会解析。 null

  • 问题内容: Jenkins声明性管道中的参数可以动态吗? 我希望选择选项值在运行时由函数填充。以下代码确实生成了选项列表,但它们似乎过时了- 可能是在我第一次运行此代码时生成的。如果AMI列表更改,则选择将保持不变。我希望每次选择都运行此命令。 EDIT 我最终使用,带有扩展选择参数。目前它不支持该参数,因此我对其进行了修改https://review.openstack.org/#q,I0c6a

  • 问题内容: 我正在为自动化测试添加jenkins声明性管道。在测试运行阶段,我想从日志中提取失败的测试。我正在使用Groovy函数提取测试结果。此功能不是詹金斯管道的一部分。这是另一个脚本文件。该函数运行良好,并构建了一个包含故障详细信息的字符串。在管道阶段内,我正在调用此函数并将返回的字符串分配给另一个变量。但是,当我回显变量值时,它会打印出空字符串。 在这里’sh’echo $ {result