Выполнение CURL в разделяемой библиотеке Jenkins Pipeline с использованием `Process` - PullRequest
1 голос
/ 13 июня 2019

У меня есть метод в общей библиотеке в моем конвейере 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.execute для работы?

РЕДАКТИРОВАТЬ

Когда я использую 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 Ответ

1 голос
/ 13 июня 2019

Как объяснено здесь , вам нужно перевести 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}

Как отмечено в вашем последующем вопросе , весь путь должен быть между двойными кавычками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...