当前位置: 首页 > 知识库问答 >
问题:

使用“进程”在共享库Jenkins管道中执行CURL

糜野
2023-03-14

我在Jenkins管道的共享库中有一个方法。其想法是使用此库并将文件上载到远程主机。该库导入到单例库中。

import com.package.jobutil.UploadFile

def uploadFunc() {
 def uploader = new UploadFile(this)
 withCredentials ([usernamePassword(credentialsId: 'user', userNameVariable: 'username', passwordVariable:'password)]) {
  uploader.uploadArtifact("${username}", "${password}", file.txt, location)
 }
}

def call() {
 uploadFunc()
}

实例化的类如下所示:

class UploadFile {
   def steps

   UploadFile (steps) {
     this.steps = steps
   }

   pulic uploadArtifct (String user, String password, String file, String location) {
   Process proc
   def cred = "${user}:${pass}"
   def cmd = ["curl", "-v", "-u", cred, "--upload-file", file, location]
   steps.println "CURL: ${cmd}"

   proc = cmd.execute()
  }
}

尽管我在日志中看到了println行。我看不到正在执行curl命令。是否有我缺少的不调用cmd的东西。执行才能工作?

编辑

当我在库中直接使用curl时,它可以工作。

pulic uploadArtifct (String user, String password, String file, String 
  location) {
  def cred = "${user}:${password}"
  def cmd = "curl -v -u ${cred} --upload-file ${file} ${nexusLocation}/${file}"
  try {

  steps.sh cmd
  } catch (Exception e) {
    throw new RuntimeExceptipon("Cannot execute curl, exception: [${e.getClass().getName()} - '${e.getMessage()}']")
   }
  }

但是,当尝试使用Process时,它不起作用。

pulic uploadArtifct (String user, String password, String file, String 
  location) {
  def cred = "${user}:${password}"
  def cmd = ["curl", "-v", "-u", cred, "--upload-file", ${file}, ${location}]
  try {
   def sout = new StringBuffer(), serr = new StringBuffer()
   def proc = cmd.execute()
   proc.consumeProcessOutput(sout, serr)
   proc.waitForOrKill(1000)
   println sout
  } catch (Exception e) {
    throw new RuntimeExceptipon("Cannot execute curl, exception: [${e.getClass().getName()} - '${e.getMessage()}']")
   }
  }

我得到的例外是:

java.lang.RuntimeException: Cannot execute curl, exception: [groovy.lang.MissingMethodException - 'No signature of method: java.lang.String.div() is applicable for argument types: (org.codehaus.groovy.runtime.GStringImpl) values: [file.txt]

共有1个答案

须巴英
2023-03-14

正如这里所解释的,您需要捕获stdout/stderr来查看任何内容。

至少:

def outputStream = new StringBuffer();
proc.waitForProcessOutput(outputStream, System.err)
//proc.waitForProcessOutput(System.out, System.err)

或者,如本要点所述:

def sout = new StringBuffer(), serr = new StringBuffer()
def proc = cmd.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println sout

阻塞调用的一个示例是:

println new ProcessBuilder( 'sh', '-c', 'du -h --max-depth=1 /var/foo/bar/folder\\ with\\ spaces | sort -hr').redirectErrorStream(true).start().text
def cmd = ["curl", "-v", "-u", cred, "--upload-file", ${file}, ${location}/${file}]
No signature of method: java.lang.String.div() is applicable for argument types: (org.codehaus.groovy.runtime.GStringImpl) values: [file.txt]

${location}/${file}”中的“/”被解释为“/div)操作,而不是字符串。

尝试使用curl命令参数:

${location}+"/"+${file}

正如您在随后的问题中指出的,all路径需要在双引号之间。

 类似资料:
  • 问题内容: 我在Jenkins管道的共享库中有一个方法。想法是使用该库并将文件上传到远程主机。该库将导入到单例库中。 实例化的类如下所示: 即使我在日志中看到该行。我看不到命令正在执行。我缺少某种无法调用的功能吗? 编辑 当我直接在库中使用时,它可以工作。 但是,尝试使用时不起作用。 我得到的异常是: 问题答案: 如此处所述,您需要捕获stdout / stderr才能 _看到_任何内容。 至少:

  • 我将我的Jenkins Pipeline存储为Jenkins共享库中的Groovy脚本。我想为不同的工作使用不同的版本。我的共享库脚本称为如下: 我已将sharedLib repo中的不同版本标记为。万一我想用v1。0,我用注释引用了它,如下所示。 在我的工作中,我通过调用groovy脚本访问了共享库,并使用了上面的注释,如图所示: 我运行这项工作时出错了。以下是我看到的错误。 当我使用。我哪里出

  • 我们试图切换到jenkins管道,但我在groovy/java的低水平阻止了我们建立一个共享库。 这里是我的共享库(位于bitbucket中git repo的{root}/src/com/pipeline.groovy中)我必须承认,我在这里做什么都不知道,因为我不知道包裹的定义 Jenkins的管道看起来 通过所有这些设置,我最终得到了错误: 我怀疑我的漂亮包裹的定义,但我坚持这样做。 非常欢迎

  • 问题内容: 我正在尝试将文件从本地目录上传到远程目录。我有一个为此编写的Groovy库。 但是,以上操作失败并显示以下错误: 如何确保文件设置正确?也就是方法正确吗? 问题答案: 该错误信息 该路径在.jtl文件路径之前需要一个“ at”()符号 在您的情况下,双引号可能会丢失。

  • 由于我无法访问组织中的“管理Jenkins”菜单,我无法在“管理Jenkins”中的“全局管道库”中配置共享库。 没有在Manage Jenkins中进行配置,是否有其他方法实现此功能? (或) 是否可以通过管道脚本配置“全球管道库”部分,而不管访问权限如何? 如果可能,请您在答案中共享一些代码片段。

  • 问题内容: 詹金斯版 2.89.4workflow -cps ver 2.42 当我尝试运行加载库的管道时,出现以下异常: 引用链接的Groovy类: 您可以像这样在管道或库中重现异常: 问题答案: 这是一个已知的詹金斯问题:JENKINS-45901 自2017年8月以来已开放。看起来很快不会修复: 不知道是否有详尽的文档记录了Groovy语言支持(或缺乏它),但是无论如何我都不会期望这个问题或