我有一个在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